概述
Eureka是SpringCloud的注册中心。
是一款基于REST的服务治理框架,用于实现微服务架构中的服务发现和负载均衡。
在Eureka体系中,有两种角色: 服务提供者和服务消费者。
服务提供者将自己注册到Eureka服务器,服务消费者从Eureka服务器中获取可用的服务列表,并根据负载均衡算法选择其中一个来调用。
特点
-
高可用性:Eureka服务器采用了分布式架构,可以通过集群搭建来实现高可用性,同时也支持自我保护机制,即当Eureka服务器在一段时间内无法与客户端通信时,不会立即清理服务注册表中的信息,而是将其保护起来,以防止因网络问题导致的误删。
-
易于扩展:Eureka支持通过集群方式进行扩展,只需要增加新的Eureka服务器节点即可。
-
支持多种语言和框架:Eureka是基于REST实现的,因此可以支持多种语言和框架,只需要遵循它的API规范即可。
-
灵活的配置:Eureka提供了大量可配置项,如心跳间隔、注册信息缓存时间等,可以根据实际情况进行配置。
-
易于使用:Eureka提供了Java客户端库,可以方便地进行服务注册和发现,并且与Spring Cloud等框架集成良好。
结构和作用
-
注册服务信息
服务提供者的服务实例启动后,将自己的信息注册到Eureka-server(Eureka服务端)
eureka-server保存服务名称到服务实例地址列表的映射关系 -
服务发现/服务拉取
服务消费者根据服务名称,拉去实例地址列表 -
负载均衡
服务消费者从实例列表中利用负载均衡算法选中一个实例地址 -
远程调用
服务消费者向实例地址发起远程调用 -
心跳续约
- 服务提供者实例会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
- 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
- 服务消费者拉取服务时,就能将故障实例排除了
注意:一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端
实现Eureka
- 创建eureka-server服务
新建模块,并在spring initialize中选择Eureka Server的依赖
可以看到在新建模块的依赖中加入了
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
-
在Eureka的启动类上加上@EnableEurekaServer注解
开启eureka的注册中心功能 -
编写配置文件
编写一个application.yml文件,内容如下:
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
-
启动服务并访问
http://127.0.0.1:10086
如上页面表示成功 -
服务注册
在对应服务的pom.xml中引入eureka-client依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 修改服务的配置文件
添加服务名称和eureka地址
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
-
启动多个服务实例
复制配置,并且为服务修改名称
在配置中需要修改配置中的端口号,就需要使用覆盖配置
勾选允许多个实例
启动多个服务实例后,可在该服务的空间中看到服务空间中数量增多,并且占用2个端口号
-
服务发现
服务发现、服务注册统一封装在eureka-client依赖中,所以同样注入该依赖即可
同样需要修改配置文件,同样是服务名称和注册中心地址
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
- 服务拉取和负载均衡
从服务注册中心eureka-server中拉去服务的实力列表并实现负载均衡
需要在服务消费者的启动类上的RestTemplate这个Bean添加@LoadBalanced
注解
然后在对应服务中将restTemplate的url中的ip:port改为服务名即可
spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。
示例:
将http://localhost:8081/user/
改为http://userservice/user/
注意:能将ip:port改为服务名称只是因为LoadBalancerInterceptor对RestTemplate的请求进行拦截,从Eureka根据服务id获取服务列表,利用负载均衡算法得到真实的服务地址信息,替换服务id