dubbo RPC协议

RPC协议

协议概述

Dubbo作为一款RPC框架内置了高效的RPC通讯协议,帮助解决服务间的编码与通讯问题,目前支持的协议包括:

  • triple,基于HTTP/1、HTTP/2的高性能通讯协议,100%兼容gRPC,支持Unary、Streming等通讯模式;支持发布REST风格的HTTP服务。
  • dubbo,基于TCP的功性能私有通讯协议,确定是通用性较差,更合适在Dubbo SDK间使用。
  • 任意协议扩展,通过扩展protocol可以支持任意RPC协议,官方生态提供JsonRPC、thrift等支持。

协议选型

协议 性能 网关友好型 流式通信 对语言支持 编程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

tripe协议

编程模式

使用triple协议时,开发者可以使用 Java Interface、Protocol(IDL)两种方式定义RPC服务,两种服务方式的协议能力是对等的,进影响开发者的编程体验、序列化方式。

Java接口

适用于Dubbo老用户、没有跨语言诉求的开发团队,具备学习成本低的优势。
在该模式下,序列化方式可以选用Hessian、JSON、Kryo、JDK、自定义扩展等任意编码协议。在使用体验上,和老版本的dubbo协议没有任何区别,只需要改一个protocol配置项即可。
配置

dubbo:
  protocol:
    name: tri
    port: 50051

Protocol

省略

REST支持

通过为Java接口增加注解,可以发布rest风格的triple服务。

Spring Web注解

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
JAX-RS注解

参考dubbo http流量接入dubbo后端服务

Dubbo协议

简介

dubbo缺省采用的是单一长连接和NIO异步通讯,适用于小数据量、大并发的服务调用,以及服务消费者机器数量远大于服务提供者机器数的情况。
dubbo缺省协议不适合传送大数据量的服务,比如传文件、传视频,除非请求量很低。

  • 长连接:避免了每次调用新建tcp连接,提高了调用的响应速度。
  • 多路复用:单个tcp连接可交替传输多个请求和响应信息,降低了连接的等待空闲时间,从而减少了相同并发下的网络连接数,提供了系统吞吐量。

缺省协议 约束

  • 请求和返回参数都要实现Serializable 接口
  • 参数与返回值不能自定义实现ListMapNumberDateCalendar 等接口,只能使用jdk自带的实现。因为hessian会做特殊处理,自定义属性会丢失。
  • hessian序列化只序列化成员属性,不序列化静态变量和方法。

配置

dubbo:
  protocol:
    name: dubbo
    port: 20080

多协议

在同一个进程中可以同时发布多个RPC协议,调用不同的RPC协议。

使用场景

  • 作为服务提供者(provider),同一个服务发布为多个协议,供不同消费端调用。
  • 作为服务提供者(provider),多个服务分别发布为不同协议,供不同消费端调用。
  • 作为服务消费者(consumer),指定以某个特定协议调用某一个服务。

使用方式

同一个服务发布为多个协议

设置协议配置

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

你可能感兴趣的:(dubbo,dubbo,网络协议)