前言
什么是服务治理
Spring Cloud封装了Netfilx公司开发的Eureka模块来实现服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务注册与发现。
什么是服务治理
Eureka采用了CS的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册于发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))。
项目地址
来源:尚硅谷spring cloud2020
项目地址:https://github.com/raineddown/spring-cloud-demo
Eureka系统架构与Dubbo架构对比
Eureka的两个组件:Eureka Server和Eureka Client
依赖:
1 2 3 4
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
|
1 2 3 4
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
|
相关注解
Eureka单体demo
项目地址:https://github.com/raineddown/spring-cloud-demo
涉及服务:cloud-api-commons、cloud-provider-payment8001、cloud-consumer-order80、cloud-eureka-server7001
集群版eureka
涉及服务:cloud-api-commons、cloud-provider-payment8001、cloud-consumer-order80、cloud-eureka-server7001
1 2 3 4
| 就是pay模块启动时,注册自己,并且自身信息也放入eureka 2.order模块,首先也注册自己,放入信息,当要调用pay时,先从eureka拿到pay的调用地址 3.通过HttpClient调用 并且还会缓存一份到本地,每30秒更新一次
|
集群构建原理:
互相注册
EurekaServer端(互相注册)
服务1配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13
| server: port: 7001
eureka: instance: hostname: eureka7001.com client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://eureka7002.com:7002/eureka/ 这个是集群版开启 互相注册
|
服务2配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13
| server: port: 7002
eureka: instance: hostname: eureka7002.com client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://eureka7001.com:7001/eureka/
|
EurekaClient端
注意:服务的消费者端,即向注册中心发现服务地址端的RestTemplate需添加@LoadBalanced注解保证负载均衡以使用集群中多个服务中的一个。
1 2 3 4 5 6 7 8 9 10 11 12
| @Configuration public class ApplicationContextConfig {
@Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
|
PAYMENT_URL 为服务消费者在注册中心找到服务提供者的服务名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @RestController @RequestMapping("consumer") public class OrderController {
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@Resource private RestTemplate restTemplate;
@PostMapping("/payment/create") public CommonResult<Payment> create(@RequestBody Payment payment) { return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
|
相关配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| server: port: 8001
spring: application: name: cloud-payment-service
eureka: client: register-with-eureka: true fetchRegistry: true service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka instance: instance-id: payment8001 prefer-ip-address: true
|
Eureka自我保护
设置接受心跳时间间隔
客户端(比如pay模块):
上图表示每隔一秒Eureka客户端向服务端发送心跳,2秒后无心跳剔除服务注册中心
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| eureka: instance: hostname: eureka7001.com client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://eureka7001.com:7001/eureka/
server:
enable-self-preservation: false eviction-interval-timer-in-ms: 2000
|
上面配置表示关闭Eureka自我保护机制
此时启动erueka和pay.此时如果直接关闭了pay,那么erueka会直接删除其注册信息
注意:Eureka2.0已停止更新,见网址https://github.com/Netflix/eureka/wiki
附:服务发现DiscoveryClient
1
| org.springframework.cloud.client.discovery.DiscoveryClient
|
This is copyright.