Fork me on GitLab

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调用已经成功

 

posted @ 2022-06-16 11:43  隐琳琥  阅读(629)  评论(0编辑  收藏  举报