1.1 ServiceComb综述
1.1.1 什么是ServiceComb
ServiceComb是华为云PaaS部门在2017年开源的微服务开发框架,它提供了Java和Go语言的微服务开发框架、微服务注册中心,还提供了基于Sagas的数据一致性实现的ServiceComb Saga。
ServiceComb微服务开发框架和注册中心已经在华为内部多个系统中广泛应用。同时,作为第一个进入Apache基金会做微服务框架项目,ServiceComb期望有更多的用户使用和参与到项目中,为传统企业的微服务化转型贡献力量。读者可以在本书资源列表中找到ServiceComb的主页,相关代码库以及文档。
ServiceComb目前已经开源的项目包括:
ServiceComb后续会开源更多的项目,包括Service Mesh的工具Mesher等。
Chassis(中文为底盘的意思)是由Chris Richardson提出的一种微服务模式。它强调用户并不需要自己去处理构建微服务过程中外部配置、日志、健康检查、分布式追踪等横切关注点(Crosscutting Concern),而是通过专门的框架来处理。从而可以更聚焦于业务逻辑本身,简单、快速地开发微服务。
1.1.2 为什么选择ServiceComb
“造轮子”对于开发人员个人而言可能是磨练技术的好机会,但是对于公司而言却是耗时耗力,是吃力不讨好的事情。那么为什么ServiceComb团队要开发新的微服务开发框架,而不是直接使用现有的微服务开发框架呢?
随着微服务架构的不断发展,微服务开发框架也一直在不断演进,以现代企业微服务架构的需求去重新审视一些老牌的微服务开发框架,比如Spring Cloud和Dubbo,会发现其存在一些局限性:
注:当当网的开发人员基于Dubbo改造出了DubboX,支持REST,而Dubbo在沉寂多时后,也重新开始维护。不过Dubbo 3.0和旧版并不能有效地兼容。
所以从性能、可维护性、可移植性、微服务治理的功能等纬度出发,ServiceComb团队选择自研微服务开发框架。当然也不是一切重头开始,他们重用了开源项目中优秀的组件,比如Netflix OSS、Netty等。同时,重新设计了注册中心,并且实现了基于Saga的分布式事务解决方案Sagas。
此外,对于某些特定领域的系统,需要运行在资源受限的环境中,基于JVM的某些框架无法满足。而Golang对与资源、性能和开发效率的兼顾,除了可以开发高性能的服务,也便于移植原来基于C语言的系统。这也是ServiceComb开发了Go Chassis SDK的原因。了解了ServiceComb团队造轮子背后的原因,接下来进入正题,揭开ServiceComb神秘的面纱。
1.1.3 ServiceComb Java Chassis框架
ServiceComb Java Chassis框架架构,如图1-1所示。
图1-1 ServiceComb Java Chassis框架架构
就微服务开发框架而言,ServiceComb Java Chassis提供了其他微服务开发框架,诸如服务注册发现、REST和高性能RPC通信、服务治理的常见功能。除此之外,还具备以下五方面的特点。
对比当前流行的微服务开放框架Spring Cloud,ServiceComb提供了集成度更高的封装,以及更容易的开发门槛。用户不必像Spring Cloud那样对运行中所需要的组件一个个集成。另外,如果用户希望同Spring Boot和Spring Cloud组件一起使用,也可以直接以Starter的方式引用ServiceComb的能力。
1.1.4 Go Chassis框架
除了Java SDK外,ServiceComb还提供了Go SDK-Go Chassis。Go Chassis是快速实现微服务的Go语言开发框架,作为微服务开发框架,提供服务之间轻量级的通信机制是框架基本功能。Go Chassis默认支持RESTful和RPC两种通信方式,支持JSON和Protobuf两种序列化方式,支持配置TLS证书。除此之外,和Java Chassis类似,Go Chassis也提供了服务注册发现、动态配置、服务治理、监控日志数据上报等功能。
1.1.5 注册中心ServiceCenter
注册中心是微服务系统中非常重要的组件,主要用于解决微服务的注册发现的动态路由问题。市面上可以用作注册中心的工具也有很多,比如Zookeeper、Consul、Eureka、ETCD等。然而在一个大型的微服务系统中,除了这些动态路由信息外,还需要管理微服务自身的元数据。因此,服务管理中心需要包含微服务静态元数据定义的功能。并通过其提供的接口可以很方便地检索微服务信息。这样的需求是现有的注册中心无法满足的。
所以,ServiceComb团队重新开发了注册中心,并称之为ServiceCenter。ServiceCenter是一个具有微服务实例注册/发现能力的微服务组件,它提供一套标准的RESTful API对微服务元数据进行管理。ServiceComb的微服务注册及动态发现能力也是依赖其实现的。ServiceCenter基于Go语言实现,其后端存储使用了ETCD。为了方便使用,ServiceCenter还提供了Web界面,可视化的去管理和查询在注册中心上登记的微服务、接口信息。
微服务元数据包含哪些内容?除了微服务本身信息属于静态元数据外,ServiceCenter还扩展了微服务依赖关系、黑白名单、Tag标签和契约信息等元数据。这些微服务元数据不仅把实例信息分组管理起来,同时也满足了用户对微服务管理的需要。比如微服务的黑白名单,而业界的服务注册中心大多仅实现了consumer服务依赖的服务实例发现,但没法对一些安全要求高的服务设置白名单访问控制,ServiceCenter支持给这类provider服务设置黑白名单过滤规则,防止恶意服务并发现DDoS攻击。
除了以上描述的微服务动态发现外,ServiceCenter还具有以下特性:
1.1.6 数据一致性框架Saga
通常微服务的分布式特性,决定了在对事务处理时,不能像过去单体应用下,在单个RDMS内去完成事务。在“3.1.6数据一致性”小节中介绍了数据一致性的解决方案,如2PC、3PC、TCC和Saga。并介绍了Saga相比2PC和TCC的好处,即比2PC 提交更易扩展,对于事务可补偿的应用,Saga相比TCC几乎不需要改动业务逻辑,性能更好。同时,集中式的Saga设计解耦了服务与数据一致性逻辑及其持久化设施,并使排查事务中的问题更容易被解决。
ServiceComb团队基于Saga,使用实现了数据一致性解决方案Saga,在“7.5 数据一致性框架Saga”小节中将解释了Saga的架构以及处理机制。本节简要的介绍了ServiceComb各个组件的特性,接下来的章节将逐一详解每个组件的原理。
1.2 Java Chassis
从7.1节中关于ServiceComb介绍不难看出,ServiceComb的设计理念在于一方面连接组织和开发人员,另一方面连接异构系统。组织和开发人员的复杂性来源于技能的多样性,大家使用不同的开发语言,即便是相同的开发语言也会存在多个开发方式,多种通信协议。
在连接组织和开发人员方面,ServiceComb有Java和Go微服务SDK,并且Java SDK支持三种开发方式,同时通过中立的机制——统一标准的契约来促进团队之间的高效沟通,通过支持Open API规范使得跨语言、跨开发方式的设计都能真正落地。在连接异构系统方面,ServiceComb重构了REST底层通信实现,使用基于Netty的异步框架重新实现,性能强大,而基于RPC的Highway的性能要更好。通信协议和业务代码的解耦,也满足了新旧系统兼容的通信场景。
Java Chassis系统模块和代码结构
Java Chassis提供了灵活的编程、通信以及运行模型,在实际的项目中,用户可以按照需求通过模块化的形式引入自己需要的组件,如下表所示,任意选择RPC/ SpringMVC/JAX-RS的编程模型,以及REST或者Highway的通信模型,对于运行模型,根据自己的需求,选择引入负载均衡模块、微服务治理及调用链。
类型 | artifact id | 是否可选 | 功能说明 |
---|---|---|---|
编程模型 | provider-pojo | 是 | 提供RPC开发模式 |
编程模型 | provider-jaxrs | 是 | 提供JAX RS开发模式 |
编程模型 | providerspringmvc | 是 | 提供Spring MVC开发模式 |
通信模型 | transport-restvertx | 是 | 运行于HTTP之上的开发框架,不依赖WEB容器,应用打包为可执行jar |
通信模型 | transport-restservlet | 是 | 运行于WEB容器的开发框架,应用打包为war包 |
通信模型 | transport-highway | 是 | 提供高性能的私有通信协议,仅用于Java之间互通 |
运行模型 | handlerloadbalance | 是 | 负载均衡模块。提供各种路由策略和配置方法。一般客户端使用 |
运行模型 | handler-bizkeeper | 是 | 和服务治理相关的功能,比如隔离、熔断、容错 |
运行模型 | handler-tracing | 是 | 调用链跟踪模块、对接监控系统、吐出打点数据 |
如图所示,Java Chassis核心代码大概分为7个模块。
图1-2 ServiceComb代码模块图(注:图中Vertx即Vert.x)
Handler运行模型对应的调用跟踪、流控、负载均衡等实现,可自行扩展实现,并配置Handler链的顺序。Handler链就是一系列的invocation.next()调用过程,可以设计请求经过的代码逻辑,内置回调的过程。相比Servlet的Filter,Handler链具备更强的开发灵活性。
通信模型对应REST、Highway RPC两种协议,都是基于Vert.x开发的,Vert.x本身又是基于异步通信框架Netty。REST 协议使用JSON编解码,Highway协议使用Protobuf编解码。
了解了Java Chassis的组件以及代码结构,读者可能迫不及待地想通过实例动手体验。推荐读者访问本书资源列表中提到的“ServiceComb Java Chassis BMI微服务案例”,通过体质指数微服务的开发来体验使用Java Chassis带来的好处,也可以直接阅读“10.1 使用Java Chassis实现商品服务”部分,跟随SockWorks的开发团队一起使用Java Chassis开发微服务。更多关于ServiceComb Java Chassis的内容,可以访问本书资源列表中的ServiceComb网站、博客、代码库等。