使用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服务。

协议名称 配置值 服务定义方式 默认端口 传输层协议 序列化协议 是否默认
triple tri - Java Interface
- Java Interface+SpringWeb注解
- Java Interface+JaxRS注解
- Protobuf(IDL)
50051 HTTP/1、
HTTP/2
Protobuf Binary、
Protobuf-json
否
dubbo dubbo - Java Interface 20880 TCP Hessian、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>3.1.2</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

评论