目录
Eureka
介绍
角色
实现流程
单机构建
注册中心
服务提供者
服务消费者
集群搭建
注册中心
服务提供者
自我保护机制
原理分析
Eureka
介绍
Eureka是spring cloud中的一个负责服务注册与发现的组件,本身是基于REST的服务,同时还提供了负载均衡、故障转移等能力。
角色
分为3个角色:服务中心、服务提供者、服务消费者
Eureka Server:服务器端,它提供了服务的注册和发现功能,即实现服务的治理。
Eureka Provider:服务提供者,它将自身服务注册到服务中心,以便“服务消费者”能通过服务器端提供的服务清单来调用它。
Eureka Consumer:服务消费者,它从Eureka获取“已注册的服务列表”,消费服务
实现流程
1.搭建一个Eureka Server作为服务注册中心
2.服务提供者启动时,把当前服务器的信息以服务名的方式注册到服务注册中心
3.服务消费者启动时,把当前服务注册到服务注册中心
4.服务消费者会获取一份可用服务列表,该列表包含了所有注册到服务注册中心的服务信息(包含服务提供者和自身的消息)
5.在获得了可用服务列表后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务
服务注册中心(Eureka Server)所扮演的角色十分重要,它是服务提供者和服务消费者之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用,而服务消费者也只有通过服务注册中心获取可用服务列表后,才能调用所需的服务
单机构建
注册中心
搭建一个Eureka Server作为服务注册中心
1.在pom文件中添加Eureka Server依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.在application.yml中添加配置
server:port: 7001 #端口
# 单机版
eureka:instance:hostname: localhost #eureka服务端的实例名字 单机服务名称client:register-with-eureka: false #表示不向注册中心注册自己fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机服务地址
3.启动类上添加注释
在启动类上添加 @EnableEurekaServer 注解
4.启动
访问 http://localhost:7001
服务提供者
1.在pom文件中添加Eureka client依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.在application.yml中添加配置
server:port: 8001 #端口
eureka:client:register-with-eureka: true #是否向注册中心注册自己fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为trueservice-url:# 设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://localhost:7001/eureka #单机版instance:instance-id: cloud-provider-payment8001prefer-ip-address: true #访问路径可以显示IP地址 鼠标悬停服务,右下角可以看到ip
3.启动类上添加注释
启动类上添加@EnableEurekaClient**注解
服务消费者
1.在pom文件中添加Eureka client依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.在application.yml中添加配置
server:port: 80
spring:application:name: cloud-order- service
eureka:client:register-with-eureka: true #是否向注册中心注册自己fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为trueinstance:instance-id: cloud-consumer-order80prefer-ip-address: true #访问路径可以显示IP地址service-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://localhost:7001/eureka #单机版
3.创建RestTemplate
@Configuration
public class ApplicationContextConfig {@Bean@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力public RestTemplate getRestTemplate() {return new RestTemplate();}
}
4.先将注册中心启动,再启动服务提供者
5.创建测试类,使用RestTemplate进行测试
public class OrderController {//单机情况下,直接ip加地址public static final String PAYMENT_URL = "http://localhost:8001";@Resourceprivate RestTemplate restTemplate;@GetMapping("/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);}
}
6.浏览器访问
集群搭建
注册中心
两个注册中心的配置都差不多,区别就是端口、hostname、defaultZone属性值不一样。
现在是模拟的是2台机器做在集群,需要在defaultZone修改,让两台机器相互注册。
7001的defaultZone就应该是:defaultZone: http://eureka7002.com:7002/eureka/
7002的defaultZone就应该是:defaultZone: http://eureka7001.com:7001/eureka/
server:port: 7001
#集群版
eureka:instance:hostname: eureka7001.com #eureka服务端的实例名字client:register-with-eureka: false #表示不向注册中心注册自己fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7002.com:7002/eureka/ #这个是集群版开启 互相注册
服务提供者
修改配置文件,同时注册进两个注册中心:
server:port: 8001
eureka:client:register-with-eureka: true #是否向注册中心注册自己fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为trueservice-url:# 设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版instance:instance-id: cloud-provider-payment8001prefer-ip-address: true #访问路径可以显示IP地址 鼠标悬停服务,右下角可以看到ip
自我保护机制
当我们在本地调试基于 Eureka 的程序时,Eureka 服务注册中心很有可能会出现如下图所示的红色警告,这个警告是触发了 Eureka 的自我保护机制而出现的
默认情况下,如果注册中心在90秒内没有接收到某个服务提供者的心跳,就会将这个服务提供者提供的服务从服务注册表中移除,这样消费者就无法获取到该服务,更无法调用该服务。
实际情况中,服务提供者可能会出于网络故障而无法与注册中心正常通信。若此时注册中心因为没有接收心跳而误将健康的服务从服务列表中移除,这显然是不合理的。而 Eureka 的自我保护机制就是来解决此问题的。
Eureka 的自我保护机制:其中心思想就是,如果注册中心在一段时间内没有接收到服务提供者的心跳,那么注册中心就会开启自我保护模式,将所有的服务提供者的注册信息保护起来,而不是直接从服务注册表中移除。一旦网络恢复,这些服务提供者提供的服务还可以继续被服务消费者消费。
默认情况下,Eureka 的自我保护机制是开启的,如果想要关闭,则需要在配置文件中添加以下配置:
eureka:server:enable-self-preservation: false # false 关闭 Eureka 的自我保护机制,默认是开启,一般不建议大家修改
原理分析
1.当启动eurake客户端应用,比如上面说到的会员服务member,会把当前服务比如服务地址和端口以别名的注册到注册中心
2.当服务消费者比如上面说到的order订单服务,在接口调用的时候,使用服务别名也就是service id去注册中心获取实际的rpc远程调用地址
3. 服务消费者在获取到实际的rpc远程调用地址后,在本地使用HttpClient技术调用远程接口
流程图如下: