Dubbo+Nacos注解方式实现RPC调用
Dubbo+Nacos注解方式实现RPC调用
在linux上安装dubbo
运行dubbo-admin服务, 此服务需要单独启动一个zookeeper容器dubbo-admin将监听所有注册到zookeeper的服务, dubbo-admin默认端口8080,查看官网版本可以通过docker search zookeeper
docker pull docker.io/zookeeper:3.6.3
docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d docker.io/zookeeper:3.6.3
查看容器运行情况
docker logs -f 3fwaf89b80ffa64ea604aa691adbd5b6c296b087a3f97bc6355a629f841bbf77c9fca
docker ps
拉取镜像,运行dubbo-admin服务
自定义一个端口,不使用8080端docker run --name dubbo-admin -p 8888:8080 --link zookeeper -d docker.io/apache/dubbo-admin:0.4.0
直接访问,用户名密码:root / root
http://192.24.442.23:8888
安装配置下nacos
https://www.cnblogs.com/yiMro/p/15978292.html
spring-boot项目搭建
new一个新的project项目名称自取,我这边叫dubbo-demo,在dubbo-demo这个父项目的下面新建三个项目分别为dubbo-demo-common,dubbo-demo-consumer,dubbo-demo-provide。为了方便consumer和provide直接就导入common的包。
这个简单的用例是假设在common中有一个抽象类,然后生产者去实现这个抽象类中的接口,消费者用rpc的方式直接去调用。
common的pom
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.2.9.RELEASE</version> </dependency> <!-- Base依赖 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> <!-- Dubbo依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.0</version> </dependency> <!-- Nacos依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.0.0</version> </dependency> </dependencies>
在common中添加entity实体类和servic抽象类
@Data @AllArgsConstructor public class User implements Serializable { private String name; private Integer age; }
public interface UserService { User getUser(); }
provide子项目yaml文件和impl实现类
server: port: 8081 spring: application: name: dubbo-provider main: # 重复定义bean的问题 allow-bean-definition-overriding: true dubbo: application: name: dubbo-provider # 禁用QOS同一台机器可能会有端口冲突现象 qos-enable: false qos-accept-foreign-ip: false #注册中心 nacos registry: address: nacos://192.24.442.23:8848 protocol: name: dubbo port: 8888
实现类就非常简单了
@Service public class UserServiceImpl implements UserService { @Override public User getUser() { return new User("张三", 58); } }
consumer子项目yaml文件和controller控制层
server: port: 8082 spring: application: name: dubbo-consumer main: # 重复定义bean的问题 allow-bean-definition-overriding: true dubbo: application: name: dubbo-consumer # 禁用QOS同一台机器可能会有端口冲突现象 qos-enable: false qos-accept-foreign-ip: false #注册中心 nacos registry: address: nacos://192.24.442.23:8848 # 超时时间 consumer: timeout: 3000
@RestController @RequestMapping("/user") public class UserController { // Dubbo远程调用注解 @Reference private UserService userService; @GetMapping("/list") public Object getList(){ return userService.getUser(); } }
注意需要在启动类上加上@EnableDubbo 开启dubbo服务,并且实现类的@Service使用dubbo的依赖包,依赖注入的时候使用@Reference而不是@Autowired
启动这两个服务可以在nacos中看到服务已经注册进来了
在浏览器地址上输入http://localhost:8082/user/list测试一下,证明rpc调用已经成功