前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Duboo3.0+SpringBoot+zookeeper整合例子(附源码)

Duboo3.0+SpringBoot+zookeeper整合例子(附源码)

作者头像
HaC
发布2021-12-07 13:33:14
1.6K0
发布2021-12-07 13:33:14
举报
文章被收录于专栏:HaC的技术专栏

dubbo3.0整合SpringBoot例子

dubbo新版本(3.0以上)在相对于 dubbo 旧版本(2.5、2.6、2.7),有很多的不相同的地方。

官方文档也说了新版本的特性:

https://dubbo.apache.org/zh/docs/v3.0/new-in-dubbo3

本文就来使用dubbo3.0新版本 搭建一个dubbo+SpringBoot 项目,项目结构:

源码已上传到github:https://github.com/DogerRain/dubbo-samples-test

(项目名字是带springCloud的,因为本来还想整合SpringCloud的,还没来得及整合…先不改了)

下面是十分详细的过程。

环境要求:

  • jdk1.8
  • zookeeper

项目会创建三个modul:

代码语言:javascript
复制
dubbo-samples-springcloud-api
dubbo-samples-springcloud-consumer
dubbo-samples-springcloud-provider

先来创建一个父项目,定义好一些 依赖包和项目结构:

代码语言:javascript
复制
	<modules>
        <module>dubbo-samples-springcloud-api</module>
        <module>dubbo-samples-springcloud-consumer</module>
        <module>dubbo-samples-springcloud-provider</module>
    </modules>
    <properties>
        <java.version>1.8</java.version>
        <source.level>1.8</source.level>
        <target.level>1.8</target.level>
        <skip_maven_deploy>true</skip_maven_deploy>
        <spring-boot-dependencies.version>2.4.1</spring-boot-dependencies.version>
        <spring-cloud-dependencies.version>Dalston.SR4</spring-cloud-dependencies.version>
        <junit.version>4.12</junit.version>
        <dubbo.version>3.0.2.1</dubbo.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- 统一jar版本管理,避免使用 spring-boot-parent -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--dubbo 和  springboot 整合的包-->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

项目的依赖结构为:

代码语言:javascript
复制
dubbo-samples-springcloud-consumer
	--dubbo-samples-springcloud-api
	
dubbo-samples-springcloud-provider	
	--dubbo-samples-springcloud-api	

dubbo-samples-springcloud-api	

但如果是旧项目不想改动了,可能会不需要API项目那么你的依赖结构就是这样的:

代码语言:javascript
复制
dubbo-samples-springcloud-consumer
	--dubbo-samples-springcloud-provider	
	
	
dubbo-samples-springcloud-provider	

1、创建 API 项目——dubbo-samples-springcloud-api

创建一个 dubbo-samples-springcloud-api 项目,创建该项目是为了解耦,这样 provider定义好接口,打成一个SDK,丢给消费者引入就行了。

1.1、pom文件:

代码语言:javascript
复制
	<parent>
        <groupId>com.dubbo</groupId>
        <artifactId>dubbo-samples-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>dubbo-samples-springcloud-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-samples-springcloud-api</name>
    <description>dubbo stress test - api</description>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
    </dependencies>

1.2、定义接口

废话少说,先来定义一个接口:

UserService.java 接口:

代码语言:javascript
复制
public interface UserService {
    User getUserInfo(long userId);
}

User.java 实体类:

代码语言:javascript
复制
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private static final long serialVersionUID = -4294369157631410325L;
    Long userId;
    String userName;
    String responseInfo;
}

2、创建provider——dubbo-samples-springcloud-provider

创建一个dubbo-samples-springcloud-provider 项目

2.1、配置pom文件:

代码语言:javascript
复制
	<parent>
        <groupId>com.dubbo</groupId>
        <artifactId>dubbo-samples-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>dubbo-samples-springcloud-provider</artifactId>

    <dependencies>
         <!--dubbo-samples-springcloud-api 项目 依赖-->
        <dependency>
            <groupId>com.dubbo</groupId>
            <artifactId>dubbo-samples-springcloud-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <!--dubbo 与 spring-boot 整合包-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <!--springboot 启动核心包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--springboot rest -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-zookeeper</artifactId>
        </dependency>
    </dependencies>

使用了 dubbo-spring-boot-starter 就不需要 原来的 dubbo 依赖了,但是还是需要 dubbo-registry-zookeeper ,因为要连接zk。

2.2、yaml文件配置

代码语言:javascript
复制
server:
  port: 8090

spring:
  application:
    name: dubbo-samples-privider-springCloud

dubbo:
  application:
    name: ${spring.application.name}
  registry:
    address: zookeeper://127.0.0.1:2181
    timeout: 2000
  protocol:
    name: dubbo
    port: 20890
  # 扫描 @DubboService 注解  
  scan:
    base-packages: com.dubbo.service

dubbo.application.name 可以不写,默认是 spring.application.name 的名字。

2.3、实现 UserService 接口

代码语言:javascript
复制
@DubboService
@Component
@Slf4j
public class UserServiceImpl implements UserService {

    /**
     *
     * @param userId
     * @return
     * RPC provider 接口 实现
     */
    @Override
    public User getUserInfo(long userId) {

        log.info("request from consumer: {}", RpcContext.getContext().getRemoteAddress());
        log.info("response from provider: {}" , RpcContext.getContext().getLocalAddress());
        return new User(userId, "userName" + userId , " --->>>>response from remote RPC provider:" + RpcContext.getContext().getLocalAddress());
    }
}

@DubboService 表示这是一个暴露出去的接口。

旧版本可能是 使用 @Service ,与 spring的 @Service 容易让人误解,不推荐使用

@Component 表示这是一个bean,方便其他地方引用

2.4、添加一个Controller

我这里用写一个Controller,方便测试。

代码语言:javascript
复制
@RestController
@RequestMapping("/provider")
public class ProviderUserController {

    @Resource
    UserServiceImpl userService;

    @RequestMapping("/user/{id}")
    User getUserInfo(@PathVariable("id") Long id ){
        return userService.getUserInfo(id);
    }
}

2.5、启动类

代码语言:javascript
复制
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
        System.out.println("dubbo client started..........");
    }
}

@EnableDubbo 表示自动扫描声明 @DubboService 的类,也可以使用dubbo.scan.base-packages 指定扫描路径,两者选择其中一个即可。

3、创建consumer——dubbo-samples-springcloud-consumer

3.1、配置pom文件

代码语言:javascript
复制
<parent>
        <groupId>com.dubbo</groupId>
        <artifactId>dubbo-samples-springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <artifactId>dubbo-samples-springcloud-consumer</artifactId>
    <packaging>jar</packaging>
    <description>The demo consumer module of dubbo project</description>
    <properties>
        <skip_maven_deploy>true</skip_maven_deploy>
    </properties>

    <dependencies>
        <!--dubbo-samples-springcloud-api 项目 依赖-->
        <dependency>
            <groupId>com.dubbo</groupId>
            <artifactId>dubbo-samples-springcloud-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-zookeeper</artifactId>
        </dependency>
    </dependencies>

3.2、yaml配置

代码语言:javascript
复制
server:
  port: 8091

spring:
  application:
    name: dubbo-samples-consumer-springCloud

dubbo:
  registry:
    address: zookeeper://127.0.0.1:2181
    timeout: 2000
  protocol:
    name: dubbo

3.3、调用 provider

这一步我添加一个Controller 用来调用provider

代码语言:javascript
复制
@RestController
@RequestMapping("/consumer")
@Slf4j
public class ConsumerUserController {

    @DubboReference(version = "*", protocol = "dubbo", loadbalance = "random")
    private UserService userService;

    @RequestMapping("/user/{id}")
    public User getUser(@PathVariable("id") Long id) {
        User user = userService.getUserInfo(id);
        log.info("response from provider: {}", user);
        return user;
    }
}

@DubboReference 表示使用RPC(这里使用dubbo协议)进行远程调用。

3.4、启动类

代码语言:javascript
复制
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
        System.out.println("dubbo client started..........");
    }
}

4、测试

4.1、启动 provider

运行 ProviderApplication.java

端口是 8090

4.2、启动 consumer

运行 ConsumerApplication.java

端口是 8091

4.3 登入 dubboAdmin看看

dubboAdmin 是一个后台可视化项目,可以看到 关于dubbo服务方、消费者相关的信息。

这里就不阐述怎么搭建了,可以参考其他文章。

4.4、调用 consumer 的接口

浏览器输入:http://localhost:8091/consumer/user/2

看下provider日志:

代码语言:javascript
复制
2021-11-19 15:05:40.206  INFO 25932 --- [20890-thread-11] com.dubbo.service.UserServiceImpl: request from consumer: /172.16.44.48:50513
2021-11-19 15:05:40.206  INFO 25932 --- [20890-thread-11] com.dubbo.service.UserServiceImpl: response from provider: 172.16.44.48:20890

consumer日志:

代码语言:javascript
复制
2021-11-19 15:05:40.207  INFO 33120 --- [nio-8091-exec-4] c.d.controller.ConsumerUserController: response from provider: User(userId=2, userName=userName2, responseInfo= --->>>>response from remote RPC provider:172.16.44.48:20890)

你会看到 consumer 启动了一个 50513 的端口和provider进行通讯。

到这里,dubbo+SpringBoot 的整合就完成了。

·

如果你直接调用provider的Controller。

浏览器输入:http://localhost:8090/provider/user/2

它显示是这样的:

它就很普通的调用一样了。

所以在这里你对比一下,RPC也就是这样的一个过程。

5、总结和踩坑

5.1、版本管理

建议使用dubbo的统一版本管理,也就是 dubbo-bom

5.2、jar依赖

如果你使用的是 dubbo-spring-boot-starter ,就不需要 dubbo 这个jar了

5.3、关联

正常情况下, 这三个项目不是在一起的。

比如说公司两个部门,一个是用户中心,一个是订单,用户中心要RPC调用订单服务。

那么只需要订单服务只需要新建一个API项目,定义一些接口。

然后打成jar 给到用户中心接入,用户中心使用Dubbo就可以直接调用了。

所以好处就是:

  • 不需要使用Http直接调用了(当然Dubbo也支持http协议)
  • 不需要整个jar打包,可以解耦,把api项目暴露即可

5.4、最后

项目的地址已经上传到github:https://github.com/DogerRain/dubbo-samples-test

接下来还有两个TODO:

  • 整合SpringCloud
  • 使用jmeter压测dubbo、rest、hessian协议 传输大包的性能
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • dubbo3.0整合SpringBoot例子
    • 1、创建 API 项目——dubbo-samples-springcloud-api
      • 1.1、pom文件:
      • 1.2、定义接口
    • 2、创建provider——dubbo-samples-springcloud-provider
      • 2.1、配置pom文件:
      • 2.2、yaml文件配置
      • 2.3、实现 UserService 接口
      • 2.4、添加一个Controller
      • 2.5、启动类
    • 3、创建consumer——dubbo-samples-springcloud-consumer
      • 3.1、配置pom文件
      • 3.2、yaml配置
      • 3.3、调用 provider
      • 3.4、启动类
    • 4、测试
      • 4.1、启动 provider
      • 4.2、启动 consumer
      • 4.3 登入 dubboAdmin看看
      • 4.4、调用 consumer 的接口
    • 5、总结和踩坑
      • 5.1、版本管理
      • 5.2、jar依赖
      • 5.3、关联
      • 5.4、最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档