dubbo和springboot的更新都太快了, 连dubbo的官网都更不上脚步,所以只能自己含泪忍痛总结出一套当前(2021年12月)能用的整合方案,以及更新之后出现的新坑
目录
dubbo简介
dubbo使用
注册中心 Zookeeper
父工程
公用api模块
提供者模块(provider)
消费者模块(consumer)
注意事项
dubbo简介
dubbo就是阿里开发的一项用基于RPC思想的软件,用来实现分布式架构,dubbo的默认端口是20880
主要理解下面几点:
-
提供者要向注册中心注册自己
-
使用者要向注册中心订阅自己需要的服务(来自提供者)
-
使用者可以调用提供者的方法(使用其服务)
dubbo使用
注册中心 Zookeeper
需要的注册中心软件, dubbo官网推荐使用zookeeper
zookeeper安装之后一定需要若干配置之后才能使用
有关zk的安装和配置可以参考网上其他博客
点击zkServer.cmd运行服务器端, zkCli.cmd运行客户端
父工程
只有公用的maven依赖
pom 8 8 org.springframework.boot spring-boot-starter-parent2.6.1 org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-actuatororg.springframework.boot spring-boot-starter-aoporg.springframework.boot spring-boot-devtoolsorg.apache.dubbo dubbo-spring-boot-starter3.0.2.1 org.apache.curator curator-framework5.1.0 org.apache.curator curator-x-discovery5.1.0 org.apache.curator curator-recipes5.1.0 org.projectlombok lombokgroupId dubbo-common1.0-SNAPSHOT
curator三个依赖都要注入!
也可以注入zookeeper和zkclient代替这三个, 但是可能会出错
公用api模块
公用api模块只放公用接口和实体类, 每个模块中都要导入api模块的依赖
它无需继承父工程, 也不需要springboot启动类
pom
org.projectlombok lombok1.18.22
entity
实体类(注意一定要实现序列化接口!)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable{
private int id;
private String name;
}
service
公用接口
public interface UserService{
User get();
User post();
}
提供者模块(provider)
pom
只需要继承父工程
groupId 07_Dubbo1.0-SNAPSHOT
yaml
我们需要确定提供者的端口号, 提供哪些方法, 注册中心是什么
server: port: 8081 spring: application: name: provider dubbo: application: name: dubbo-provider protocol: port: 20880 # 暴露的端口号 registry: address: zookeeper://127.0.0.1:2181?init.timeout=60000 # 注册中心 scan: base-packages: provider.service.impl # 扫描的包名 provider: token: true # 是否提供服务
Application
@SpringBootApplication
@EnableDubbo(scanbasePackages = "provider/service/impl")
public class ProviderApplication{
public static void main(String[] args){
SpringApplication.run(ProviderApplication.class, args);
}
}
service.impl
@DubboService // dubbo暴露服务
@Service // spring注入容器
public class UserServiceImpl implements UserService{
public User get(){
return new User(1, "hello");
}
public User post(){
return new User(2, "post");
}
}
注意Dubbo的 @Service(可能是为了不与spring的混淆)注解已经更新为@DubboService
@Reference更新为@DubboReference
controller
@RestController
public class UserController{
@Resource
UserServiceImpl userService;
@GetMapping("user/get")
public User get(){
return userService.get();
}
@PostMapping("user/post")
public User post(){
return userService.post();
}
}
消费者模块(consumer)
pom
同提供者, 也只需要继承父工程
yaml
server: port: 7001 # tomcat端口号 spring: application: name: consumer # 模块应用名 dubbo: application: name: dubbo-provider # dubbo应用名 registry: address: zookeeper://127.0.0.1:2181?init.timeout=60000 # 注册中心url protocol: zookeeper # 协议是zookeeper, 可以不写 scan: base-packages: consumer # 要扫描的包
Application
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication{
public static void main(String[] args){
SpringApplication.run(ConsumerApplication.class, args);
}
}
controller
@RestController
public class UserController{
// 一定要用dubbo的@DubboReference注解注入属性
@DubboReference
UserService userService;
@GetMapping("user/get")
public User get(){
return userService.get();
}
@PostMapping("user/post")
public User post(){
return userService.post();
}
}
一定要用dubbo的@DubboReference注解注入属性
整个项目目录结构(公共api, 提供者, 消费者)
使用idea的httpclient测试成功了!(心酸)
注意事项
-
一定要先运行提供者, 再运行消费者, 有更新时两者都要重启
-
提供者和消费者两者主程序同级及以下的包名一定要相同
- 一定要先启动zk的服务器端
-
一定要先运行提供者, 再运行消费者, 有更新时两者都要重启
-
提供者和消费者两者主程序同级及以下的包名一定要相同
- 一定要先启动zk的服务器端



