第3章:微服务治理

来源:互联网 发布:linux grep命令详解 编辑:程序博客网 时间:2024/06/07 12:30
第3章:微服务治理

Eureka详解:服务治理体系中的三个核心角色 服务注册中心、服务提供者、消费者。
基础架构:
服务注册中心:Eurek提供的服务端,提供服务注册与发现的功能。
服务提供者:提供服务的应用,可以是Spring Boot应用,也可以是其他技术平台且遵循Eureka通信机制的应用。它将自己提供的服务注册到Eureka,以供
其他应用发现。
服务消费者:消费者应用从服务注册中心获取服务列表,从而使消费者可以知道去何处调用所需要的服务,在上一节中使用了Ribbon来实现服务消费。

服务治理机制:
服务提供者:在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息。Eurreka Server接收到这个
REST请求之后,将数据存储在一个双层Map中,其中第一层的key是服务名,第二层key是具体服务的实例名。在服务注册时,需要确认eureka.client.register-with-
eureka=true参数是否正确,该值默认为true。设置为false将不注册。
服务同步,如同架构图所示,这里的两个服务提供者分别注册到了两个不同的注册中心上,它们的信息分别被两个服务注册中心维护。此时,由于服务注册中心之间
因互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发给集群中相连的其他注册中心,从而实现注册中心之间的服务同步。
通过服务同步,两个服务提供者的服务信息就可以通过这两台服务注册中心的任意一台获取到。
在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server,防止Eureka Server的“剔除任务”将该服务实例从服务列表中排除出去。我们称该操作
为服务续约(Renew)。
关于服务续约两个重要属性:
eureka.instance.lease-renewal-interval-in-serconds=30        #用于定义服务续约调用间隔
eureka.instance.lease-expiration-duration-in-serconds=90    #用于定义服务失效时间,默认90秒

服务消费者
在服务注册中心已经注册了一个服务,并且该服务有两个实例。当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取上面注册的
服务清单。为了性能考虑,Eureka Server会维护一份只读的服务清单来返回给客户端,同时该缓存清单会每个30s刷新一次。
eureka.client.registry-fetch-interval-seconds=30                    #该参数默认为30s

服务调用
在服务消费者获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。在Ribbon中会默认采用轮询的方式进行调用,从而实现客户端
负载均衡。
Eureka中有Region和Zone的概念,一个Region中可以包含多个Zone,每个服务客户端需要被注册到一个Zone中,所以每个客户端对应一个Region和一个Zone.
在进行服务调用的时候,优先访问处于同一个Zone‘中的服务提供方,若访问不到,就访问其他的Zone。

服务下线
在系统运行过程中必然会面临关闭或重启服务的某个实例情况,在服务关闭期间,不希望客户端继续调用关闭了的实例。所以在客户端程序中,当服务实例进行正常关闭
操作时,它会触发一个服务下线的REST请求给Eureka Server,告诉服务注册中心:“我要下线”。服务端在接收到请求之后,将该服务状态置为下线(DOWN),并把
该事件传播出去。

服务注册中心:
失效剔除、自我保护
本地调试很容易触发注册中心的保护机制。这会使得服务实例不那么准确。在进行本地开发的时间,使用eureka.server.enable-self-preservation=false关闭保护机制。


配置详解
Eureka客户端的配置主要在以下两个方面。
服务注册相关的配置信息,包括服务注册中心的地址、服务获取的间隔时间、可用区域等。
服务实例相关的配置信息,包括服务实例的名称、IP地址、端口号、健康检查路径等。

服务注册类配置
关于服务注册类的配置信息,可以通过查看org.springframework.cloud.netflix.eureka.EurekaClientConfigBean的源码查看来获得比官方文档更为详尽的内容,
这些配置信息都以eureka.client为前缀。
指定注册中心:为了服务注册中心的安全考虑,很多时候我们都会为注册中心加入安全校验。在配置serviceUrl时,需要在value值的URL中加入响应的安全校验信息,
比如http://<username>:<passwoord>@locahost:1111/eureka 其中<username>为安全校验信息的用户名,<password>为该用户的密码。
其他配置,常用配置参数均以eureka.client为前缀。

服务实例类配置
关于实例类的配置信息,可以通过查看org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的源码获取详细内容,这些配置均以eureka.instance为
前缀。

实例名配置 默认规则:${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id}:${server.port}
server.port=0或者使用随机数server.port=${random.int(10000,19999)}来让tomcat启动的时候采用随机端口。但是这时候我们会发现注册到Eureka Server的实例名
都是相同的,这会使得只有一个服务实例能够正常提供服务。通过设置实例名可以解决:
eureka.instance.instanceId=${spring.application.name}:${random.int}

端点配置:
应用设置了context-path,这时,所有的spring-boot-actuator模块的监控端点也会增加一个前缀。所以,就需要做类似配置,为/info和/health端点也加上类似的前缀
信息:
management.context-path=/hello
eureka.instance.statusPageUrlPath=${management.context-path}/info
eureka.instance.healthCheckUrlPath=${management.context-path}/health
有时为了安全考虑,也有可能会修改/info和/health端点的原始路径。这时间也需要做一些特殊配置,比如
endpoints.info.path=/appInfo
endpoints.health.path=/checkHealth
eureka.instance.statusPageUrlPath=/${endpoints.info.path}
eureka.instance.healthCheckUrlPath=/${endpoints.health.path}

Eureka的服务注册中心默认会以HTTP的方式来访问和暴露这些端点,因此当客户端应用以HTTPS的方式来暴露服务和监控端点时,相对路径配置的方式无法
满足需求。Spring Cloud Eureka还提供了绝对路径的配置参数:
eureka.instance.statusPageUrl=https://${eureka.instance.hostname}/info
eureka.instance.healthCheckUrl=https://${eureka.instance.hostname}/health
eureka.instance.homePageUrl=https://${eureka.instance.hostname}/

健康监测
默认情况下,Eureka中各个服务实例的健康监测并不是通过spring-boot-actuator模块的/health端点来实现的,而是依靠客户端心跳的方式来保持存活。默认的心跳
实现方式可以有效检查客户端进程是否正常运作,但无法保证客户端应用能够提供正常服务。由于大多数微服务应用都会有一些其他的外部资源依赖,比如数据库、
缓存、消息代理等。如果我们的应用无法与这些外部资源连通的时间,实际上已经不能提供正常的对外服务了。但是客户端心跳依然在运行,所以它还是会被服务消费者
调用,而这样的调用不能得到预期结果。
Eureka 客户端健康监测L
在pom.xml文件中引入spring-boot-starter-actuator模块依赖。
在application.properties中增加配置eureka.client.healthcheck.enable=true
如果客户端的/health端点路径做了特殊处理,需要配置让服务注册中心正确访问健康检查端点。

其他配置,org.springframework.cloud.netflix.eureka.EurekaInstnceConigBean中定义配置参数,以eureka.instance为前缀.

跨平台支持
通信协议:默认情况下,Eureka使用Jersey 和XStream配合JSON作为Server与Client之间的通信协议。
百度:Jersey、XStream