当前位置: 首页 > ai >正文

Dubbo(90)如何设计一个支持多协议的Dubbo服务?

设计一个支持多协议的Dubbo服务需要考虑以下几个方面:

  1. 服务接口设计:确保服务接口的定义可以被不同协议实现。
  2. 多协议配置:配置不同的协议,例如 Dubbo、HTTP、gRPC 等。
  3. 服务注册与发现:确保服务能够在多个协议下注册和发现。
  4. 客户端和服务端实现:在不同协议下实现客户端和服务端。
  5. 配置管理:确保配置文件和环境变量支持多协议。

以下是一个详细的设计步骤和代码示例,展示如何构建一个支持多协议的Dubbo服务。

1. 服务接口设计

使用 Java 接口定义服务接口。

1.1 创建服务接口模块(dubbo-api)

服务接口模块 dubbo-api 定义了服务接口。

1.1.1 创建 pom.xml

dubbo-api 模块中创建 pom.xml 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://www.w3.org/2001/04/xmldsig-more#"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>2.7.8</version></dependency></dependencies>
</project>
1.1.2 创建服务接口

dubbo-api/src/main/java/com/example/dubbo/api 目录下创建 UserService 接口:

package com.example.dubbo.api;public interface UserService {String getUser(String userId);
}

2. 创建服务提供者模块(dubbo-provider)

服务提供者模块 dubbo-provider 实现了服务接口并提供服务。

2.1 创建 pom.xml

dubbo-provider 模块中创建 pom.xml 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.w3.org/2001/04/xmldsig-more#"><parent><groupId>com.example</groupId><artifactId>dubbo-demo</artifactId><version>1.0-SNAPSHOT</version><relativePath>../pom.xml</relativePath></parent><artifactId>dubbo-provider</artifactId><dependencies><dependency><groupId>com.example</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency></dependencies>
</project>
2.2 创建服务实现

dubbo-provider/src/main/java/com/example/dubbo/provider/service 目录下创建 UserServiceImpl 类:

package com.example.dubbo.provider.service;import com.example.dubbo.api.UserService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@DubboService(protocol = {"dubbo", "rest"})
@RestController
public class UserServiceImpl implements UserService {@Override@GetMapping("/getUser")public String getUser(@RequestParam String userId) {return "User: " + userId;}
}
2.3 创建多协议配置

dubbo-provider/src/main/java/com/example/dubbo/provider/config 目录下创建 DubboProviderConfig 类。

package com.example.dubbo.provider.config;import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableDubbo(scanBasePackages = "com.example.dubbo.provider.service")
public class DubboProviderConfig {@Beanpublic ProtocolConfig dubboProtocolConfig() {ProtocolConfig protocolConfig = new ProtocolConfig();protocolConfig.setName("dubbo");protocolConfig.setPort(20880);return protocolConfig;}@Beanpublic ProtocolConfig restProtocolConfig() {ProtocolConfig protocolConfig = new ProtocolConfig();protocolConfig.setName("rest");protocolConfig.setPort(8080);return protocolConfig;}
}
2.4 创建启动类

dubbo-provider/src/main/java/com/example/dubbo/provider 目录下创建 DubboProviderApplication 类:

package com.example.dubbo.provider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DubboProviderApplication {public static void main(String[] args) {SpringApplication.run(DubboProviderApplication.class, args);}
}
2.5 配置文件

dubbo-provider/src/main/resources 目录下创建 application.yml 配置文件:

spring:application:name: dubbo-providermain:web-application-type: nonedubbo:application:name: dubbo-providerregistry:address: zookeeper://localhost:2181protocol:dubbo:name: dubboport: 20880rest:name: restport: 8080scan:base-packages: com.example.dubbo.provider.servicelogging:level:com.example.dubbo: INFOfile:name: logs/dubbo-provider.log

3. 创建服务消费者模块(dubbo-consumer)

服务消费者模块 dubbo-consumer 调用服务提供者提供的服务。

3.1 创建 pom.xml

dubbo-consumer 模块中创建 pom.xml 文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.w3.org/POM/4.0.0 http://www.w3.org/2001/04/xmldsig-more#"><parent><groupId>com.example</groupId><artifactId>dubbo-demo</artifactId><version>1.0-SNAPSHOT</version><relativePath>../pom.xml</relativePath></parent><artifactId>dubbo-consumer</artifactId><dependencies><dependency><groupId>com.example</groupId><artifactId>dubbo-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency></dependencies>
</project>
3.2 创建控制器

dubbo-consumer/src/main/java/com/example/dubbo/consumer/controller 目录下创建 UserController 类:

package com.example.dubbo.consumer.controller;import com.example.dubbo.api.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {private static final Logger logger = LoggerFactory.getLogger(UserController.class);@DubboReference(protocol = "dubbo")private UserService userService;@GetMapping("/getUser")public String getUser(@RequestParam String userId) {logger.info("Fetching user with ID: {}", userId);return userService.getUser(userId);}
}
3.3 创建多协议配置

dubbo-consumer/src/main/java/com/example/dubbo/consumer/config 目录下创建 DubboConsumerConfig 类。

package com.example.dubbo.consumer.config;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableDubbo(scanBasePackages = "com.example.dubbo.consumer.controller")
public class DubboConsumerConfig {
}
3.4 创建启动类

dubbo-consumer/src/main/java/com/example/dubbo/consumer 目录下创建 DubboConsumerApplication 类:

package com.example.dubbo.consumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DubboConsumerApplication {public static void main(String[] args) {SpringApplication.run(DubboConsumerApplication.class, args);}
}
3.5 配置文件

dubbo-consumer/src/main/resources 目录下创建 application.yml 配置文件:

spring:application:name: dubbo-consumerdubbo:application:name: dubbo-consumerregistry:address: zookeeper://localhost:2181protocol:name: dubboscan:base-packages: com.example.dubbo.consumer.controllerlogging:level:com.example.dubbo: INFOfile:name: logs/dubbo-consumer.log

4. 根项目的 pom.xml

在根项目 dubbo-demo 中创建 pom.xml 文件,定义模块和依赖管理:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.w3.org/2001/04/xmldsig-more#"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>dubbo-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>dubbo-api</module><module>dubbo-provider</module><module>dubbo-consumer</module></modules><dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version></dependency></dependencies></dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.4.RELEASE</version></plugin></plugins></pluginManagement></build>
</project>

5. 启动Zookeeper

确保Zookeeper在本地运行,默认端口为 2181。可以通过下载Zookeeper并运行以下命令启动Zookeeper:

bin/zkServer.sh start

6. 启动服务提供者和消费者

  1. 启动服务提供者:运行 DubboProviderApplication 类。
  2. 启动服务消费者:运行 DubboConsumerApplication 类。

7. 测试多协议服务

7.1 测试Dubbo协议

使用Dubbo协议调用服务:

curl http://localhost:8080/getUser?userId=12345
7.2 测试HTTP协议

使用HTTP协议调用服务:

curl http://localhost:8080/getUser?userId=12345

8. 总结

通过以上步骤,我们设计并实现了一个支持多协议的Dubbo服务,包含服务接口设计、协议配置、服务注册与发现、客户端和服务端实现、配置管理等功能。这样可以确保服务能够被不同协议的客户端调用,并在不同协议下实现服务端。

http://www.xdnf.cn/news/3462.html

相关文章:

  • Java 编译后的字节码文件扩展名
  • 三类思维坐标空间与时空序位信息处理架构
  • EMC PowerStore存储学习之一NVMe磁盘的命名规则
  • 【CVE-2025-1094】:PostgreSQL 14.15 SQL注入漏洞导致的RCE_ 利用代码和分析
  • React 语法扩展
  • 数字智慧方案5875丨智慧交通枢纽综合解决方案(43页PPT)(文末有下载方式)
  • 数据结构学习笔记
  • 4.5 使用busybox制作根文件系统
  • Kotlin 基础
  • GitHub 趋势日报 (2025年05月01日)
  • Google机器学习系列 - 监督学习
  • Flutter BottomNavigationBar 详解
  • 综合案例:使用vuex对购物车的商品数量和价格等公共数据进行状态管理
  • ARM 指令集(ubuntu环境学习)第七章:系列总结与未来展望
  • 【愚公系列】《Manus极简入门》012-自我认知顾问:“内在探索向导”
  • 数据结构与算法:图论——最短路径
  • LearningFlow:大语言模型城市驾驶的自动化策略学习工作流程
  • Golang 身份证号码校验
  • bilibili如何获取视频的分节的目录
  • 【安装指南】Chat2DB-集成了AI功能的数据库管理工具
  • Shell 脚本基础
  • RabbitMQ的交换机
  • 解决The‘InnoDB’feature is disabled; you need MySQL built with ‘InnoDB’ to have it
  • ARM架构详解:定义、应用及特点
  • 计算机组成原理实验(6) 微程序控制单元实验
  • 大模型开发学习笔记
  • 提示词版本化管理:AI开发中被忽视的关键环节
  • 【Linux】基础指令(2)
  • 冯·诺依曼体系:现代计算机的底层逻辑与百年传承
  • C++ 与 Lua 联合编程