主讲人介绍
王佩华:宜信科技中心基础研发部SIA微服务网关负责人
导读:从单体到SOA架构,从分布式服务化架构再到微服务架构,企业应用架构领域每一次技术架构的演进都会给企业带来更多的价值:职责解耦、能力复用、关注点分离、沟通效率提升、快速演进、快速交付、快速反馈等。本次分享主要介绍微服务架构的基础设施建设,及如何更好地服务宜信实际业务和赋能业务。
分享大纲:
一、应用服务架构演进及微服务架构介绍
二、SpringCloud微服务生态体系介绍
三、宜信微服务架构和SIA网关的四种模式
四、应用场景及典例分析
五、常见问题解答
PPT下载:https://pan.baidu.com/s/1uOFvCN0IlqXgNTIWqovZlw
分享实录
一、应用服务架构演进及微服务架构介绍
1.1 应用架构的演进历程
单体架构(All in One)。在业务发展初期,为了快速落地应用,满足客户需求,一般会使用All in One的单体架构。单体架构的特点是:所有模块都耦合在一个进程里,系统完全封闭且很复杂,牵一发动全局。 竖井式架构(Vertical Application)。随着业务的增长,单体架构越来越臃肿,我们对系统做了垂直化的拆分,应用架构进入第二阶段即竖井式架构。竖井式架构,就是根据业务属性将一个大的单体拆分成一些不同的模块或子系统,子系统之间没有直接关联。竖井式架构依然存在紧耦合的问题,系统也是完全封闭的,且存在大量的重复代码拷贝及模块功能需大量重复造轮子的情况。
RPC架构。RPC架构在现在的应用系统中还是比较常见的架构模式,适用于高并发场景,性能比较好。Dubbo就是一个典型的RPC架构。RPC架构也存在一些问题:通过共享分布式对象实现远程方法调用,如果在其中一个对象里添加一个属性,就会对共享对象的生产者与消费者产生影响,所以RPC架构也是紧耦合的模式,系统交互采用RPC私有TCP协议,服务生产者和消费者存在强代码依赖,异构系统集成不友好。 ESB中心化架构。ESB中心化架构实现了松耦合,依赖于ESB消息总线技术实现异构系统的信息交互和集成集中式架构管理,因此它虽然是面向服务的,但它本质上依旧是一个中心化的架构。其优势在于:基于WebService技术,重量级的消息通讯机制,我们称之为“智能管道哑终端”,当团队规模比较大、要实现异构系统集成时,它可以提供统一的解决方案和技术实现方式,快速集成异构系统对外服务。ESB中心化架构的问题也比较明显:中心化架构难以满足灵活性的服务迭代和需求交付。 微服务架构。微服务架构实现了系统解耦和持续集成,有清晰的服务边界,粒度相对ESB架构和传统SOA架构来说更小,使用轻量级的通讯机制交互,具备更强的扩展性和弹性,能够更灵活、更快响应业务变化。
业务维度,技术架构是由业务发展所处的时期和阶段决定的,技术架构要能够解决业务发展过程中的痛点。在进行架构选型时,需要考虑这个架构是否能满足当前业务的需求,业务需求能否随着架构的演进实现增量式的迭代。 技术维度,一方面要满足非功能需求,使得业务快速跟上技术生态的发展;另一方面出于商业的技术考量,比如去IOE、 去V、 采用开源的技术解决方案的需求,逐渐完成服务底层使用的商业软件的技术隔离,满足业务快速交付。
1.2 微服务架构的定义
微服务架构是一种架构模式,提倡将单⼀应⽤程序划分成⼀组⼩的服务。 服务之间采用轻量级的通信机制。 服务可以独立部署。 应当尽量避免统⼀的、集中式的服务管理机制。 具体的⼀个服务可以选择合适的语⾔、⼯具对其进⾏构建。
1)面向开发者和业务实现
拆分成粒度小的服务。 各自独立的进程实现服务运行隔离。 服务运行通过轻量级的基于HTTP协议的RESTful API的通信机制进行。 服务关注围绕业务领域之上构建。
2)面向服务的交付和运维
在服务交付方式上,强调可独立部署。 支持去中心化的设计,服务一般不需要集中化的管理。
1.3 如何筛选微服务
1)3种场景可以考虑使用微服务(Are you tall enough? )
规模大,团队超过10人。 业务复杂度高,系统超过5个子模块。 需要长期演进,项目周期超过半年。
2)其他因素筛选微服务
软件功能变化频繁,以快速迭代、缩短交付周期为核心的业务。 模块有独立的生命周期,微服务强调服务复用,减少重复造轮子,实现降本增效。 有独立的隔离性需求和扩展性需求(容错)。 简化的外部依赖。比如Facade模式场景,后端系统使用统一的对外暴露的形式提供服务。
1.4 如何拆分构建微服务
1)服务拆分
2)微服务构建
基准代码,建议项目使用一份基准代码、多份部署。项目在拆分时可能会存在多份基准代码,造成大量重复性的不同版本的代码共存的现象。在进行微服务构建时,需要把公共服务和公共代码抽取出来,统一支撑不同版本的业务。 显式依赖,显式声明依赖关系。对于 Java 程序,在 Gradle 或者Maven中写明依赖关系。 配置,在环境中存储配置。根据当前的环境变量决定使用什么样的配置文件。 后端服务,把后端服务当成一个附加资源。 构建、发布、运行的分离机制,强调服务和构建在运行时,不可以直接修改运行中的代码,而是需要通过构建发布流程统一发布。 无状态进程,以一个或多个无状态的进程运行应用。
1.5 微服务架构2种建设思路
1)SDK模式
优势:面向应用和开发人员,定制化、协议支持灵活,适合完全自治的服务状态,方便线下调试,对操作系统平台无依赖。 缺点:应用需引入额外SDK依赖包,SDK本身占用内存及系统资源,对业务是侵入性的;需要构建微服务基础设施做业务能力支撑;需要使用SideCar模式实现异构系统集成。
2)ServiceMesh模式
优势:不需要额外引入SDK依赖包,对应用无侵入,且对Kubernetes天然友好支持。 缺点:部署比较复杂,对底层系统有一定的依赖;通讯协议类型支持受限,需要依赖Mesh平台兼容。
二、SpringCloud微服务生态体系介绍
面向开发者,以开发者为中心,开发者生态友好。 以Java技术栈为主要开发语言,代码可复用,微服务转型成本低。 基础设施完备,提供端到端的微服务架构解决方案。 有很多大厂做背书,如Pivital、Netflix,、alibaba等公司都是其生态和源代码贡献者,技术经历过大规模商业应用的考验。
2.1 SpringCloud的技术生态
SpringCloud本身也是一个逐渐演进的架构模式:最早是基于IOC/AOP的编程思想产生的;然后在Spring的基础上发展出SpringBoot,基于注解的方式实现快速的应用开发;后来在SpringBoot的基础上开发出SpringCloud底层微服务构架。
2.2 微服务和SpirngCloud架构的复杂性
三、宜信微服务架构和SIA网关的四种模式
SpringCloud提供的框架或基础设施是一个半成品,我们在SpirngCloud的基础上进行了二次开发,抽象和封装了一些微服务架构的通用基础设施平台,不同的业务团队共享这些基础设施,降低技术学习和接入成本,让业务团队更专注于业务逻辑的实现,聚焦业务开发。
3.1 宜信微服务架构
微服务网关,sia-gateway使用了去中心化的网关接入方案。 元数据服务层,用Eureka-plus和sia-config对注册中心Eureka和配置中心做了增强与优化。 任务管理,基于微服务的思想,开发和开源了微服务任务调度平台SIA-TASK。 容器平台,实现了快速的自动化构建、部署和服务编排。 DevOps,微服务的交付频率、速度比较快,需要有持续集成、持续开发工具和手段来保障项目质量和服务正常运行,对此我们有自研的UAVStack监控系统、自动化测试系统等工具链。
3.2 SIA微服务网关架构
网关组,网关组里封装了两种网关:同步网关和异步网关。 OAM,自助式网关管理平台,所有业务节点的生命周期管理都通过这个模块来进行。
3.3 SIA微服务网关的4种模式
1)同步托管式
优点:网关交付对业务方完全透明;只要在容器平台申请一个网关资源,就可以得到网关服务;基于Filter开发运维简单,容量小。 缺点:定制化不够强。
2)同步注解式
优点:对项目的控制力比较强,业务团队独立运维,支持扩展定制化;基于Filter开发运维简单,容量小。 场景:业务定制化场景比较多。如果要加载初始化、加大资源,或对业务的Filter拦截机制有定制化需求,都可以用同步注解模式。
3)异步托管式
4)异步注解式
3.4 SIA微网关的核心Feature
数据面,负责数据包的处理逻辑。路由转发、负载均衡、灰度发布、日志审计、熔断限流等都是从数据层面对流量进行管理。 控制面,负责服务粒度上的管理。统一视图管理、多租户管理、注册中心、配置管理、路由组件绑定等是从控制层面来保障和管理服务。
3.5 SIA微网关对微服务的生命周期管理
Swagger UI、模块复用对应服务文档中心模块的功能。 动态路由、共享能力集中在分布式网关节点。 日志管理、管控组件是网关Master提供的功能。
服务文档中心,对应整个软件生命周期的初期开发和设计阶段,网关提供一个个统一的API视图,前端和后台可以通过Swagger UI来联调开发。 分布式网关节点,在开发和部署阶段会涉及到一些共享能力的部署和运行。 网关Master,在运维阶段通过自动化运维提高运维效率;在管理方面,提供数据统计的功能,生成数据报告用于管控。
3.6 总结:微服务架构与中台&后台
SOI-敏态业务:比如互联网业务,需求变更快,要求快速迭代 、快速交付。 SOR-稳态业务: 比如传统业务,变更周期⻓、变化频率低、变化成本高、变化⻛险高。 SOD-中台业务: 齿轮匹配失衡,中台就像是在前台与后台之间添加的⼀组“变速⻮轮”,将前台与后台的速率进行匹配,提升⽤户响应力。
四、应用场景及典例分析
4.1 分解&聚合
4.2 复用&个性化
4.3 API&契约
4.4 容错&保护
4.5 监控&治理
4.6 统计&分析
五、微服务化架构建设遇到的问题
5.1 设计初期的问题
1)如何隔离业务网关,同时有统一的管理视图?
2)平台型系统建设初期是否要考虑同步异步网关融合?
5.2 使用开源方案的问题
3)开源系统本身的bug
4)系统的性能问题
5.3 上线生产运维方面的问题
5)如何克服Eureka注册中心的CAP问题?
6)SpringCloud与SpirngBoot不同版本的兼容问题? K8S平台与微服务注册中心状态同步?
【本文是51CTO专栏机构宜信技术学院的原创文章,微信公众号“宜信技术学院( id: CE_TECH)”】