Skip to content

使用Dubbo

1. 协议选型

如何确定使用哪一种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性能最高的私有协议,
但前端流量接入、
多语言支持等成本较高

RPC协议官方推荐使用triple,它在Dubbo3.3之后,将REST协议重新整合triple方式中提供http服务。

协议名称配置值服务定义方式默认端口传输层协议序列化协议是否默认
tripletri- Java Interface
- Java Interface+SpringWeb注解
- Java Interface+JaxRS注解
- Protobuf(IDL)
50051HTTP/1、
HTTP/2
Protobuf Binary、
Protobuf-json
dubbodubbo- Java Interface20880TCPHessian、Fastjson2、
JSON、JDK、Avro、
Kryo 等

综合考虑我是用的是triple协议+Protobuf序列化方式

2. SpringBoot整合Dubbo

访问https://start.dubbo.apache.org/bootstrap.html,快速搭建微服务项目:
Alt text

2.1 创建父工程

创建dubbo-demo,添加pom依赖:

xml
<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-bom</artifactId>
            <version>3.2.17</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.18</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.2 创建子工程

创建子工程dubbo-provider01\dubbo-consumer01\dubbo-api分别配置依赖:

xml
<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>dubbo-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
xml
<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>dubbo-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
    </dependency>
</dependencies>

2.3 编写dubbo-provider01

yml
dubbo:
  registry:
    address: nacos://127.0.0.1:8848
    register-mode: instance
  protocol:
    name: tri
    port: 50051
  application:
    name: dubbo-provider01
    logger: slf4j
server:
  port: 6001
java
@EnableDubbo
@SpringBootApplication
public class ProviderMain {

    public static void main(String[] args) {
        SpringApplication.run(ProviderMain.class, args);
    }
}
java
@DubboService
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

2.4 编写dubbo-consumer01

java
@SpringBootApplication
@EnableDubbo
public class ConsumerMain {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerMain.class, args);
    }
}
java
@Controller
public class ConsumerController {
    @DubboReference
    private DemoService demoService;

    @RequestMapping("getPay")
    @ResponseBody
    public String getPay() throws Exception {
        String result = demoService.sayHello("world");
        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String dateStr = pattern.format(LocalDateTime.now());
        return "Receive result ======> " + result + dateStr;
    }
}
yml
dubbo:
  registry:
    address: nacos://127.0.0.1:8848
    register-mode: instance
  protocol:
    name: tri
    # 端口需要和provider不一样
    port: 50052 
  application:
    qos-enable: true
    name: dubbo-consumer01
    # 端口需要和provider不一样
    qos-port: 33333
    qos-accept-foreign-ip: false
    logger: slf4j

server:
  port: 6002

2.5 配置日志

log4j2.xml文件配置如下:

xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <loggers>
        <root level="DEBUG">
            <appender-ref ref="dubbolog"/>
        </root>
    </loggers>
    <appenders>
        <!--输出日志信息到控制台-->
        <console name="dubbolog" target="SYSTEM_OUT">
            <!--控制日志输出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
        </console>
    </appenders>
</configuration>

启动nacos后,在分别启动dubbo-provider01和dubbo-consumer01 运行结果:
Alt text