Eureka 简介
Eureka 是 Spring Cloud Netflix 的一个子模块,也是核心模块之一,用于云端服务发现,是一个
基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

为什么要用 Eureka
在传统架构中,当调用 API 或者发起网络通信的时候,我们需要知道被调用方的 IP、端口
号,大部分情况是通过域名和服务端口,事实上基于 DNS 的服务发现,而这种 DNS 方式,通
常都是通过 nginx 或者其他代理软件实现的,因为物理机器的 ip 和端口号通常都是固定的,
所以 nginx 中的配置信息也是固定的,服务列表需要通过手动去刷新,随着后台复杂度的增
加,后台服务也越来越多,手动刷新的方式效率低而且容易出错,当后台发生故障时,处理
也会变得很麻烦。
在微服务架构中,尤其是使用了 Docker 等虚拟化技术的微服务,其 IP 和 port 都是动态分配
的,服务实例数也是动态变化的,那么就需要精细而准确的服务发现机制。当你有一个新的
服务运行后,服务中心可以感知到,然后把它加添加到服务列表里,然后当它死掉后,会从
服务中心移除,而作为一个服务,对其它服务公开的只是服务名称,而不是最终的服务地址
URL,这对于云平台容器化架构来说是非常重要的。

Eureka 原理

一个服务实例被启动时,它的网络地址会被写到注册表上;当服务实例终止时,再从注册表
中删除。这个服务实例的注册表通过心跳机制动态刷新。
Netflix OSS 提供了一个客户端服务发现的好例子。Netflix Eureka 是一个服务注册表,提供了
REST API 用来管理服务实例的注册和查询可用的实例。Netflix Ribbon 是一个 IPC 客户端,和
Eureka 一起处理可用服务实例的负载均衡。

Eureka 架构

• Eureka Server: 注册中心
  服务都注册在哪里,哪里就可称为 Eureka Server
• Eureka Client
  注册在注册中心可以是服务的提供者(Applicaton Service)或者服务的消费者
     (Application Client),这两类都被称为 Eureka client
• Application Service:服务提供者
• Application Client:服务消费者
• Register:服务注册
  当 Eureka 客户端向 Eureka Server 注册时,会向 Eurekaserver 注册自己的信息(比如 IP,
  端口,微服务名等),Eureka Server 会存储这些信息。
• Renew:服务续约
  微服务启动后,会周期性(默认 30 秒)地向 Eureka Server 发送心跳。如果 Eureka Server
  在一定时间内没有接收到某个微服务实例的心跳,Eureka Server 将会注销该实例(默认 90
  秒)
• Cancel:服务下线
  Eureka Client 在程序关闭时向 Eureka Server 发送取消请求。 发送请求后,该客户端实例
  信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:
  DiscoveryManager.getInstance().shutdownComponent()

Eureka 特点

  1. Eureka Client 会缓存服务注册表中的信息,并将其缓存在本地,该注册列表信息定期
(默认 30 秒)更新一次,因此微服务无须每次请求都查询 Eureka Server,从而降低了 Eureka
Server 的压力;其次,当注册中心挂了,客户端之间依然可以通过缓存中的信息进行调用;
注册中心重启后,客户端会继续注册进来。
  2.当服务提供者挂了,在关闭自我保护的情况下,注册中心在规定时间(默认是 60s)内
移除客户端。
  3.自我保护,当一个新的 Eureka Server 出现时,它尝试从相邻节点获取所有实例注册表信
息。如果从 Peer 节点获取信息时出现问题,Eureka Serve 会尝试其他的 Peer 节点。如果服务
器能够成功获取所有实例,则根据该信息设置应该接收的更新阈值。如果有任何时间,
Eureka Serve 接收到的续约低于为该值配置的百分比(默认为 15 分钟内低于 85%),则服务
器开启自我保护模式,即不再剔除注册列表的信息。  

Eureka 实践作业

服务注册中心

1. 在 IDEA 中创建一个 Spring Cloud 工程,引入 Eureka-Server 包,pom 文件整体如下:

  

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>demo</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project> 2. application.yml 配置(切记变量与值要换行写)
# 单例模式启动 Eureka Server
server:
port: # 启动端口
eureka:
client:
registerWithEureka: false #false: 不作为一个客户端注册到注册中心
fetchRegistry: false # 此客户端是否获取 eureka 服务器注册表上的注册信息
serviceUrl:
defaultZone: http://localhost:8761/eureka

  配置解释:
  • registerWithEureka:表示是否将自己注册到 Eureka Server,默认为 true。由于当前应用
    就是 Eureka Server,故而设置为 false。
  • fetchRegistry:表示是否从 Eureka Server 获取注册信息,默认为 true。因为这是一个单
         点的 Eureka Server,不需要同步其他的 Eureka Server 节点的数据,故而设置为 false。
  • defalseZone:设置与 Eureka Server 交互的地址,查询服务和注册服务都需要依赖这个地
         址。

3. 编写启动类,在启动类上添加@EnableEurekaServer 注解,声明这是一个 Eureka Server。

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer
@SpringBootApplication
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
4. 访问 http://localhost:8761/,如下图所示:
将微服务注册到 Eureka Server 上
1. 在 IDEA 中创建一个 Spring Cloud 工程,pom 文件整体如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.eureka</groupId>
<artifactId>applicaton-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project> 2. application.yml 配置
# HTTP (Tomcat) port
server:
port:
spring:
application:
name: micro-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/

3. 编写启动类,在启动类上添加@SpringBootApplication @EnableDiscoveryClient 注解,声明这
是一个 Eureka Client。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication
@EnableDiscoveryClient
public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args);
}
}

4. 启动后,重新访问 http://localhost:8761/(不要关闭上一个启动的服务),如下图所示,我们可以看到刚刚启动的服务已经
注册到我们的服务注册中心中。

注:如出现一行红色大字(比如再次启动服务时的情况下)  如下图

这是一种自我保护机制。Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。




 

微服务之服务中心—Eureka的更多相关文章

  1. 将微服务注册到Eureka Server

    一.微服务程序编写 1.在已写好的微服务程序中添加pom依赖: <dependency> <groupId>org.springframework.cloud</grou ...

  2. SpringCloud系列三:将微服务注册到Eureka Server上

    1. 回顾 通过上篇博客的讲解,我们知道硬编码提供者地址的方式有不少问题.要想解决这些问题,服务消费者需要一个强大的服务发现机制,服务消费者使用这种机制获取服务提供者的网络信息.不仅如此,即使服务提供 ...

  3. spring cloud之docker微服务客户端注册eureka问题

    正常我们起一个微服务注册到eureka他的实例id是默认这样的主机名称:服务名称:服务端口号, 如果配置eureka.instance.prefer-ip-address=true则实例id为主机Ip ...

  4. 【一起学源码-微服务】Nexflix Eureka 源码十:服务下线及实例摘除,一个client下线到底多久才会被其他实例感知?

    前言 前情回顾 上一讲我们讲了 client端向server端发送心跳检查,也是默认每30钟发送一次,server端接收后会更新注册表的一个时间戳属性,然后一次心跳(续约)也就完成了. 本讲目录 这一 ...

  5. 【一起学源码-微服务】Nexflix Eureka 源码十三:Eureka源码解读完结撒花篇~!

    前言 想说的话 [一起学源码-微服务-Netflix Eureka]专栏到这里就已经全部结束了. 实话实说,从最开始Eureka Server和Eureka Client初始化的流程还是一脸闷逼,到现 ...

  6. 2021升级版微服务教程3—Eureka完全使用指南

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 默认文件1610014380163 教程全目录「含视 ...

  7. Spring Cloud之微服务注册到Eureka Server集群

    在Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼ - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中已经搭建好了Eureka Server集群,本文就利用 ...

  8. 微服务架构:Eureka集群搭建

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 服务注册.发现是微服务架构的关键原理之一,由于微服务架构是由一系列职责单一的细粒度服务构成的网状结构,服务之间通过轻量机制进行通信,这就必 ...

  9. 微服务架构:Eureka参数配置项详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Eureka涉及到的参数配置项数量众多,它的很多功能都是通过参数配置来实现的,了解这些参数的含义有助于我们更好的应用Eureka的各种功能 ...

随机推荐

  1. 网络中的NAT模式

    一.概述 NAT英文全称是"Network Address Translation",中文意思是"网络地址转换",它是一个IETF(Internet Engin ...

  2. MVC Remote 服务器验证

    用此验证必须在Controller中编写返回值为JsonResult的Action public JsonResult CheckUserName(string UserName) { EFHelpe ...

  3. 我的第一个python web开发框架(24)——系统重构与ORM

    小白弄完代码版本管理和接口文档后,兴奋的找到老菜. 小白:老大,我已经按你讲的要求,将代码版本管理和接口文档都搞好了.从项目开始到现在,除了代码编写,感觉学会好多东西啊. 老菜:嗯嗯,实战确实需要掌握 ...

  4. web框架。Django--

    一,DIY一个web框架 1.1什么是web框架 1.2用socket模拟B-S的服务端 1.3,浏览器端的network查看 1.4,request格式 1.5,response格式 1.6,初识w ...

  5. gradlew和gradle的区别

    概念理解 gradlew就是对gradle的包装和配置,gradlew是gradle Wrapper,Wrapper的意思就是包装. 因为不是每个人的电脑中都安装了gradle,也不一定安装的版本是要 ...

  6. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  7. Linux-基础学习(二)-基本部署

    开始今日份整理 1. 系统优化部分 1.1 Linux防火墙安全相关(重要) 1.1.1 SELinux功能 SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA ...

  8. 正益移动推出新产品正益工作 实现PaaS+SaaS新组合

    近期,正益移动不仅将其AppCan 移动平台云化,还通过发布全新 SaaS 产品 -- 正益工作,这款集合了企业信息聚合.应用聚合.社交聚合为一体的企业移动综合门户,与 AppCan 平台一起实现了P ...

  9. exgcd

    int exgcd(int a,int b,int &x,int &y){ if (b==0){ x=1,y=0; return a; } int d=exgcd(b,a%b,y,x) ...

  10. go笔记-限速器(limiter)

    参考: https://blog.csdn.net/wdy_yx/article/details/73849713https://www.jianshu.com/p/1ecb513f7632 http ...