由于dubbo在2018年2月15日成为 Apache 基金会孵化项目,所以不再是阿里维护的一个项目了。然后似乎就出现了断层,网络上大部分的文章都是对于阿里阶段的dubbo开发的教程,导致寻找了很久才能找到apache的dubbo开发教程,所以想在这里整理一下最新的dubbo与springboot的简单整合。

zookeeper操作

首先我们需要下载运行zookeeper:
http://mirror.bit.edu.cn/apac...
下载最新的版本,这里需要知道的是项目中的zookeeper版本号最好和下载的版本一致。
我们只需要下载解压之后将conf里面的zoo_sample.cfg复制重命名为zoo.cfg后运行bin下面的zkServer.cmd即可。
如果我们是在linux下面运行的话:

启动ZK服务:       sh zkServer.sh start
查看ZK服务状态:   sh zkServer.sh status
停止ZK服务:       sh zkServer.sh stop
重启ZK服务:       sh zkServer.sh restart

dubbo admin搭建

新版本dubbo admin的搭建按照官方的说明很简单就可以搭建完成,具体步骤看官方文档即可:
https://github.com/apache/dub...

项目搭建

这里我用的是IDEA进行开发构建的项目。

项目框架的搭建

  • 首先我们需要新建一个空项目:

    clipboard.png

    填上项目名称,然后点击完成即可。

    clipboard.png

  • 由于是新建的空项目,所以我们需要新建模块:

    clipboard.png

    我们这里用的是springboot模块,先新建一个生产者模块:

    clipboard.png

    clipboard.png

    clipboard.png

    clipboard.png
    按照上述的顺序再新建一个消费者模块。

独立模块搭建

  • 由于dubbo官网推荐将接口层单独作为一个独立模块使用。然后生产者和消费者均依赖此模块进行操作。
    所以我们需要新建一个maven模块。

    clipboard.png

    clipboard.png
    三个模块建完之后:
    clipboard.png

  • 我们首先进行公共模块的开发,也就是common模块的开发。
    新建一个实体类和一个service接口:
    clipboard.png

    public class User implements Serializable {
    
        private String name;
    
        private Integer age;
    
        public User() {
        }
    
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    public interface GetUserService {
    
        List<User> getUserList(String name);
    
    }

    因为希望将common模块作为模板,生产者和消费者模块都要继承它,所以在它的pom文件里面整合所有需要的包即可:

    <dependencies>
        <!-- apache的springboot dubbo依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
    
        <!-- zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    
        <!-- Zookeeper客户端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>
    </dependencies>

    common模块开发结束了。

生产者模块开发

  • 现在开发生产者模块,只需要继承common模块,然后实现service接口即可。

    clipboard.png
    这里的Service是apache.dubbo的包,需要注意。

    @Service
    public class GetUserServiceImpl implements GetUserService {
    
        @Override
        public List<User> getUserList(String name) {
            //此处没有连接数据库,所以就先生成几条数据返回即可。
            System.out.println(name);
            List<User> list = new ArrayList<>();
            list.add(new User("小明",20));
            list.add(new User("小强",21));
            list.add(new User("小红",22));
            return list;
        }
    }
  • 将application.properties改名为application.yml,然后进行配置

    server:
      port: 8082 #端口号
    
    dubbo:
      application:
        name: provider #当前服务/应用的名字
    #  scan:
    #    base-packages: com.zhouxiaoxi.provider.service.impl #开启包扫描,可替代 @EnableDubbo 注解
    
      monitor:
        protocol: registry #连接监控中心
    
      protocol:
        name: dubbo #通信协议
        port: 20880 #接口
    
      registry:
        address: 127.0.0.1:2181 #注册中心的地址
        protocol: zookeeper #注册中心的协议

    在这里我们还是在启动类上添加 @EnableDubbo 注解,因为比较简便:

    @EnableDubbo
    @SpringBootApplication
    public class ProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class, args);
        }
    
    }

    然后我们需要在pom文件里面继承common的模块:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    
        <!-- common模块 -->
        <dependency>
            <groupId>com.zhouxiaoxi</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    现在可以启动生产者,然后看dubbo admin界面就会发现一个提供者:

    image.png

消费者模块开发

  • 接下来我们继续开发消费者:
    这里我们只是需要写一个controller来调用一下这个接口就可以了:
    clipboard.png

    @RestController
    public class GetUserController {
    
        @Reference
        GetUserService getUserService;
    
        @RequestMapping("getUserList")
        public List<User> getUserList(@RequestParam("name") String name){
            return getUserService.getUserList(name);
        }
    
    }
  • 将application.properties改名为application.yml,然后进行配置

    server:
      port: 8081 #端口号
    
    dubbo:
      application:
        name: consumer #当前服务/应用的名字
      #  scan:
      #    base-packages: com.zhouxiaoxi.provider.service.impl #开启包扫描,可替代 @EnableDubbo 注解
    
      monitor:
        protocol: registry #连接监控中心
    
      protocol:
        name: dubbo #通信协议
        port: 20880 #接口
    
      registry:
        address: 127.0.0.1:2181 #注册中心的地址
        protocol: zookeeper #注册中心的协议

    在这里我们还是在启动类上添加 @EnableDubbo 注解,因为比较简便:

    @EnableDubbo
    @SpringBootApplication
    public class ConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    
    }

    然后我们需要在pom文件里面继承common的模块并且添加web依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    
        <!-- web依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.9.RELEASE</version>
        </dependency>
    
        <!-- common模块 -->
        <dependency>
            <groupId>com.zhouxiaoxi</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    现在可以启动消费者,然后看dubbo admin界面就会发现一个消费者:

    clipboard.png

测试

访问http://localhost:8081/getUserList?name=zhouxiaoxi即可看到相应的返回值。

clipboard.png

至此我们的springboot与apache dubbo的整合就结束了。

该项目已经上传到github上面,大家可以下载运行一下:
https://github.com/zhouzhaodo...


周兆东
107 声望21 粉丝

一个java小白的成长之路。。。