目录
干货分享,感谢您的阅读!
服务治理在面临系统存在大量服务时可以解决基本的三大定位问题:提升服务架构的可扩展性;有效的服务监控和故障定位;对服务的有效划分和路由。在技术实现上,服务治理一般表现为服务发布与订阅机制以及实现该机制的服务注册中心。
各个微服务需要通过服务治理实现自动化的注册和发现。服务治理的需求来自于服务的数量。为了实现微服务架构中的服务注册和发现,通常都需要构建一个独立的媒介来管理服务的实例,这个媒介一般被称为服务注册中心。
一、服务注册中心:注册中心核心功能+实现策略
主要充当服务注册和服务发现服务器的作用,不但是路由信息的存车仓库,也是服务提供者和服务消费者进行交互的媒介。
1.注册中心核心功能
- 注册中心具备发布-订阅功能,体现在服务提供者可以根据服务的元数据发布服务,而服务消费者则通过自己感兴趣的服务进行订阅并获取包括服务地址在内的各项元数据。
- 布-订阅功能还体现在数据变更推送,即当注册中心服务定义发生变化时,主动推送变更到该服务的消费者从而实现间接路由。
- 需要确保数据的一致性,在任何时候服务提供者和服务消费者都应该看到同一份数据。
- 为了确保服务高可用性,一般也需要注册中心保持高可用性,也就意味着注册中心需要构建对等集群。对等集群,Peer-to-Peer Server Clusgter,指集群中所有服务器都提供同样的服务,客户端只连接一个服务器完成注册和发现即可,任何一台服务器宕机都不影响客户端的正常使用。
- 作为注册中心的客户端程序,一般对嵌入在服务提供者和服务消费者的应用程序中。
- 在应用程序运行时,服务提供者的注册中心客户端程序会向注册中心注册自身提供的程序,而服务消费者的注册中心客户端程序则从注册中心查询当前订阅的服务信息并周期性的刷新服务状态。
- 服务消费者需配备缓存机制以加速服务路由,提高服务路由的效率和容错性,更重要的是,当服务注册中心不可用时,服务消费者可以利用本地缓存路由实现对现有服务的可靠调用。
可以对注册中心进行抽象建模如下图,客户端可以是服务提供者也可以是服务消费者。
2.注册中心实现策略
在实现流程图上,服务提供者和服务消费者可以使用一定的通信机制与注册中心服务器建立连接并维持心跳检测,通过注册中心提供的操作接口分别完成发布和动态更新服务定义、获取制定服务地址列表、取消服务发布、获取服务地址更新等功能。同时,注册中心的服务监听机制确保消费者能够实时监控服务更新状态。
具体流程如下图:
二、服务发布与注册
服务发布的目的是为了暴露服务访问的入口,是一个通过构建网络连接并启动端口监听请求的过程。服务发布注册流程如下:
发布启动器:确定服务发布形式并启动发布平台
服务发布形式常见的有三种:配置化+API调用+使用注解,各有利弊。
- 配置化:通过以XML为代表的配置化工具,服务框架对业务代码零侵入,扩展和修改方便,同时配置信息修改能够实时生效。
- API调用:服务框架对业务代码侵入性较强,修改代码之后需要重新编译才能生效。
- 注解方式:服务框架对业务代码零侵入,扩展和修改比较方便,但修改配置需要编译才能生效。
一般我们倾向于使用配置方式,但涉及系统之间集成时,需要使用服务框架中较底层的服务接口,API调用有可能是唯一选择。
发布平台的启动与所选择的发布方式密切相关。
- 使用配置化发布时:通常会借助诸如Spring的容器进行服务实例的配置和管理,容器的正常启动意味着发布平台的启动。
- 使用API调用时:简单使用main函数进行启动。
- 使用注解方式时:与使用配置化发布启动是类似的。
动态代理
在实现远程调用时必然会添加动态代理功能,通过动态代理来实现对服务发布进行动态拦截,可以对服务发布行为本身进行封装和抽象,同时也便于扩展和定制化。
JDK自带的Proxy机制和诸如javassist的字节码编辑库都可以实现动态代理。
发布管理器
在流程中充当承上启下的门户Facade作用,一方面,获取协议服务器中生成的服务URL信息并发布到注册中心,另一方面,负责通知发布启动器本次发布是否成功。
协议服务器
是真正实现服务器创建和网络通信的组件,主要作用在于确定发布协议以及根据该协议建立网络连接、并管理心跳、断线重连、端口绑定与释放。常见的协议包括HTTP、RMI、Hessian等。
注册中心
主要用于保存和更新服务的地址信息。
三、服务发现与调用
较服务发布与注册而言,服务发现与调用是一个导入的过程,基本和服务发布与注册是对称结构流程:
- 调用启动器:确定服务的调用形式并启动调用平台,与发布启动器一样。
- 动态代理:完成本地接口到远程调用的转换,导入服务提供者接口API和服务信息并生成远程服务的本地动态代理对象,将本地API调用转换成远程服务调用并返回调用结果。
- 调用管理器:具备缓存功能,保存服务地址的缓存信息。当从注册中心获取服务提供者地址信息时,调用管理器根据需要更新本地缓存,确保在注册中心不可用的情况下,调用启动器仍然可以从本地缓存中获取服务提供者的有效地址信息。
- 协议客户端:根据服务调用指定的协议类型创建客户端并发起连接请求,负责与协议服务器进行交互并获取调用结果。
- 注册中心:主要用于保存和更新服务的地址信息。
四、服务监控
如图,在微服务架构中的服务调用中,服务中间件、数据库、缓存、文件系统以及其他服务之间都有可能存在依赖关系,为了确保系统运行时这些依赖关系的稳定性和可用性,服务调用路径、服务调用的业务数据、服务性能数据都是需要监控的内容,以便于系统定位和防御故障问题。
基本思路:日志埋点
- 使用跟踪ID作为一次完整应用调用的唯一标识,然后将该次调用的详细信息通过日志的方式进行保存。
- 日志埋点分为客户端埋点和服务器埋点:客户端埋点:关注于跟踪ID、客户端IP、调用方接口、调用时间等信息;服务器端埋点:关注于跟踪ID、调用方上下文、服务端耗时、处理结果等信息。
- 日志埋点的作用分为两类:一类用于服用调用跟踪把所有请求过程的日志能够关联起来;一类用于统计各服务的处理时间,一般通过记录服务调用的开始时间和结束时间计算并统计时间延迟。
- 针对日志埋点产生的海量运行时数据,通常需要专门的工具进行处理埋点数据。基于Hadoop、Storm、Spark等技术的离线/实时批量处理框架;基于Elastic Search、Solr的垂直化搜索引擎;专门的Flume/ELK等日志处理框架
- 在日志埋点过程中也可以使用抽样思想,并一定将所有的场景都进行日志埋点。
基本目标:保障线上服务运行质量,治理的对象是基于统一分布式服务框架开发的各项业务数据。
基本定位:关注服务运行时的状态、细粒度治理等。
基本策略:服务限流、降级、服务动态路由和灰度发布等。
具体实现:
- 采用通过注册中心对服务以来进行分析,结合运行时调用关系,梳理不合理的依赖和调用路径,优化服务架构;
- 实时收集服务调用日志,分析、汇总、存储和展示,方便开发和运维人员进行实时诊断;
- 执行服务运行时治理方案,包括限流降级、路由、统一配置等在线调整。
参考书籍、文献和资料:
【1】郑天民. 微服务设计原理与架构. 北京:人民邮电出版社,2018.