微服务:整合 Spring Cloud Eureka - 服务治理机制
目录
微服务:整合 Spring Cloud Eureka - 注册中心 Eureka Server
微服务:整合 Spring Cloud Eureka - 服务注册 Eureka Client
微服务:整合 Spring Cloud Eureka - 服务发现 DiscoveryClient
微服务:整合 Spring Cloud Eureka - 服务消费以及Ribbon简单使用
微服务:整合 Spring Cloud Eureka - 高可用集群
微服务:整合 Spring Cloud Eureka - .NET Core Mvc Api (C#)
微服务:整合 Spring Cloud Eureka - 服务治理机制
微服务:整合 Spring Cloud Eureka - 服务事件监听
微服务:整合 Spring Cloud Eureka - 高级属性Region、Zone
微服务:整合 Spring Cloud Eureka - Rest接口文档
微服务:整合 Spring Cloud Eureka - Security 安全保护
一、简介
在体验了Spring Cloud Eureka 通过简单的注解配置就能实现强大的服务治理功能之后,我们可以进一步了解一些Eureka基础架构中各个元素之间的通信行为,以此来更加深入的理解Eureka服务治理体系是如何运转起来的。
二、微服务基础架构拓扑图
1、“Eureka Server 服务注册中心-1” 和 “Eureka Server 服务注册中心-2” ,他们相互注册成为高可用集群。
2、服务提供者启动两个实例,一个注册到“Eureka Server 服务注册中心-1” 上,另一个注册到“Eureka Server 服务注册中心-2”上。
3、服务消费者启动两个实例,他们分别指向了一个注册中心。
4、其实服务消费者和服务提供者对于Eureka Server而言,都是服务,都会将地址注册在Eureka Server中,并且他们的注册信息也没有区别。
三、服务提供者:
1、服务注册
“服务提供者”在启动的时候回放松REST请求的方式将自己注册到Eureka Server上,同时在HTTP请求中,带上了自身服务的一些元数据。Eureka Server 接收到这个REST请求之后,将元数据信息存储在一个双层Map中。第一层的key是服务名,第二层的key是具体服务的实例名。
在服务注册是,需要确认一下eureka.client.register-with-eureka=true参数是否正确,默认值为true。若设置为false,那么服务信息将不会注册到Eureka Server上。一般而言都设置成true,设置成false的业务场景不多。例如服务消费者不提供对外接口,但是消费者希望能从Eureka Server中获取服务提供者的注册信息。那么此时就可以设置eureka.client.register-with-eureka=false。不过一般而言,在微服务架构中,服务消费者也是服务提供者。
2、服务同步
两个服务提供者分别注册到两个不同的服务注册中心上,也就是说,他们的信息分别被两个服务注册中心所维护。但是“Eureka Server 服务注册中心-1” 和 “Eureka Server 服务注册中心-2”构成一个集群,他们互为服务,因此他们相互之间会共享服务注册信息。通过服务同步,服务消费者可以在任何一个Eureka Server中拿到这两个服务提供者的注册信息。
3、服务续约
在注册完服务之后,服务提供者会维护一个心跳来告诉Eureka Server:“老子还活着”,以防止Eureka Server的提出任务将改服务实例从服务列表中排除出去,我们称该操作为服务续约(Renew)。
关于服务续约有两个重要属性,我们可以根据具体场景来进行调整。
eureka: instance: lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 15
eureka.instance.lease-renewal-interval-in-seconds:用于定义服务续约任务的调用时间,默认是30秒。
eureka.instance.lease-expiration-duration-in-seconds:用于定义服务失效的时间,默认是90秒。也就是说,Eureka Server在距离上次收到的服务心跳之后的90秒之内,没有再次收到心跳,那么Eureka Server就认为服务提供者挂了。
eureka.instance.lease-expiration-duration-in-seconds 一般是 eureka.instance.lease-renewal-interval-in-seconds 的三倍。
4、服务下线
在系统运行过程中,必然会面临关闭或重启服务的摸个实例,在服务关闭(不可用)期间,我们自然不希望客户端会继续调用关闭的实例。所以在服务实例进行正常关闭的操作时,他会出发一个服务下线的REST请求给Eureka Server,告诉Eureka Server:“我下线了,不玩了”。Eureka Server 收到请求之后,将改服务节点状态设置为“DOWN”,并把该下线事件传播出去。
四、服务消费者
1、获取服务
当我们启动一个服务消费者时,服务消费者会立马通过REST请求获取Eureka Server上注册的服务列表信息。为了提供性能,Eureka Server会维护一个只读的服务列表清单返回给客户端。
获取服务清单是服务消费的前提,所以必须要确保 fetch-registry=ture。客户端默认每30秒从Eureka Server上获取一份最新的服务列表清单来更新本地缓存。可以通过设置 registry-fetch-interval-seconds来更改客户端刷新缓存时间。
2、服务调用
服务消费者在获取服务清单后,通过服务名可以获取具体的服务实例名和该实例的元数据信息。因为有了这些信息,客户端就可以按照自己的需求调用哪一个服务实例,在Spring Cloud Ribbon中默认采用轮训的方式调用,从而实现客户端的负载均衡。
对于访问实例的选择,Eureka中有Region和Zone的概念,后面小编会详细介绍。
五、服务注册中心
1、服务失效剔除
在某些时候,我们的服务实例并不会正常下线。于是Eureka Server并不知道服务实例已经下线了。所以Eureka Server中有个定时任务,每个一段时间就会将当前清单中心跳超时的服务剔除。