欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot 集成 dubbo

程序员文章站 2022-04-30 19:47:00
...

背景:为了学习 dubbo 的集成,先在自己电脑上尝试了一把,鼓捣一天,终于配置成功。首先我创建了两个 SpringBoot 项目,一个扮演 provider,一个扮演 consumer,还创建了一个 maven 项目,扮演公共接口角色。另外,dubbo 需要有一个注册中心,所以集成 dubbo([dubbo 官网][dubbo 官方 SpringBoot 指南]) 之前,需要在电脑上安装 zookeeper([zookeeper 官网])。dubbo 的注册中心支持多种协议,zookeeper 只是其中一种,而且它只是协议,所以还需要有实现了该协议的客户端,dubbo 支持 zkclient 和 curator 两种客户端,但是对后者是从 2.3.0 才开始支持的。不过,SpringBoot 下这些客户端的集成就不用我们考虑了。
工具说明:Mac + brew(可选) + IDEA + Maven + zookeeper。
下边开始。

1. 安装 zookeeper

两种方式:可以去 zookeeper 官网下载压缩包,或者 brew install zookeeper。我是用的后者。安装完成之后,brew info zookeeper 查看 zookeeper 的安装信息,cd 到 zookeeper 的目录,在 bin 文件夹下,有 zkService 脚本文件,命令行运行,会看到如下结果:

➜  bin zkServer
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Usage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}

它提示我们使用 ./zkServer + {} 中的命令。我们可以试一下,命令行中输入 ./zkServer status,会看到:

➜  bin ./zkServer status
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Error contacting service. It is probably not running.

提示我们未运行。那就使用 ./zkServer start,然后会看到:

➜  bin ./zkServer start
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Starting zookeeper ... STARTED

运行成功。
这里还有重要的一点,关于 zookeeper 的配置。其实之前的命令中,zookeeper 已经提醒我们了:

Using config: /usr/local/etc/zookeeper/zoo.cfg

即使用的配置文件为 zoo.cfg。打开这个文件,我们会看到里边:

#The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/var/run/zookeeper/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
....

给我的感觉,zookeeper 的配置有点类似于处理器的时钟频率,先定义了一个 tick 耗费的时间,下边根据 tick 的定义了初始化时为了同步需要耗费的时间,请求发出与响应的间隔时间。不过现在对于我们运行 demo 比较重要的就是最下边的端口号,因为后边 provider 和 consumer 在进行注册的时候,需要 ip 地址和端口才能成功注册。当然,因为 zookeeper 是运行在本机的,所以 ip 地址就是 127.0.0.1。

2. 引入 dubbo 依赖

zookeeper 成功运行起来之后,我们就可以开始项目的配置了。在 provider 和 consumer 的两个项目的 pom 文件中,分别加入

        <!-- 引入 dubbo -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>

同时将 maven 设置成自动导入,然后在 External Libraries 中我们就可以看到 dubbo 的包已经成功引入。

3. 配置 dubbo

虽然 dubbo 的官方文档没有提到在 application.properties 配置,但是其 github 上 SpringBoot 工程配置指南中却提到了。我试过在 classpath 路径下创建 dubbo.properties 文件进行配置,运行也没问题,不过没有提示,应该是我哪一块配置的不对,不过在 application.properties 中配置就会有提示,所以最后我还是在 application.properties 中配置的。主要的配置项目有:

#设置服务提供者的信息 以下信息必须配置
#直接使用工程名称即可
dubbo.application.id=ConsumerService
dubbo.application.name=ConsumerService
#注册中心的 ip 地址及端口号
dubbo.registry.address=127.0.0.1:2181
#注册中心的协议类型
dubbo.registry.protocol= zookeeper

其他的配置可以参见官网说明,如果需要自行配置。

4. 配置 provider 和 consumer

4.1 开启 dubbo 注解配置

都在工程的注 application 文件中开启 dubbo 的注解配置。即在 @SpringBootApplication 上方添加:@EnableDubbo。

4.2 配置 provider

在 provider 类的声明头部,添加 @Service 注解,表明该类是 service 的提供类。

// 注意这里的 @Service 不要选择成 Spring 框架的那个!是 alibaba.dubbo 的那个。
@Service
public class ProviderServiceClass implements CommonInterface {
    @Override
    public List<String> getDataFromProvider() {
        List<String> addrList = new ArrayList<String>();
        addrList.add("北京市海淀区");
        return addrList;
    }
}

4.3 配置 consumer

在 consumer 类中,我们一般会定义一个 CommonInterface 接口类型的私有变量,下边在返回数据的时候我们直接调用 CommonInterface 的方法,运行时 dubbo 自动会将该私有变量链接成 provider 对象。配置完之后大概是这个样子:

@RestController
public class ConsumerServiceClass {

    @Reference
    private CommonInterface interInstance;

    @RequestMapping("/someAddress")
    public List<String> getData() {
        return interInstance.getDataFromProvider();
    }
}

5. 启动项目并验证

分别启动两个项目,然后在浏览器中请求本机地址 /someAddress ,这时会看到成功返回 "北京市海淀区" 。至此,SpringBoot 项目集成 dubbo 最简单的集成即已完成。