微服务详讲:具体实践方法和基础设施简述

微服务具体实践方法:

针对:微服务拆分过细,过分强调“small”、微服务基础设施不健全,忽略了“automated”、微服务并不轻量级,规模大了后,“lightweight”不再适应。

1、服务粒度

基于团队规模进行拆分,微服务拆分粒度的“三个火枪手”原则,

从系统规模来讲,3个人负责开发一个系统,系统的复杂度刚好达到每个人都能全面理解整个系统,又能够进行分工的粒度;

从团队管理来说,3个人可以形成一个稳定的备份,即使1个人休假或者调配到其他系统,剩余2个人还可以支撑;

从技术提升的角度来讲,3个人的技术小组既能够形成有效的讨论,又能够快速达成一致意见;

“三个火枪手”的原则主要应用于微服务设计和开发阶段,如果微服务经过一段时间发展后已经比较稳定,处于维护期了,无须太多的开发,那么平均1个人维护1个微服务甚至几个微 服务都可以。

2、拆分方法

基于业务逻辑拆分

基于可扩展拆分:将系统中的业务模块按照稳定性排序,将已经成熟和改动不大的服务拆分为稳定服务,将经常变化和迭代的服务拆分为变动服务。(这样拆分主要是为了提升项目快速迭代的效率,避免在开发的时候,不小心影响了已有的成熟功能导致线上问题)

基于可靠性拆分:将系统中的业务模块按照优先级排序,将可靠性要求高的核心服务和可靠性要求低的非核心服务拆分开来,然后重点保证核心服务的高可用。好处可以避免非核心服务故障影响核心服务、核心服务高可用方案可以更简单、能够降低高可用成本(将核心服务拆分出来后,核心服务占用的机器、带宽等资源比不拆分要少很多。)

基于性能拆分:将性能要求高或者性能压力大的模块拆分出来,避免性能压力大的服务影响其他服务。常见的拆分方式和具体的性能瓶颈有关,可以拆分Web服务、数据库、缓存等。例如电商的抢购,性能压力最大的是入口的排队功能,可以将排队功能独立为一个服务。

3、基础设施

但实际上真正决定微服务成败的,恰恰是那个被大部分人都忽略的“automated”

要做好微服务,这些基础设施都是必不可少的,否则微服务就会变成一个焦油坑,让业务和团队在里面不断挣扎且无法 自拔。因此也可以说,微服务并没有减少复杂度,而只是将复杂度从ESB转移到了基础设施。

虽然完善的设备是一个庞大的工程,但是有两点:

·1、是已经有开源的微服务基础设施全家桶 了,例如大名鼎鼎的Spring Cloud项目,涵盖了服务发现、服务路由、网关、配置中心等功能;

2、是如果微服务的数量并不是很多的话,并不是每个基础设施都是必须的。

.1>服务发现、服务路由、服务容错:这是最基本的微服务基础设施

.2>接口框架、API网关:主要是为了提升开发效率,接口框架是提升内部服务的开发效率,API网关是为了提升与外部服务对接的效率。

.3>自动化部署、自动化测试、配置中心:主要是为了提升测试和运维效率。

.4>服务监控、服务跟踪、服务安全:主要是为了进一步提升运维效率。

以上3和4两类基础设施,其重要性会随着微服务节点数量增加而越来越重要,但在微服务节点数量较少的时候,可以通过人工的方式支撑,虽然效率不高,但也基本能够顶住。

微服务架构-基础设施

1、自动化测试:自动化测试涵盖的范围包括代码级的单元测试、单个系统级的集成测试、系统间的接口测试,理想情况是每类测试都自动化。如果因为团队规模和人力的原因无法全面覆盖,至少要做到接口测试自动化。

2、自动化部署:自动化部署系统包括版本管理、资源管理(例如,机器管理、虚拟机管理)、部署操作、回退操作等功能

3、配置中心:微服务需要一个统一的配置中心来管理所有微服务节点的配置,配置中心包括配置版本管理(例如,同样的微服务,有10个节点是给移动用户服务的,有20个节点给联通用户服务的,配置项都一样,配置值不一样)、增删改查配置、节点管理、 配置同步、配置推送等功能。

4、接口框架:微服务提倡轻量级的通信方式,一般采用HTTP/REST或者RPC方式统一接口协议。但在实践过程中,光统一接口协议还不够,还需要统一接口传递的数据格式

5、API网关:微服务需要一个统一的API网关,负责外部系统的访问操作(解决外部访问具体哪个功能、相关安全和权限等限制)所有的外部系统接⼊系统都需要通过API网关,主要包括接入鉴权(是否允许接入)、权限控制(可以访问哪些功能)、传输加密、请求路由、流量控制等功能。

6、服务发现:解决配置工作量很大和微服务节点经常变化,可能是由于扩容导致节点增加,也可能是故障处理时隔离掉一部分节点,还可能是采用灰度升 级,先将一部分节点升级到新版本,然后让新老版本同时运行。主要有两种实现方式:自理式和代理式。

自理式结构就是指每个微服务自己完成服务发现,优点:服务发现实现比较简单,因为这部分的功能一般通过统一的程序库或者程序包提供给各个微服务调用,而不会每个微服务都自己来重复实现一遍;并且由于每个微服务都承担 了服务发现的功能,访问压力分散到了各个微服务节点,性能和可用性上不存在明显的压力和风险。

代理式:

代理式结构就是指微服务之间有一个负载均衡系统(图中的LOAD BALANCER节点),由负载均衡系统来完成微服务之间的服务发现

存在风险:

可用性风险,一旦LOAD BALANCER系统故障,就会影响所有微服务之 间的调用;

是性能风险,所有的微服务之间的调用流量都要经过LOAD BALANCER系统,性能压力会随着微服务数量和流量增加而不断增加,最后成为性能瓶颈。因此LOAD BALANCER系统需要设计成集群的模式,但LOAD BALANCER集群的实现本身又增加了复杂性。

不管是自理式还是代理式,服务发现的核心功能就是服务注册表,注册表记录了所有的服务节点的配置和状态,每个微服务启动后都需要将自己的信息注册到服务注册表,然后由微服务或者LOAD BALANCER系统到服务注册表查询可用服务。

7、服务路由:有了服务发现后,微服务之间能够方便地获取相关配置信息,但具体进行某次调用请求时,我们还需要从所有符合条件的可用微服务节点中挑选出一个具体的节点发起请求,这就是服务路由需要完成的功能。服务路由和服务发现紧密相关,服务路由一般不会设计成一个独立运行的系统,通常情况下是和服务发现放在一起实现的。服务路由核心的功能就是路由算法。常见的路由算法有:随机路由、轮询路由、最小压力路由、最小连接数路由等。

8、服务容错:系统拆分为微服务后,单个微服务故障的概率变小,故障影响范围也减少,但是微服务的节点数量大大增加。从整体上来看,系统中某个微服务出故障的概率会大大增加。常见的服务容错包括请求重试、流控和服务隔离。通常情况下,服务容错会集成在服务发现和服务路由系统中。

9、服务监控:系统拆分为微服务后,节点数量大大增加,导致需要监控的机器、网络、进程、接口调用数等监控对象的数量大大增加;主要解决了问题的处理和发现过程

通常情况下,服务监控需要搜集并分析大量的数据,因此建议做成独立的系统,而不要集成到服务发现、API网关等系统中。

10、服务跟踪:要跟踪某一个请求在微服务中的完整路径,服务监控是难以实现的。因为如果每个服务的完整请求链信息都实时发 送给服务监控系统,数据量会大到无法处理。目前无论是分布式跟踪还是微服务的服务跟踪,

服务监控和服务跟踪的区别可以简单概括为宏观和微观的区别。例如,A服务通过HTTP协议请求B服务10次,B通过HTTP返回JSON对象,服务监控会记录请求次数、响应时间平均 值、响应时间最高值、错误码分布这些信息;而服务跟踪会记录其中某次请求的发起时间、响应时间、响应错误码、请求参数、返回的JSON对象等信息。

绝大部分请求跟踪的实现技术都基于Google的Dapper论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure,我的微博中有对其译文版。

11、服务安全:

服务安全主要分为三部分:接入安全、数据安全、传输安全。通常情况下,服务安全可以集成到配置中心系统中进行实现,即配置中心配置微服务的接入安全策略和数据安全策略, 微服务节点从配置中心获取这些配置信息,然后在处理具体的微服务调用请求时根据安全策略进行处理。由于这些策略是通用的,一般会把策略封装成通用的库提供给各个微服务调用。

发布了83 篇原创文章 · 获赞 87 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/ligupeng7929/article/details/105353489