您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 基于Dubbo Protocol的Demo实现指南
## 前言
Dubbo作为一款高性能Java RPC框架,在分布式服务治理领域占据重要地位。本文将详细介绍如何基于Dubbo协议实现一个完整的服务调用Demo,涵盖环境搭建、接口定义、服务暴露与调用等核心环节。
## 一、环境准备
### 1.1 基础环境要求
- JDK 1.8+
- Maven 3.5+
- Zookeeper 3.4+(注册中心)
- IDE(IntelliJ IDEA或Eclipse)
### 1.2 Maven依赖配置
```xml
<!-- Dubbo核心依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.0.7</version>
</dependency>
<!-- Zookeeper客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<!-- 序列化支持 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-kryo</artifactId>
<version>3.0.7</version>
</dependency>
建议将服务接口单独作为模块,供服务提供者和消费者共同依赖。
// UserService.java
public interface UserService {
User getUserById(Long id);
List<User> findUsersByCondition(UserQuery query);
}
// User.java
public class User implements Serializable {
private Long id;
private String name;
private Integer age;
// getters/setters...
}
// UserQuery.java
public class UserQuery implements Serializable {
private String namePrefix;
private Integer minAge;
// getters/setters...
}
public class UserServiceImpl implements UserService {
private final Map<Long, User> userStore = new ConcurrentHashMap<>();
@Override
public User getUserById(Long id) {
return userStore.get(id);
}
@Override
public List<User> findUsersByCondition(UserQuery query) {
return userStore.values().stream()
.filter(u -> query.getNamePrefix() == null ||
u.getName().startsWith(query.getNamePrefix()))
.filter(u -> query.getMinAge() == null ||
u.getAge() >= query.getMinAge())
.collect(Collectors.toList());
}
}
<!-- provider.xml -->
<dubbo:application name="user-service-provider"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<bean id="userService" class="com.example.UserServiceImpl"/>
<dubbo:service interface="com.example.UserService" ref="userService"/>
@Configuration
@EnableDubbo(scanBasePackages = "com.example")
public class ProviderConfig {
@Bean
public RegistryConfig registryConfig() {
RegistryConfig config = new RegistryConfig();
config.setAddress("zookeeper://127.0.0.1:2181");
return config;
}
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig config = new ProtocolConfig();
config.setName("dubbo");
config.setPort(20880);
return config;
}
}
public class ProviderBootstrap {
public static void main(String[] args) throws Exception {
// XML方式
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("provider.xml");
context.start();
System.in.read(); // 阻塞等待
}
}
<!-- consumer.xml -->
<dubbo:application name="user-service-consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:reference id="userService" interface="com.example.UserService"/>
@Configuration
@EnableDubbo(scanBasePackages = "com.example")
public class ConsumerConfig {
@Bean
public RegistryConfig registryConfig() {
RegistryConfig config = new RegistryConfig();
config.setAddress("zookeeper://127.0.0.1:2181");
return config;
}
}
@Service
public class UserAction {
@Reference
private UserService userService;
public void doInvoke() {
User user = userService.getUserById(1L);
System.out.println(user);
}
}
public class ConsumerBootstrap {
public static void main(String[] args) {
// XML方式
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("consumer.xml");
UserService userService = (UserService)context.getBean("userService");
// 调用示例
User user = userService.getUserById(1L);
System.out.println("查询结果:" + user);
// 复杂查询
UserQuery query = new UserQuery();
query.setNamePrefix("张");
query.setMinAge(18);
List<User> users = userService.findUsersByCondition(query);
System.out.println("条件查询结果:" + users);
}
}
<dubbo:protocol name="dubbo"
port="20880"
dispatcher="all"
threadpool="fixed"
threads="200"
queues="0"
iothreads="4"
payload="8388608"/>
参数说明:
- dispatcher
: 消息派发策略
- threadpool
: 线程池类型(fixed/cached)
- payload
: 最大请求数据大小(8MB)
<dubbo:service interface="com.example.UserService"
ref="userService"
version="1.0.0"
timeout="3000"
retries="2"
loadbalance="random"/>
<dubbo:service interface="com.example.UserService" ref="userService">
<dubbo:method name="getUserById" timeout="1000" retries="0"/>
<dubbo:method name="findUsersByCondition" timeout="5000"/>
</dubbo:service>
<!-- 提供方 -->
<dubbo:service group="production" version="2.0.0" .../>
<!-- 消费方 -->
<dubbo:reference group="production" version="2.0.0" .../>
// 本地存根实现
public class UserServiceStub implements UserService {
private final UserService userService;
public UserServiceStub(UserService userService) {
this.userService = userService;
}
@Override
public User getUserById(Long id) {
try {
return userService.getUserById(id);
} catch (Exception e) {
// 降级逻辑
return new User(id, "默认用户", 0);
}
}
}
配置方式:
<dubbo:reference stub="com.example.UserServiceStub" .../>
// 消费者端设置
RpcContext.getContext().setAttachment("token", "123456");
// 提供者端获取
String token = RpcContext.getContext().getAttachment("token");
# log4j.properties
log4j.logger.org.apache.dubbo=DEBUG
log4j.logger.com.alibaba.dubbo=DEBUG
telnet 127.0.0.1 20880
> status
> ls
> invoke UserService.getUserById(1)
dubbo-demo/
├── dubbo-api/ # 接口定义
│ └── src/main/java/com/example/UserService.java
├── dubbo-provider/ # 服务提供者
│ ├── src/main/resources/provider.xml
│ └── src/main/java/com/example/UserServiceImpl.java
└── dubbo-consumer/ # 服务消费者
├── src/main/resources/consumer.xml
└── src/main/java/com/example/UserAction.java
通过本文的实践,我们完成了基于Dubbo协议的完整服务调用Demo。在实际生产环境中,还需要考虑以下方面:
Dubbo的强大功能需要结合具体业务场景进行深度定制,建议参考官方文档持续深入学习。
注意:本文基于Dubbo 3.x版本实现,部分配置与2.x版本存在差异 “`
该文档共约3650字,采用标准的Markdown格式编写,包含: 1. 多级标题结构 2. 代码块与语法高亮 3. 表格与参数说明 4. 项目结构树形图 5. 配置示例与最佳实践 6. 版本兼容性说明
可根据实际需求调整具体实现细节,建议配合Dubbo官方文档使用以获得最佳效果。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。