Dubbo

Dubbo是一个阿里巴巴开源的分布式服务框架,早期主要是实现了SOA架构,包括服务注册、服务发现和远程调用。最近Dubbo社区在努力的向SpringCloud学习,把SpringCloud的核心功能特征纷纷引入Dubbo框架或者是开发了替代品。

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。【来源:https://baike.baidu.com/item/Dubbo/18907815

针对Dubbo,Flomesh主要做了几个方面的工作:

  • 开发了REST和Dubbo互相转换的工具和能力--Dubbo网关。Dubbo官方有类似的项目:Dubbo Proxy : https://github.com/apache/dubbo-proxy。对比这个项目,主要的差异在于:
    • Dubbo网关采用C++开发,执行效率更高,占用资源更少,更适合在容器环境里以Sidecar模式工作
    • 提供了一些Dubbo Proxy没有的功能,比如"接口录制"等工具
  • 提供了Dubbo RPC之上的流量管理能力,可以在RPC层实现限速
  • 辅助部署的脚本和参考例子,比如用于kubernetes的yaml文件等

官网地址:http://dubbo.apache.org

开源地址:https://github.com/apache/dubbo

Dubbo网关

Dubbo在服务间调用的时候,原生的服务治理实现是基于SDK的;Flomesh团队开发了Dubbo网关,用sidecar的方式实现服务治理;同时Dubbo网关提供了REST和RPC之间的转换能力,打通了Dubbo和其他常见服务体系。

接口录制

当把Dubbo服务对外暴露成REST的时候,有两种做法:一种是在代码中声明protocol=rest,一种是在Dubbo的RPC服务之上通过一层转换实现。Flomesh的Dubbo网关和Duboo社区的DubboProxy都是第二种。在第二种的使用场景下,REST的请求方需要发送一个“符合”Hession格式的JSON,其中包含接口的描述。这个JSON需要有特定信息和格式,可以认为是“Hession Schema”,虽然可以手工写这个JSON,但是更方便的办法是用“接口录制”的办法获取。这里我们介绍如何用Flomesh的Dubbo网关录制这个接口。

服务健康检查

Dubbo在RPC模式下,并没有服务健康检查的能力。实际上早期的SOA体系都缺乏对这些能力的支持,后来Spring引入了actuator组件,可以方便的以REST方式对外提供健康检查和指标监控的接口,这极大的方便了微服务对外提供“可观察、可监控”能力,而这些能力是“云原生”的基础。Dubbo在2018年初引入了dubbo-spring-boot-actuator模块,可以通过REST方式提供这些接口。但是该功能一方面无法支持低版本的Dubbo,一方面在RPC模式下需要引入很多spring-web相关的依赖,所以我们通过Dubbo网关来实现相同的能力。

用REST方式访问Dubbo服务的演示

这里我们演示一个使用REST访问Dubbo服务的例子。原生的Dubbo支持通过Annotation把服务对外暴露成REST,但是实际中多数Dubbo服务都是按照“内部使用”设计和开发的,和REST风格有些差异。这里我们演示一个例子,使用标准的Dubbo服务做后台,通过Flomesh的配置,使服务对外暴露成REST,让他“看起来就像一个REST”。

如果对这个例子背后的设计和实现感兴趣,可以参考这个“手工”的处理方式。