几种微服务框架调研报告

开发 架构
微服务架构旨在将大型,复杂的系统垂直(按功能或业务要求)划分为较小的子系统,这些子系统属于流程(因此可独立部署),并且这些子系统之间通过与语言无关的轻量级网络通信相互通信(例如REST,gRPC)或异步(通过消息传递)方式。

一、引言

1.1 微服务的目的

以拆分和服务化为基础,将海量用户产生的大规模的访问流量进行分解,采用分而治之的方法,达成用户需要的功能指标,并同时满足用户对高可用、高性能、可伸缩、可扩展和安全性的非功能质量的要求。

1.2 微服务的核心要点

业务的功能划分:每个单一的业务功能叫做一个服务,每个服务对应一个独立的职能团队。

去中心化治理:微服务倡导去中心化的治理,不推荐每个微服务都使用相同的标准和技术来开发和使用服务。

交互模式:在微服务领域,微服务之间的交互通过定义良好的接口来实现,不允许使用共享数据来实现。通常使用RESTful样式的API或者透明的RPC调用。

组合依赖:根据业务流程处理的需要,以一定的顺序调用依赖的多个微服务,对依赖的微服务返回的数据进行组合、加工和转换,最后以一定的形式返回给使用方。

容错模式:

 熔断

当服务的输入负载迅速增加时,如果没有有效的措施对负载进行熔断,则会使服务迅速被压垮,服务被压垮会导致依赖的服务都被压垮,出现雪崩效应,因此,可通过模拟家庭的电路保险开关,在微服务架构中实现熔断。

限流

针对服务突然上量,我们必须有限流机制,限流机制一般会控制访问的并发量,例如每秒允许处理的并发数及查询量、请求量等,实现方式如计数器,令牌桶等。

拆分粒度:

按照微服务的初衷,服务要按照业务的功能进行拆分,知道每个服务的功能和职责单一,甚至不可再拆分为止,以至于每个服务都能独立部署,扩容和缩荣方便,能够有效地提高利用率。拆的越细,服务的耦合度越小,内聚性越好,越适合敏捷发布和上线。

1.3 微服务的优点与缺点

优点

  • 每个微服务都很小,这样能聚焦一个指定的业务功能或业务需求;
  • 微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成;
  • 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的;
  • 微服务能使用不同的语言开发;
  • 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值;
  • 微服务允许你利用融合最新技术;
  • 微服务只是业务逻辑的代码,不会和HTML,CSS 或其他界面组件混合。

缺点

  • 微服务架构可能带来过多的操作;
  • 需要DevOps技巧;
  • 可能双倍的努力;
  • 分布式系统可能复杂难以管理;
  • 因为分布部署跟踪问题难;
  • 当服务数量增加,管理复杂性增加。

下文将介绍下几种微服务架构的情况。

二、Spring Cloud

2.1 整体架构

图片

图片

模块交互流程图

2.2 核心组件

图片

2.3 特点

1️⃣ Spring Cloud利用SpringBoot的开发便利性巧妙的简化了分布式系统基础设施的开发,组件支持丰富,功能齐全,为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等。它们都可以用SpringBoot的开发风格做到一键启动和部署;

2️⃣ 使用 HTTP 协议的 REST API,服务提供方和服务消费方通过 Json 数据格式交互,只需要定义好相关 Json 字段即可,消费方和提供方无接口依赖。通过注解方式来实现服务配置,对于程序有一定入侵;

3️⃣ 性能上因为是HTTP短连接,系统并发量和响应时间不及RPC长连接方式(如Dubbo,相差三倍左右),在报文比较小,响应时间要求严格的场景不太适合;

4️⃣使用spring boot admin作为服务基本情况监控,原理是Spring Boot Actuator组件;

5️⃣ 部分组件的功能及稳定性并未达到生产级别,使用者不多,需要引入其他功能相似组件。

三、Dubbo

Dubbo是一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效及多样性服务治理方案,可以和Spring框架无缝集成。

3.1 整体架构

图片

  • Provider:暴露服务的服务提供方;
  • Consumer:调用远程服务的服务消费方,使用软负载均衡算法;
  • Registry:服务注册与发现的注册中心,如Zookeeper、Redis等;
  • Monitor:统计服务的调用次数和调用时间的监控中心,服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心;
  • Container:服务运行容器;

图片

Dubbo分层结构设计图

  • config配置层

对外配置接口,以ServiceConfig, ReferenceConfig为中心,可以直接初始化配置类,也可以通过spring解析配置生成配置类;

  • proxy服务代理层

封装了所有接口的透明化代理,而在其它层都以Invoker为中心,只有到了暴露给用户使用时,才用Proxy将Invoker转成接口,或将接口实现转成Invoker,也就是去掉Proxy层RPC是可以Run的,只是不那么透明,不那么像调本地服务一样调远程服务;

  • registry注册中心层

封装服务地址的注册与发现,以服务URL为中心,扩展接口为 RegistryFactory, Registry, RegistryService;

  • cluster路由层

封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为 Cluster, Directory, Router, LoadBalance;

  • monitor监控层

RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为 MonitorFactory, Monitor, MonitorService;

  • protocol远程调用层

封装RPC调用,以Invocation, Result 为中心,扩展接口为Protocol, Invoker, Exporter,Protocol是核心层,也就是只要有Protocol + Invoker + Exporter就可以完成非透明的RPC调用,然后在Invoker的流程中实现Filter拦截点;

  • exchange信息交换层

封装请求响应模式,同步转异步,以Request, Response为中心,扩展接口为Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer;

  • transport网络传输层

抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel, Transporter, Client, Server, Codec;

  • serialize数据序列化层

可复用的一些工具,扩展接口为Serialization, ObjectInput, ObjectOutput, ThreadPool。

3.2 核心组件

图片

图片

Spring Cloud与Dubbo功能对比

3.3 特点

图片

图片

四、Spring Cloud Alibaba

4.1 整体架构

类似Spring cloud的架构,适配集成Alibaba的多种中间件,注册中心换成了Nacos,限流熔断从Hystrix换成了Sentinel,服务间调用可以使用Dubbo,使用RocketMQ作为消息总线及事件驱动组件,用Seata组件(前身是fescar)支持分布式事务功能,目前最新版本是2.1.0.RELEASE。

图片

4.2 核心组件与特点

图片

图片

Nacos基本架构

图片

Sentinel 的主要特性

图片

Sentinel 的开源生态

图片

与spring cloud相关组件对比

图片

几种服务治理组件对比

使用demo:https://www.jianshu.com/p/9a8d94c0c90c。

五、Service mes

5.1 整体架构

如下是简化的Service Mesh架构,服务A和服务B相互调用,不再是以前通过微服务框架直接指向的方式,而是在中间加了两个叫做Sidecar(边车)的东西,各种服务都在这里处理数据上的逻辑。Sidecar的作用是数据面的代理,贴近数据并受控于控制面。

图片

基本架构图

实际业务中,尤其是中台架构下,企业往往需要很多的微服务,即服务A、服务B相互调用情形不断扩展,逐渐形成更多的服务加Sidecar的组合,就变成了一个真正意义的Service Mesh。

图片

服务的网格化(mesh)

5.2 核心组件

图片

Istio架构图

主流云原生Service Mesh框架是Istio,Go语言实现,与容器编排系统Kubernetes一脉相承,下面介绍其主要组件,目前Istio版本为1.3.x release:

图片

5.3 特点

1、Service Mesh所带来的核心价值可以总结为:

  • 基础设施下沉 —— 微服务架构支撑、网络通信、治理等相关能力下沉到基础设施层,业务部门无需投入专人开发与维护,可以有效降低微服务架构下研发与维护成本;
  • 降低升级成本 —— Sidecar支持热升级,降低中间件和技术框架客户端、SDK升级成本;
  • 语言无关 —— 提供多语言服务治理能力;
  • 降低复杂测试、演练成本 —— 降低全链路压测、故障演练成本和业务侵入性。

2、数据面以Envoy Proxy作为代理组件。通过Outbound流量拦截或显示指向Envoy Proxy地址的方式代理发起请求流量,经过Envoy Proxy的服务发现、负载均衡、路由等数据面逻辑后,选择目标服务实例地址进行流量转发;在Inbound流量接收端进行流量拦截(可配置是否拦截),对Inbound流量进行处理后转发至目标服务实例。

3、控制面以Pilot为核心组件。通过建立与Envoy Proxy双向GRPC连接,实现服务注册信息、服务治理策略的实时下发与同步。其他控制面组件Mixer(策略检查、监控、日志审计等)、Citadel(认证与授权)、Galley(配置检查)可在实际场景中配置关闭。

4、平台开放与扩展主要通过Kubernetes CRD与Mesh Configuration Protocol(简称为MCP,一套标准GRPC协议)。平台默认支持Kubernetes基于ETCD的注册中心机制,可通过MCP机制对接更多诸如Consul、Eureka、ZooKeeper等多注册中心;对服务治理策略的配置可通过定义Kubernetes CRD或实现MCP GRPC服务对接实现。

5、高可用设计主要基于Kubernetes及Istio机制实现。数据面Envoy Proxy以Init-Container方式与业务Container同时启动,Istio提供了Pilot-agent组件实现对Envoy Proxy生命周期、升级的支持,保证Envoy Proxy的高可用。控制面所有Istio组件均由Kubernetes多副本探针机制保证高可用性。Istio目前支持服务部署于Kubernetes、使用Consul注册服务、服务运行于单个虚拟机上集成,自定义 Istio的策略执行组件可以扩展和定制,以及与acl、日志记录、监视、配额、审核等现有解决方案集成。

6、Alibaba的对Istio架构的改造落地实践:https://zhuanlan.zhihu.com/p/96720618。

实践方案中放弃Istio 通过 iptables 的 NAT 表去做流量透明拦截的方式(NAT 表所使用到的 nf_contrack 内核模块效率很低),自研全新的透明拦截组件mangle;也没有采用 Istio 中的 Mixer 组件,用内部广泛使用的 Sentinel 组件替代,每个请求都会经过 Sentinel Filter 做处理。限流所需的配置信息则是通过 Pilot 从 Nacos 中获取,并通过 xDS 协议下发到 Envoy 中,实践中Service Mesh 的引入对于 RT 的影响和带来的 CPU 开销是基本一样的,而内存开销则因为依赖服务和集群规模的不同而有相当大的差异,Envoy 在内存的使用上仍存在很大的优化空间。

7、Service Mesh 离普及还面临一定挑战:

(1)性能尚存问题,服务间调用因为两层Sidecar,请求链路多两跳;Istio Mixer集中式后端成为性能瓶颈;

(2)Istio架构复杂,一定的技术门槛,掌握和实施成本较高,稳定性及产品化应用有待验证;

(3)真实落地的产品和企业还是比较少,提供的经验比较欠缺。

六、Service Comb

2018年10月24日, Apache软件基金会宣布Apache ServiceComb 毕业成为Apache顶级项目。Apache ServiceComb已在数十家企业中使用,包括奇蛙智能科技、华为云、软通动力,传智播客、梅斯医学、文思海辉、中国人保和同济大学等。

6.1 整体架构

图片

6.2 核心组件

图片

6.3 特点

1、异步内核:基于VertX的同步和异步模型编程有效确保了无论是在传统企业或电商领域,还是在新兴的互联网或物联网等新兴企业中,都能够保持高性能和低延迟,以避免在达到峰值负载时应用出现雪崩效应;

2、ServiceComb支持多种通信协议, Rest、Highway(RPC)等,相比SpringCloud的Rest协议,Highway(RPC)协议性能更高,Highway是基于二进制的序列化方式传输数据,采用二进制编码的系统的性能远高于采用文本的HTTP协议;

3、开箱即用体验,开发简单,开发人员通过脚手架网站start.servicecomb.io启动的微服务项目,可以集服务注册、发现、通信和微服务治理能力和默认的集中化配置为一体;

4、ServiceComb的商业版本CSE相比SpringCloud不仅提供了微服务开发框架,还提供了微服务云部署,管理、治理等一站式解决方案;

5、OpenAPI自动代码生成,业务逻辑代码和治理能力隔离,可以使能DevOps Pipeline, 使用契约文件和OpenAPI的双向生成能力可以使不同的团队高效且独立的开发和管理代码、测试和进行文档化工作;

6、官网上的文档资料比较简略,网上可借鉴的实现案例不多,demo:https://blog.csdn.net/zengdongwen/article/details/93486257。

责任编辑:庞桂玉 来源: 移动Labs
相关推荐

2020-07-17 08:31:37

网络安全数据安全技术

2021-03-02 16:25:52

微服务架构技术

2020-11-27 10:50:06

微服务架构框架

2024-04-19 08:49:50

微服务RPC事件驱动

2018-01-04 10:05:44

IT预算

2010-01-04 16:07:35

Office市场分析

2013-06-03 17:07:08

思科调研报告VNI报告思科

2019-07-12 08:45:07

开源微服务框架

2021-12-02 16:20:17

开源微服务框架

2022-02-20 22:10:20

微服务框架gRPC

2016-06-29 11:24:05

2011-11-04 10:34:27

文件服务器中小企业调研报告

2021-01-18 15:46:10

JavaScript开发 编程

2011-07-20 14:40:03

2022-08-30 08:01:22

Apifox自动化测试

2011-09-09 11:12:59

IBMCIO

2023-01-12 08:00:00

SpringClou微服务框架

2024-06-05 06:43:20

点赞
收藏

51CTO技术栈公众号