dubbo和springboot的更新都太快了, 连dubbo的官网都更不上脚步,所以只能自己含泪忍痛总结出一套当前(2021年12月)能用的整合方案,以及更新之后出现的新坑
目录
dubbo简介
dubbo使用
注册中心 Zookeeper
父工程
公用api模块
提供者模块(provider)
消费者模块(consumer)
注意事项
dubbo简介
dubbo就是阿里开发的一项用基于RPC思想的软件,用来实现分布式架构,dubbo的默认端口是20880
主要理解下面几点:
-
提供者要向注册中心注册自己
-
使用者要向注册中心订阅自己需要的服务(来自提供者)
-
使用者可以调用提供者的方法(使用其服务)
需要的注册中心软件, 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
公用api模块curator三个依赖都要注入!
也可以注入zookeeper和zkclient代替这三个, 但是可能会出错
公用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的服务器端
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)