参考文档:
《八股文》微服务三十三问!mp.weixin.qq.com/s/K8O2TlVAQ…
Java Chassis3开发指南:servicecomb.apache.org/references/…
ServiceComb综述:cloud.tencent.com/developer/a…
目前业界主流的微服务框架:Dubbo、Spring Cloud Netflix、Spring Cloud Alibaba、ServiceComb。
| 特点 | Dubbo | Spring Cloud Netflix | Spring Cloud Alibaba | ServiceComb Java Chassis |
|---|---|---|---|---|
| 开发语言 | Java | Java | Java | 可配置的编程模型,支持异构 |
| 服务治理 | 提供完整的服务治理功能 | 提供部分服务治理功能 | 提供完整的服务治理功能 | |
| 服务注册与发现 | ZooKeeper/Nacos | Eureka/Consul | Nacos | 自研ServiceCenter |
| 负载均衡 | 自带负载均衡策略 | Ribbon | Ribbon\Dubbo负载均衡策略 | 提供非常丰富的负载均衡策略,包括az亲和、根据实例属性进行路由转发、轮询、随机、顺序、基于响应时间的权值等 |
| 服务调用 | RPC方式 | RestTemplate/Feign | Feign/RestTemplate/Dubbo | 可配置的通信模型,REST/HTTP/高性能的私有协议等 |
| 熔断器 | Sentinel | Hystrix | Sentinel/Resilience4j | 默认使用Resilience4j,业务可使用其他治理框架 |
| 配置中心 | Apollo | Spring Cloud Config | Nacos Config | 自研ServiceCenter |
| API网关 | Higress/APISIX | Zuul/Gateway | Spring Cloud Gateway | 自定义EdgeService/zuul+springcloudgateway/confd+nginx |
| 分布式事务 | Seata | 不支持分布式事务 | Seata | saga |
| 限流和降级 | Sentinel | Hystrix | Sentinel | 支持 Provider 限流和 Consumer 限流,算法:固定窗口/漏斗桶/令牌桶/自定义 |
| 分布式追踪和监控 | Skywalking | Spring Cloud Sleuth + Zipkin | SkyWalking或Sentinel Dashboard | zipkin。分布式调用链追踪系统,它能帮助用户收集时序数据用以定位微服务中的延迟问题,它同时管理追踪数据的收集 和查询 |
| 性能监控 | 应用性能监控的指标包括 请求各个环节的时延、线程池使用情况、连接池使用情况、CPU和网络使用情况等。提供metrics-core应用性能监控,将监控结果写入日志文件;也支持对接Prometheus。 | |||
| 微服务网格 | Dubbo Mesh | 不支持微服务网格 | Service Mesh(Nacos+Dubbo Mesh) | |
| 社区活跃度 | 相对较高 | 目前较低 | 相对较高 | |
| 孵化和成熟度 | 孵化较早,成熟度较高 | 成熟度较高 | 孵化较新,但迅速发展 |
ServiceComb
ServiceComb提供了Java Chassis和Go Chassis(是SDK),帮助开发者快速构建Java和Go语言的微服务。
注册中心ServiceCenter
ServiceCenter是一个具有微服务实例注册/发现能力的微服务组件,它提供一套标准的RESTful API对微服务元数据进行管理。ServiceComb的微服务注册及动态发现能力也是依赖其实现的。ServiceCenter基于Go语言实现,其后端存储使用了ETCD。为了方便使用,ServiceCenter还提供了Web界面,可视化的去管理和查询在注册中心上登记的微服务、接口信息。
微服务元数据包含哪些内容?除了微服务本身信息属于静态元数据外,ServiceCenter还扩展了微服务依赖关系、黑白名单、Tag标签和契约信息等元数据。
降级
降级策略是当服务请求异常时,微服务所采用的异常处理策略。
降级策略有三个相关的技术概念:“隔离”、“熔断”、“容错”:
-
“ 隔离”是一种异常检测机制,常用的检测方法是请求超时、流量过大等。一般的设置参数包括超时时间、同时并发请求个数等。
-
“熔断”是一种异常反应机制,“熔断”依赖于“隔离”。熔断通常基于错误率来实现。一般的设置参数包括统计请求的个数、错误率等。
-
“容错”是一种异常处理机制,“容错”依赖于“熔断”。熔断以后,会调用“容错”的方法。一般的设置参数包括调用容错方法的次数等。
把这些概念联系起来: 当“隔离”措施检测到N次请求中共有M次错误的时候,“熔断”不再发送后续请求,调用“容错”处理函数。
服务调用
Restful风格
RestTemplate是Spring提供的RESTful访问接口,ServiceComb提供该接口的实现类用于服务的调用。使用Restful风格开发消费者,需要关注Open API的Path、参数位置(Body、Header等)、参数类型以及响应类型,不用关注Provider的具体Ip。
RPC风格
RPC风格是一种语言有关的开发方法,更加贴近语言的使用习惯。访问服务提供者的服务,就像调用本地的API一样。
使用RPC风格,首先需要声明一个 interface 与提供者的服务对应。
interface HelloWorldService {
String helloWorld(String name);
}
声明 interface 会使用到 Open API 的 operationId、 参数名称和参数类型、响应类型。 只需要保证方法名等于operationId, 参数名称等于Open API里面的参数名称(对于body,使用扩展属性x-name)。
通信模型
通信模型一般包括两个核心功能:对象如何编码,比如采用Json还是采用proto-buffer;通信协议采用什么,比如采用HTTP还是采用私有TCP协议。 对象编码方式和通信协议的组合,称为通信模型。 Java Chassis的通信模型可以分成两类:REST 和 Highway。
- REST: 支持接口参数与HTTP Query、Path、Header、Body的映射关系。对象编码支持Json、proto-buffer、text等,通过Content-Type进行区分。通信协议采用HTTP协议族,比如HTTP、HTTPS、HTTP2(H2和H2C)。
- Highway: 对象编码支持proto-buffer。通信协议采用Java Chassis自定义的私有TCP协议。
线程模型:
Http Filter
某些场景中,业务使用http而不是https,作为网络传输通道,此时为了防止被伪造或篡改请求,需要提供consumer、producer之间对http码流的签名功能。签名功能使用HttpClientFilter和HttpServerFilter接口来承载。
API网关
微服务能力需要通过网关开放给用户、其他外部系统访问。网关一方面扮演着汇集用户请求的作用,同时扮演认证、鉴权、流量 控制、防攻击的用途。由于网关是一个汇聚点,容易形成业务的瓶颈,通常还会采用多级网关,外层的网关提供主备以及简单 的请求转发功能,内层网关实现鉴权等功能,多实例部署。常见的可以用于外层网关的技术和服务包括 LVS、DNS, Nginx 等,内层网关包括 spring cloud gateway、zuul 等。
ServiceComb 也提供了内层网关服务 Edge Service。