应用服务架构一直处于不断演进的过程当中,上图经过对比5种比较主流的架构模式,展现应用架构的演进历程和变化。前端
单体架构和竖井式架构都是围绕web容器打包及部署的架构模式,随着业务的快速发展,要求实现服务的快速迭代和快速交付,应用架构也由此演进为以服务为中心的架构模式。主流的面向服务的架构模式有:RPC架构、ESB中心化架构和微服务架构。web
经过上述对比,咱们不难发现,应用服务架构是在不断演进的,并且其演进背后存在必定的逻辑,服务架构的演进主要取决于如下2个维度:数据库
关于微服务的定义,此处引用ThoughtWorks首席科学家Martin Fowler给出的描述。编程
其中如下特性值得特别注意:后端
Martin Fowler对于微服务架构的表述更偏向学术上的定义,没有给出明确的落地标准或规范,只是提供了一些构建微服务架构的原则。安全
微服务架构模式有如此多的优势,那是否是全部的业务都要采用这种架构模式呢?又该如何筛选微服务?架构
左边图中,横坐标表明系统复杂度、纵坐标表明开发生产力、蓝色线表示微服务架构、绿色线表示单体架构。由图可知,当项目复杂度较低时,单体架构的生产力更高;随着项目复杂度愈来愈高,单体架构的生产力逐渐降低,微服务架构的生产力则显著提升。并发
鉴别出哪些业务须要使用微服务架构模式后,须要决定如何拆分和构建微服务。负载均衡
如何进行服务拆分,是在微服务过程当中业务方常常会问到的问题。框架
其实不少团队已经开始在作一些微服务化的工做,好比把大的工程拆分红不一样的模块或子系统,这种对业务模块进行的静态划分,至关于已经完成了微服务改造的第一步拆分。
上图是DDD(领域驱动设计)的开发模式,若是业务方案已经肯定采用微服务的架构模式,在整个工程领域咱们倾向于使用DDD模式来对业务架构和服务进行拆分。
DDD是基于领域模型的建模而不是数据库表驱动的建模,须要咱们对业务领域有深入的洞察,了解服务的边界和上下文信息传递。
康威定律指出:在微服务架构和设计系统组织,其产生的设计等价于组织间的沟通结构。就是说微服务架构不只是技术上的演进,同时对使用技术的组织提出了要求,拆分的服务是咱们和服务之间的沟通方式。
咱们采用微服务的12因子做为微服务建设的架构原则。微服务的12因子也叫云原生12因子,它提供了一种业务上云或微服务改造的最佳实践。重点介绍其中几个因子:
微服务看起来很是好,但实际上是须要一个技术体系或平台体系来支撑的,若是没有这样一个服务架构平台体系的建设,不推荐使用微服务。
微服务架构建设分为2种思路:SDK模式、ServiceMesh模式。
典型表明是SpringCloud,SpringCloud是基于SpringBoot的一整套实现微服务的框架。SDK模式的底层运行平台能够是PaaS平台,也能够是Kuberneters平台或Docker容器。
Istio 是ServiceMesh模式的典型表明。ServiceMesh模式的优缺点与SDK模式正好相反。
SpringCloud是基于SpringBoot发展而来的一整套成熟的微服务架构解决方案。SpringCloud具备如下优点:
SpringCloud自己也是一个逐渐演进的架构模式:最先是基于IOC/AOP的编程思想产生的;而后在Spring的基础上发展出SpringBoot,基于注解的方式实现快速的应用开发;后来在SpringBoot的基础上开发出SpringCloud底层微服务构架。
上图展现了SpringCloud的技术生态,SpringCloud技术栈包含了不少技术模块,好比Ribbon、Zuul、Eureka、SpringCloud Stream等,这些技术模块共同组成了SpringCloud生态圈,为开发者提供丰富的微服务架构基础设施支撑。
微服务和SpirngCloud的架构是比较复杂的,如配置管理、服务注册与发现、API网关、打包部署调度、安全、服务故障自愈、流量控制和弹性伸缩等非功能需求,都是微服务须要包含的架构模块。上图中蓝色字表示SpirngCloud、Kubernetes等用来解决云原生和微服务架构问题的技术方案。
从图中能够看出微服务架构的复杂性,要想实现一套微服务架构来支撑和交付业务,须要在底层封装不少基础组件,构建一套底层基础架构来隔离底层的非功能需求,作到让业务系统无感知、平滑地对外提供服务。
SpringCloud提供的框架或基础设施是一个半成品,咱们在SpirngCloud的基础上进行了二次开发,抽象和封装了一些微服务架构的通用基础设施平台,不一样的业务团队共享这些基础设施,下降技术学习和接入成本,让业务团队更专一于业务逻辑的实现,聚焦业务开发。
上图所示为宜信的微服务架构:
有别于其余的架构模式,微服务架构里出现了一个重要的基础设施变化-增长了微服务网关模块。网关主要解决的问题是:服务拆分以后,每个服务粒度都比较小,服务之间的交互会呈现网状的结构,须要一个聚合的节点来聚合这些微服务。
所以咱们在SpringCloud微服务架构的基础上二次开发出SIA微服务网关,如图所示,重点介绍其中的2个核心模块:
SIA微服务网关的4种模式:同步托管式、同步注解式、异步托管式、异步注解式。
采用单一源码库进行代码管理,交付方式是容器交付,去中心化的设计。目前大部分生产环境和业务都采用同步托管模式。
在跟业务团队对接时,咱们发现不少业务系统已经实现了一些独特的业务逻辑,难以迁移到网关,因此咱们采用一种比较兼容的注解的方式去适应这些业务逻辑,在原有项目的基础上加一个注解,将它们归入到整个网关管理体系中来。同步注解式是基于SpringCloud-Zuul 1实现的分布式微网关体系,管理业务方源码库,根据业务方环境进行交付。
SpringCloud和Zuul使用的后端技术是基于Servlet,其线程处理模型是一个请求对应一个线程,当请求量过多,线程栈溢出,就会占用很是多的资源,致使网关没法提供额外的线程资源来处理新进来的请求。所以咱们采用了SpringCloud自研的SCG技术方案。
SpringCloud-Gateway基于Netty和反应式编程模式,采用收敛式的线程处理模型,只要用少数线程就能够处理高并发的流量请求。目前已经实现了基于SpringCloud-Gateway的异步模式,当同步模式在线上运行过程当中出现资源透支的状况,就选择使用异步模式。异步模式也分为2种:异步托管式、异步注解式。
经过单一源码库进行代码管理,采用容器交付。主要使用场景是流量型,若是业务多对高并发、高吞吐场景,建议使用异步托管式。
若是想在异步网关基础上作定制开发,可使用异步注解的模式。
网关的4种模式来源于业务的需求:为兼容业务已有逻辑演进出注解模式;当出现性能瓶颈、资源浪费时,采用异步模式应对高并发流量。
上图是网关测试环境的一个截图, 包括上述4种模式。每个小方格表明业务的一个网关组,方格中的小圆圈表明它属于哪种网关。业务系统在选择网关模式时要作一个判断:诉求是支持业务的快速集成,仍是对流量有必定要求。
如图将SIA微网关的核心Feature分红2个层面:
微服务网关贯穿了整个微服务生命周期的管理。
SIA微服务网关的功能包括:
各功能模块对应的生命周期:
SIA微服务网关做用于软件生命周期的各个阶段,经过标准协同、业务测试/前端后端沟通、服务模块复用、可视化管理、数据统计管控等实现业务的统一融合、降本增效。
2016年,Gartner 发布了一个关于应用变化速率的报告《Pace-Layered Application Strategy》,以应用变化速率为标准将业务应用分为三层:
中台的目标是围绕业务组织进行可复用能力的有机整合,协助业务落地实施、改造、试错、转型,提高组织效率,下降系统成本。
中台和微服务有什么关系呢?微服务架构是面向开发的架构,不少基础服务能够沉淀到微服务架构里,同时,微服务架构把中台的能力快速释放出来,知足敏态业务快速变动的业务需求。
上图是路由管理里的一个截图,当一个大的单体或不一样的服务要对外提供统一服务时,能够把服务聚合到网关上;同时一个巨型应用也能够经过网关分解成微服务。
微服务架构中有不少非功能需求,或者说是技术导向型的需求,包括日志管理、限流、蓝绿部署、版本管理等,能够经过组件的方式下沉到网关上,业务系统经过将服务与组件绑定实现对组件功能的复用。
咱们还提供了一个插件机制,当业务有独特的需求,能够根据其业务逻辑在网关上进行功能的个性化定制。
在开发或先后端联调时,先后端能够经过网关服务文档中心的Swagger UI功能模块访问后端服务调用接口的分析。
只要在后端服务之上加一个Swagger注解,网关就能够把全部对外暴露的服务抓取出来,这至关因而一种契约式的开发。
咱们对网关应用作了容错和保护机制,固然这也是SpringCloud自己自带的一个技术模块,咱们的容错机制是基于SpringCloud的Hystrix实现的,当发现后端服务调用请求一直在返回错误时,会开启熔断,避免因为一直发送错误请求致使雪崩的状况发生。
除此以外,咱们还会采用Guava限流的方式对服务进行保护。在大促或秒杀的场景下,会有大量请求进来,这时会经过限流来保护服务的稳定。
宜信微服务架构平台有一个很重要的功能是网关服务运行状态和后端链接状态可观测,提供了不少监控方面的功能组件,如图所示,能够统计当前请求的频率、服务健康度。
预警方面重点介绍网关拓扑图。当请求失败,当前链路出现异常,经过网关拓扑图能够快速跟踪和判断业务系统哪一个节点出现问题,而后对有问题的节点进行摘除或其余操做。
咱们的网关运行在Docker平台上,Docker平台在出现问题或重启以后日志会丢失,咱们的日志系统会把日志归集,存储到ES中,便于对历史日志溯源。
网关中有一个组件叫“监控统计”,这个模块默认是不打开的,若是你想对请求作延时,或者想看请求的明细调用状况,能够经过组件管理中打开这个组件,对容器的请求作统计和分析。监控统计组件会对当前请求的最大延迟、最小延迟、失败个数、平均延迟进行排序,一目了然。
构建微服务网关初期,业务同事比较关注咱们的业务网关和别人的网关是否存在耦合问题,他的业务请求是否会影响到我。咱们选用去中心的网关设计方式,同时经过OAM实现对全部网关节点的统一管理。
咱们的微服务网关是按照DDD领域驱动模式来建设的,没有把网关绑定在某一个特殊的技术实现上,而是把它做为一个抽象封装来统一管理后端的节点,若是换一种技术实现也不会影响到前端业务的正常工做。所以在架构建设初期要考虑清楚你的业务系统和后端技术架构之间是否解耦。
虽然每一种开源方案在开源以前都通过了长时间的考验,但其实依然可能存在bug,基于这些开源方案进行二次开发时仍可能遇到一些坑,咱们会不断对开源系统进行bug修复和功能加强。
Zuul自己存在性能瓶颈,当出现性能问题时,咱们考虑是否是要用线程收敛的模式来加强网关的性能。
在网关应用中会遇到Eureka的CAP问题,由于Eureka消息注册以可用性(Availability)优先,在一致性(Consistency)上相对较弱。为解决这个问题,咱们基于Eureka的特色提供SynchSpeed服务,若是业务须要保证状态一致性,能够开启这个服务。
这两个问题是指当云容器平台的状态发生变动,却没有及时通知到注册中心,致使服务在两个平台的状态不一致,这就须要作上下文关联系统(StakeHolder)的整合。
内容来源:宜信技术学院第8期技术沙龙-线上直播|宜信微服务架构落地及其演进
主讲人:宜信高级架构师 & 宜信科技中心基础研发部SIA微服务网关负责人王佩华