使用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,快速搭建微服务项目:
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 运行结果: