服务注册中心:eureka提供的服务端,提供服务注册以及发现的功能
服务提供者:是指服务的被调用方(即:为其它服务提供服务的服务)[提供服务的应用,将自己提供的服务注册到eureka中]
服务消费者:是指服务的调用方(即:依赖其它服务的服务) ribbon-consumer[消费者应用从服务注册中心获取服务列表,从而使消费者可以知道去何处调用其所需要的服务]
很多时候客户端即是服务消费者也是服务提供者
服务提供者
服务注册:在启动的时候会通过发送一个REST请求的方式将自己注册到eureka中,同时带上自身服务的一些元数据信息,euruke接收到这个REST请求之后,将原数据存储在一个双层结构Map中,第一层的key是服务名,第二层的key是具体服务的实例名
服务同步:俩个服务提供者分别注册到了俩个不同的服务注册中心上,也就是说他们的信息分别别俩个服务注册所维护,此时,由于服务注册中心因互相注册微服务,当服务提供者发送请求到一个服务注册中心是,他会将该请求转发给集群中相连的其他注册中心,从而实现注册中心之间的服务同步
服务续约:在注册完服务时,服务提供者会维护一个心跳用来持续告诉eureka server “我还活着"以防止eureka server的剔除任务将该服务实例从服务列表中排除出去,我们称该操作为服务续约
eureka-instance-lease-renewal-interval-in-seconds参数用于定义服务续约任务间调用时间间隔 默认30秒
eureka-instance-lease-expiration-duration-in-seconds 参数用于定义服务失效的时间默认90秒
服务消费者:
获取服务:到这里,服务注册中心已经注册了一个服务,并且该服务有俩个实例,当我们启动服务消费者的时候,他会发送一个REST请求给服务中心,来获取上面注册的服务清单,为了性能考虑,eureka server会维护一份制度的服务清单来返回给客户端,同时该缓存清单会每隔30秒更新一次
获取服务时服务消费者的基础,所以必须确保eureka.client.fetch-registry=true ;(是否从eureka-server中获得注册信息)
服务调用:服务消费者在获取服务清单后,通过服务名可以获得具体服务的实例名和该实例的元数据信息,因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例,在Ribbon中默认采用轮询的方式进行调用,从而实现客户端的负载均衡
对于访问实例的选择,eureka中有Region(地理上的分区)和Zone(region内的具体机房)的概念,一个Region中可以包含多个Zone,每个服务客户端需要被注册到一个Zone中,所以每个客户端对应一个Region和一个Zone,在进行服务调用的时候,优先访问同处一个Zone中的服务提供方,若访问不到,就访问其他的Zone,
服务下线:在系统运行过程中必然会面临关闭后重新启动服务的某个实例的情况,在服务关闭期间,我们自然不希望客户端会继续调用关闭了的实例,所以在客户端程序中,当服务实例进行正常的关闭操作时,他会触发一个服务下线的REST请求给告诉eureka server,告诉服务注册中心”我要下线了“服务端在接受请求后,将该服务状态设置为下线(down)并把下线的消息传出去
服务注册中心:
失效剔除:有些时候 我们的服务实例并不一定会正常下线,可能由于内存溢出,网络故障等原因使得服务不能正常工作,而服务注册中心并未收到”服务下线“的请求,为了从服务列表中将这些无法提供服务的实例剔除,eureka server在启动的时候会创建一个定时任务,每隔一段时间(默认60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除出来
自我保护:当我们在本地调试基于Eureka的程序时,基本上都会碰到这样一个问题,在服务注册中心的信息面板中出现类似下面的红色警告信息:
EMERGENCY ........TO BE SAFE
实际上,该警告就是触发了eureka server的自我保护机制,之前我们介绍过,服务注册到eureka server之后,会维护一个心跳连接,告诉eureka server自己还活着,eureka server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由网络不稳定导致),eureka server会将当前的实例注册信息保护起来,让这些实例不会过期可能保护这些注册信息,但是,在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试,断路器等机制
由于在本地调试很容易触发注册中心的保护机制,这会使得注册中心维护的服务实例不那么准确,所以,我们在本地开发的时候,可以用eureka.server.enable-self-preservation=false参数来关闭保护机制,以确保注册中心可以将不可用的实例正确剔除
什么是元数据:他是eureka客户端在向服务注册中心发送注册请求时,用来描述自身服务信息的对象,其中包含了一些标准化的元数据,比如服务名称,实例名称,实例IP,实力端口等用于服务治理的重要信息,以及一些用于负载均衡策略或是其他特殊用途的自定义元数据信息
1.eureka:
启动一个(eureka)服务注册中心,只需要一个注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类上
#由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己 eureka.client.register-with-eureka=false
#由于注册中心的职责就是维护服务实例,他并不需要去检索服务,所以设置为false eureka.client.fetch-registry=false
eureka:
instance:
prefer-ip-address: false
不想使用主机名来定义注册中心的地址,为true是IP地址为false 主机名
如果eureka宕机了整个项目就宕了,为此eureka的高可用就是把自己作为服务提供者注册到别的服务注册俩个互相注册
//发现服务
//从服务注册中心获取的服务相关信息
DiscoveryClient
//实例
ServiceInstance instance = client.getLocalServiceInstance()
2.zuul
启动一个服务提供者,只需要一个注解@EnableDiscoveryClient,这个注解需要在springboot工程的启动application类上
3.ribbon:服务消费的任务由ribbon完成,ribbon是一个基于HTTP和TCP的客户端负载均衡器,ribbon在eureka服务发现的基础上实现了一套对服务实例的选择策略,从而实现对服务的消费。
@Bean
/** * 在请求时拥有客户端负载均衡的能力 */
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}