6. SpringCloudAlibaba 实践笔记:服务治理基础知识
服务间调用存在的问题
目前,订单微服务为了在调用用户微服务和商品微服务,会将用户微服务和商品微服务的所在的 IP 地址和端口号硬编码到代码中,这样会存在很多问题,其中最重要的三个问题:
- IP 地址和端口修改问题:如果用户微服务和商品微服务的 IP 地址或者端口号发生了变化,则订单微服务将变得不可用,需要对同步修改订单微服务中调用用户微服务和商品微服务的 IP 地址和端口号。
- 多个微服务负载均衡问题:如果系统中提供了多个用户微服务和商品微服务,则无法实现微服务的负载均衡功能。
- 微服务维护问题:如果系统需要支持更高的并发,需要部署更多的用户微服务和商品微服务以及订单微服务,如果将用户微服务和商品微服务的 IP 地址和端口硬编码到订单微服务,则后续的维护会变得异常复杂。
所以,在微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。
服务治理
服务治理也是在微服务架构模式下的一种最核心和最基本的模块,主要用来实现各个微服务的自动注册与发现。
引入服务治理后,微服务项目总体上可以分为三个大的模块:服务提供者、服务消费者和注册中心,三者的关系如下:

- 服务提供者会将自身提供的服务注册到注册中心,并向注册中心发送心跳信息来证明自己还存活,其中,心跳信息中就会包含服务提供者自身提供的服务信息。
- 注册中心会存储服务提供者上报的信息,并通过服务提供者发送的心跳来更新服务提供者最后的存活时间,如果超过一段时间没有收到服务提供者上报的心跳信息,则注册中心会认为服务提供者不可用,会将对应的服务提供者从服务列表中剔除。
- 服务消费者会向注册中心订阅自身监听的服务,注册中心会保存服务消费者的信息,也会向服务消费者推送服务提供者的信息。
- 服务消费者从注册中心获取到服务提供者的信息时,会直接调用服务提供者的接口来实现远程调用。
注册中心
微服务实现服务治理的关键就是引入了注册中心,它是微服务架构模式下一个非常重要的组件,主要实现了服务注册与发现,服务配置和服务的健康检测等功能。
服务注册与发现
- 服务注册:注册中心提供保存服务提供者和服务消费者的相关信息。
- 服务发现:也可以理解为服务订阅,服务调用者也就是服务消费者,向注册中心订阅服务提供者的信息,注册中心会向服务消费者推送服务提供者的信息。
服务配置
- 配置订阅:服务的提供者和消费者都可以向注册中心订阅微服务相关的配置信息。
- 配置下发:注册中心能够将微服务相关的配置信息主动推送给服务的提供者和消费者。
服务健康检测
- 注册中心会定期检测存储的服务列表中服务提供者的健康状况,例如服务提供者超过一定的时间没有上报心跳信息,则注册中心会认为对应的服务提供者不可用,就会将服务提供者踢出服务列表。
常见的注册中心
常用的组件大概包含:Zookeeper、Eureka、Consul、Etcd、Nacos 等。
Zookeeper
Zookeeper 是 Apache Hadoop 的一个子项目,它是一个分布式服务治理框架,主要用来解决应用开发中遇到的一些数据管理问题,例如:分布式集群管理、元数据管理、分布式配置管理、状态同步和统一命名管理等。在高并发环境下,也可以通过 Zookeeper 实现分布式锁功能。
Eureka
Eureka 是 Netflix 开源的 SpringCloud 中支持服务注册与发现的组件,但是后来闭源了。
Consul
Consul 是 HashiCorp 公司推出的开源产品,用于实现分布式系统的服务发现、服务隔离、服务配置,这些功能中的每一个都可以根据需要单独使用,也可以同时使用所有功能。
Etcd
etcd 是一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它可以优雅地处理网络分区期间的领导者选举,即使在领导者节点中也可以容忍机器故障。
Nacos
Nacos是阿里巴巴开源的一款更易于构建云原生应用的支持动态服务发现、配置管理和服务管理的平台,其提供了一组简单易用的特性集,能够快速实现动态服务发现、服务配置、服务元数据及流量管理,主要如下所示。
- 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如IP地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
- 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
- 服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
- 服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清 单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地存。
- 服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。

浙公网安备 33010602011771号