RPC协议
Dubbo作为一款RPC框架内置了高效的RPC通讯协议,帮助解决服务间的编码与通讯问题,目前支持的协议包括:
协议 | 性能 | 网关友好型 | 流式通信 | 对语言支持 | 编程API | 说明 |
---|---|---|---|---|---|---|
triple | 高 | 高 | 支持,服务端流、客户端流、双向流 | 支持,Java、Go、Node.js、JavaScript、Rust | Java Interface、Protobuf (IDL) | 在多语言兼容、性能、网关、Streaming、gRPC等放那最负载均衡的协议实现,官方推荐。支持application/json 格式payload http直接访问 |
dubbo | 高 | 低 | 不支持 | 支持,Java、Go | Java Interface | 性能最高的私有协议,但前端流量接入、多语言支持等成本较高 |
协议 | 配置值 | 说明 |
---|---|---|
Hessian | hessian | Hessian定义的RPC通讯协议 |
Spring HTTP | http | Spring定义的基于HTTP的私有协议 |
Apache Thrift | thrift | Thrift协议,具备高性能、支持多语言的特点 |
JSONRPC | jsonrpc | |
RMI | rmi | |
WebService | webservice |
使用triple协议时,开发者可以使用 Java Interface、Protocol(IDL)两种方式定义RPC服务,两种服务方式的协议能力是对等的,进影响开发者的编程体验、序列化方式。
适用于Dubbo老用户、没有跨语言诉求的开发团队,具备学习成本低的优势。
在该模式下,序列化方式可以选用Hessian、JSON、Kryo、JDK、自定义扩展等任意编码协议。在使用体验上,和老版本的dubbo协议没有任何区别,只需要改一个protocol配置项即可。
配置
dubbo:
protocol:
name: tri
port: 50051
省略
通过为Java接口增加注解,可以发布rest风格的triple服务。
maven
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
@RestController
@RequestMapping("/demo")
@DubboService
public class DemoService01Impl implements DemoService01 {
private static final Logger logger = LoggerFactory.getLogger(DemoService01Impl.class);
@GetMapping("/hello")
@Override
public String sayHello(String name) {
logger.info("------------------ {}", name);
return "Hello " + name;
}
}
调用方式
curl -X GET "http://localhost:8080/demo/hello?name=ddd"
或
curl --header "Content-Type:text/html" --data "name" http://localhost:50051/com.doudou.rpc.api.DemoService01/sayHello
参考dubbo http流量接入dubbo后端服务
dubbo缺省采用的是单一长连接和NIO异步通讯,适用于小数据量、大并发的服务调用,以及服务消费者机器数量远大于服务提供者机器数的情况。
dubbo缺省协议不适合传送大数据量的服务,比如传文件、传视频,除非请求量很低。
Serializable
接口List
、Map
、Number
、Date
、Calendar
等接口,只能使用jdk自带的实现。因为hessian会做特殊处理,自定义属性会丢失。配置
dubbo:
protocol:
name: dubbo
port: 20080
在同一个进程中可以同时发布多个RPC协议,调用不同的RPC协议。
设置协议配置
dubbo:
protocols:
dubbo-id:
name: dubbo
port: 20880
triple-id:
name: tri
port: 50051
服务发布
默认情况下,服务会发布到配置的所有协议上。
@DubboService(protocol = "triple-id,dubbo-id")
public class DemoServiceImpl implements DemoService {}
设置协议配置
dubbo:
protocols:
dubbo-id:
name: dubbo
port: 20880
triple-id:
name: tri
port: 50051
服务发布
@DubboService(protocol = "dubbo-id")
public class DemoServiceImpl implements DemoService {}
@DubboService(protocol="triple-id")
private class GreetingServiceImpl implements GreetingService {}
@DubboReference(protocol="dubbo")
private DemoService demoService;
@DubboReference(protocol="tri")
private GreetingService greetingService;
dubbo:
protocol:
name: dubbo
ext-protocol: tri