spring-cloud-3
分布式服务治理
服务治理中心
服务治理中心是微服务(分布式)架构中最基础和最核心的功能组件,它主要对各个服务实例进行管理,包括服务注册和服务发现等。
搭建 Eureka 服务治理中心
- 创建项目,引入依赖
- 配置 application.yml
- 启动项目
服务发现
- 创建新项目,引入依赖
- 配置 applicaiton.yml
- 启动项目
- 验证
多个服务治理中心实例
为了避免“单个服务治理中心宕机后服务不可用”问题,我们希望服务治理中心也能有多个实例。
为服务治理中心添加 eureka.client.service-url.defaultZone 配置项。
为各微服务实例添加 eureka.client.service-url.defaultZone 配置项。
Eureka 治理机制
所谓服务调用,就是一个服务调用另外一个服务的过程。要
解释 Eureka 作为服务治理中心的服务调用过程,需要讨论其基础架构的 3 个重要概念。
(1)服务治理中心:指 Eureka 服务器,在教材代码清单3-19中,使用 FUND 代替了服务器名称(或者地址)和端口。之所以可以这样,是因为 FUND 这个名称是在 Eureka 服务治理中心注册的微服务名称,它下面存在 7001 和 7002 两个端口资金微服务实例,所以可以轮询选择其中一个。这便是服务治理中心的作用之一。 此外,服务治理中心还会提供服务注册、失败剔除、服务续约和服务下线等功能,用来治理各个微服务实例。
(2)服务提供者:在教材代码清单 3-17 到代码清单 3-19 中,是理财产品微服务调用资金微服务,所以资金微服务是我们例子中的服务提供者。在微服务系统中,服务提供者主要是以 REST 风格的端点被服务消费者调用的,而服务提供者是注册在 Eureka 中的,所以 Eureka 可以对其进行治理。
(3)服务消费者:这里的服务消费者是理财产品微服务(Product), 它会解析类似 FUND 这样的微服务名称。解析的过程是,首先根据这个名称从服务治理中心获取服务提供者的实例列表,保存在本地,然后通过特定的负载均衡的策略确定具体的实例,最后通过请求该实例获取数据。教材的例子中使用了 Ribbon 来实现服务消费,在未来还有更为简便的 OpenFeign 需要介绍。
服务治理中心工作原理
分 3 个维度来讨论:
(1)微服务实例和服务治理中心的关系:注册、续约、下线。
(2)微服务治理中心:相互复制、服务剔除、自我保护。
(3)微服务之间的相互调用:服务获取、服务调用。
Region 和 Zone
Region 和 Zone 是来自亚马逊云技术服务(Amazon Web Services, AWS)平台的概念。亚马逊之所以提出这样的概念,是因为亚马逊是全球服务的公司,它的站点是全球范围的。
假设你在北京调用亚马逊在纽约的站点服务,那么至少会有以下两个问题:距离问题和地区差异问题。
为了解决这两个问题,亚马逊提出了 Region 和 Zone 的概念。Region 是个更大的地理范围,在同一个 Region在 中内法律、语言和文化等是接近的,这就解决了地区差异问题;Zone 代表一个从大的区域(Region)切分出来的更小的区域(Zone)。同一个 Zone 中相互之前的地理位置应该是临近的,这就解决了距离问题。
Eureka 关键源码解读
(1)@EnableDiscoveryClient 注解;
(2)DiscoveryClient 接口;
(3)EndpointUtils.getServiceUrlsFromConfig() 方法
(4)DiscoveryClient.initScheduledTasks() 方法
(5)DiscoveryClient.register() 方法
(6)RestTemplateTransportClientFactory.register() 方法
Eureka 使用注意点
(1)对于服务注册,启动 Eureka 客户端,它不会马上注册到 Eureka 服务器。
(2)对于服务发现,客户端存在自己的缓存清单。
Eureka 配置
Eureka 的配置主要集中的客户端。它们都以 eureka.client 开头。
(1)enabled:是否启用 Eureka 客户端。默认值 true 。
(2)registry-fetch-interval-seconds:从Eurda服务器获取注册服务实例清单的时间间隔(单位秒) 。默认值 30 。
(3)instance-info-replication-interval-scconds :从更新服务实例信息到Eureka同步的时间间隔(单位秒) 。默认值 30 。
(4)initial-instace-info-replication-interval-seconds:将实例信息 初始化到Eurcka服务端的时间间隔(单位秒)。默认值 40 。
(5)eureka-servic-url-poll-interval-seconds:轮询Eureka服务地址更新的时间间隔(单位秒),在使用 Spring Cloud Config后,可以动态刷新serviceUrl。默认值 300 。
(6)eureka-server-read-timeout-seconds:读取Eureka服务器信息的超时时间(单位秒)。 默认值 8 。
(7)eurcka-server-connect-timeout-seconds:连接Eurcka服务器的超时时间(单位秒) 。默认值 5 。
(8)eureka-server-total-connections:Eureka客服端连接Eureka 服务器的连接总数 。默认值 200 。
(9)eureka-server-total-connections-pe-host:Eureka 客户端到每一个Eureka服务的链接总数。默认值 50 。
(10)cureka-connection-idle-timeout-seconds:Eureka 客户端连接Eureka服务器的超时关闭时间(单位秒) 。默认值 30 。
(11)heartbeat-executor-thread-pool-size:心跳任务连接池线程数。默认值 2 。
(12)heartbeat-executor-exponential-back-off-bound:心跳超时重试延迟时间的最大乘数值 。默认值 0 。
(13)cache-refresh-executor-thread-pool-size:缓存刷新连接池线程数。默认值 2 。
(14)cache-refresh-executor-exponential-back-off-bound:缓存刷新重试延迟时间的最大乘数值。默认值 10 。
(15)use-dns-for-fetching-service-urls:是否使用DNS地址来获取serviceUrl。默认值 false 。
(16)register-with-cureka:是否需要将实例注册到Eureka服务器。 默认值 true 。
(17)prefer-same-zone-cureka:是否偏爱使用相同Zone的Eureka服务器。默认值 true 。
(18)filter-only-up-instances:获取实例信息时是否过滤服务,只保留为UP状态的。默认值 true
(19)fetch-registry:是否启用服务获取。默认值 true 。