目录
一、Eureka介绍
在微服务中,随着系统水平扩展的越来越多,系统拆分为微服务的数量也会相应增加,那么管理和获取这些微服务的URL就会变得十分棘手,如果手动管理微服务,每次新增/ 修改一个微服务,就要在其它用到此微服务的地方手动加上/修改 它的URL地址或者其他通信协议的地址,这样工作量巨大而且会经常出错,一旦某个微服务的地址发生了变化,就要手动修改所有引用它的微服务的配置文件。所以spring-cloud eureka server就是为了解决这样的问题而出现,经过简单的配置,即可自动注册和发现微服务。
可以分为Eureka服务端和Eureka客户端,Eureka服务端即服务注册中心。Eureka客户端包含两个角色:服务提供者和服务消费者。Eureka的主要功能是服务治理。所有的微服务在使用过程中会向Eureka进行注册,而后客户端利用Eureka获取服务的信息(即服务的发现)。
二、服务注册中心Server
管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。
功能
- 服务提供者信息同步
- 失效剔除
- 自我保护
- 服务信息同步:
当服务提供者将自己的信息注册给某个注册中心,该注册中心就会将此服务信息同步到集群中的其他注册中心上,从而实现注册中心间的服务同步。
- 失效剔除:
服务提供者正常下线时,会发送下线通知给注册中心,注册中心能正常处理这种情况。如果服务非正常下线的话,注册中心又该如何处理呢?Eureka Server在启动的时候会创建一个定时任务每分钟扫描一篇服务清单,如果发现有服务超过90秒没有发送过心跳就将该服务信息剔除出去。
- 自我保护:
然而失效剔除的时候,有可能会因网络故障接收不到某些微服务实例心跳,从而将正常微服务注销 ,这时候需要自我保护机制。
默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。该情况下Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
三、服务提供者
功能
- 注册服务
- 续约
- 服务下线通知
- 注册服务
这里是client的注册
- 续约
服务注册完之后,服务提供者和Eureka注册中心之间会维持心跳来告知注册中心,服务还活着。我们把该操作称为服务续约(Renew),下列两个配置和续约有关:
eureka:
instance:
lease-renewal-interval-in-seconds: 30 #每30秒会向Eureka Server发起Renew操作
lease-expiration-duration-in-seconds: 90 #服务失效时间。默认是90秒,也就是如果Eureka Server在90秒内没有接收到来自Service Provider的Renew操作,就会把Service Provider剔除。
- 服务下线
当服务提供者进行正常的关闭操作时,会触发一个服务下线的REST请求给Eureka注册中心。Eureka服务端在收到请求之后,将该服务状态设置为下线(DOWN),并把该线下通知广播出去。
四、服务消费者
功能
- 获取服务列表
- 调用服务
- 服务发现,获取服务列表
在Eureka的客户端程序中注入DiscoveryClient类,借助该类可以帮助我们自动获取服务的列表信息
@Autowired
private DiscoveryClient client ; // 进行Eureka的发现服务
@RequestMapping("/discover")
public Object discover() { // 直接返回发现服务信息
return this.client ;
}
- 调用服务
服务消费者通过服务标识符获取具体的服务提供者信息,由服务消费者自己决定具体调用哪个服务提供者。所以服务消费者通常要维护负载均衡算法,在SpringCloud中提供了Ribbon组件进行客户端的负载调度。
五、搭建简单的单机版Eureka
Eureka官方没有提供单独的安装包来运行。我们需将Eureka的依赖引入单独的工程中,然后部署运行该工程即可将Eureka的服务启动起来。spring cloud已经帮我实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。
(1)引入相关依赖
<artifactId>spring-cloud-starter-eureka-server</artifactId>
(2)配置文件application.yml中加入Eureka相关的配置
eureka:
instance: # eureak实例定义
hostname: 127.0.0.1 # 定义Eureka实例所在的主机名称
(3)在启动类中加入@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer // 启动Eureka服务
public class Eureka_7001_StartSpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(Eureka_7001_StartSpringCloudApplication.class,args);
}
(4)启动应用,打开浏览器访问http://127.0.0.1:7001/,成功则出现spring Eureka界面