Springboot+Dubbo整合

我会带着你远行 2022-06-04 10:24 359阅读 0赞

简介

当前dubbo是官方宣布更新后最新版本,由于官方并未给出使用spring-boot-starter-dubbo,因此这里使用的是老雷写的开源spring-boot-starter-dubbo
并且已经是支持最新版本的dubbo-2.5.7

spring-boot-starter-dubbo的git地址
https://gitee.com/reger/spring-boot-starter-dubbo/blob/master/pom.xml

项目准备

Dubbo 从 2.5.8 版本开始, 分别提供了三个方式配置,提供了更完善的支持
xml:上一篇入门篇的方式
property:本篇方式:官方再开源后已经提供了dubbo-spring-boot-starter
Annotation:注解方式

官方文档:http://dubbo.apache.org/zh-cn/blog/dubbo-annotation.html

2.5.8之后版本springboot整合:服务互调

spring boot 2.0.3版本以注意
错误提示:java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedDataBinder
boot.bind下找不到RelaxedDataBinder这个方法
查看API发现,这个org.springframework.boot.bind 包已经删掉了,导致RelaxedPropertyResolver这个方法已经不可用
解决方案 :
boot版本改为1.5.x版本对应dubbo-spring-boot-starter0.1.0
boot版本改为2.1.x版本对应dubbo-spring-boot-starter0.2.0

官方给定的对应版本号
























dubbo-spring Java Spring Boot Dubbo
0.2.1 1.8+ 2.1.x 2.6.5 +
0.1.1 1.7+ 1.5.x 2.6.5 +

dubbo-api:公共接口和实体bean,主要是两个服务的接口
dubbo-a:服务a
dubbo-b:服务b

服务调用

  1. package com.bamboo.bserver.controller;
  2. import com.alibaba.dubbo.config.annotation.Reference;
  3. import com.bamboo.aserver.city.service.CityService;
  4. import org.apache.commons.logging.Log;
  5. import org.apache.commons.logging.LogFactory;
  6. import org.springframework.ui.Model;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. /**
  10. * demo url
  11. * http://localhost:9001
  12. *
  13. * @author bamboo
  14. * @time 2019-6-27
  15. */
  16. @RestController
  17. public class BambooController {
  18. private Log logger = LogFactory.getLog(BambooController.class);
  19. // 调用服务service 注解
  20. @Reference
  21. private CityService cityService;
  22. /**
  23. * default url
  24. */
  25. @GetMapping("/")
  26. public String find(Model model, String name) {
  27. return "bamboo server";
  28. }
  29. // 调用服务a的city服务
  30. @GetMapping("/city")
  31. public String getCity(Model model, String name) {
  32. return cityService.getC("bamboo");
  33. }
  34. }

b服务user的实现,主要这里的service不是spring的注解而是com.alibaba.dubbo.config.annotation.Service;

  1. package com.bamboo.bserver.impl;
  2. import com.alibaba.dubbo.config.annotation.Service;
  3. import com.bamboo.bserver.user.service.UserService;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. /**
  7. * @program: dubbo-api
  8. * @description: 服务实现
  9. * @author: Bamboo zjcjava@163.com
  10. * @create: 2019-06-27 16:18
  11. **/
  12. //注意,这里的service注解用的不是spring的注解,而是com.alibaba.dubbo.config.annotation.Service;
  13. @Service
  14. public class UserServiceImpl implements UserService{
  15. private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
  16. @Override
  17. public String getUser(String name) {
  18. logger.debug("User service running :{}",name);
  19. return "user:"+name;
  20. }
  21. }

dubbo-a,dubbo-b的pom基本相似指数artifactId不同而已

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>springboot</groupId>
  8. <artifactId>dubbo-b</artifactId>
  9. <version>0.0.1</version>
  10. <!-- Spring Boot -->
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>2.0.3.RELEASE</version>
  15. </parent>
  16. <properties>
  17. <dubbo-spring-boot>1.0.0</dubbo-spring-boot>
  18. </properties>
  19. <dependencies>
  20. <!-- Spring Boot Web -->
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. <!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
  31. <dependency>
  32. <groupId>com.alibaba.boot</groupId>
  33. <artifactId>dubbo-spring-boot-starter</artifactId>
  34. <version>0.2.0</version>
  35. </dependency>
  36. <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
  37. <dependency>
  38. <groupId>com.101tec</groupId>
  39. <artifactId>zkclient</artifactId>
  40. <version>0.10</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>springboot</groupId>
  44. <artifactId>dubbo-api</artifactId>
  45. <version>0.0.1</version>
  46. </dependency>
  47. <!-- Junit -->
  48. <dependency>
  49. <groupId>junit</groupId>
  50. <artifactId>junit</artifactId>
  51. <version>4.12</version>
  52. </dependency>
  53. </dependencies>
  54. </project>

b服务的配置application.properties

  1. ## server port
  2. server.port=9002
  3. #消费者名称
  4. dubbo.application.name=dubbo-consumer
  5. #需要使用到提供者服务的包路径
  6. dubbo.scan.base-packages= com.bamboo.bserver
  7. #注册中心地址
  8. dubbo.registry.address=zookeeper://127.0.0.1:2181
  9. dubbo.protocol.port=2081
  10. dubbo.consumer.check=false

dubbo.consumer.check=false 在服务启动时不检查依赖服务的检查,会报空

具体代码已经提交到我的GitHub上
https://github.com/BambooZhang/dubbo-study

2.5.7版本springboot整合方式

dubbo-srpingboot-provider 服务端
dubbo-srpingboot-consumer 消费端
dubbo-admin-2.5.7.war 监控管理后台
源码地址:
https://github.com/BambooZhang/dubbo-study/tree/master/dubbo-springboot

##相同部分

pom

服务端和消费端的pom都一样都使用了springboot

两个项目的maven依赖都一摸一样这里只拷贝主要部分,详细请参考git中的源码

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.9.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <dependencies>
  8. <!--spring boot-->
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-web</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-test</artifactId>
  16. </dependency>
  17. <!--spring-boot-starter-dubbo-->
  18. <dependency>
  19. <groupId>com.gitee.reger</groupId>
  20. <artifactId>spring-boot-starter-dubbo</artifactId>
  21. <version>1.0.9</version>
  22. </dependency>
  23. </dependencies>

service

都使用同一个service文件ProviderService .java

  1. package com.bamboo;
  2. public interface ProviderService {
  3. public String sayHello(String name);
  4. }

##服务端
服务端实现接口

  1. package com.bamboo.provider;
  2. import com.alibaba.dubbo.config.annotation.Service;
  3. import com.bamboo.ProviderService;
  4. @Service
  5. public class ProviderServiceImpl implements ProviderService {
  6. public String sayHello(String name) {
  7. return "Hello:"+name+"你好,你好~~";
  8. }
  9. }

application.yml

  1. server:
  2. port: 8081
  3. spring:
  4. dubbo:
  5. application:
  6. name: service-provider
  7. base-package: com.bamboo.provider # dubbo服务发布者实现类注解@service所在的包
  8. registry:
  9. address: 192.168.0.91 # zookeeper注册中心的地址
  10. port: 2181 # zookeeper注册中心的端口
  11. protocol:
  12. name: dubbo
  13. serialization: hessian2
  14. provider:
  15. retries: 0 # 服务调用重试次数,服务发布者不给重试,让服务调用者自己重试

启动类

  1. package com;
  2. import org.springframework.boot.CommandLineRunner;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import java.util.concurrent.TimeUnit;
  6. /**
  7. * Created by xialeme on 2017/12/11.
  8. */
  9. @SpringBootApplication
  10. public class ProviderApplication implements CommandLineRunner {
  11. public static void main(String[] args) throws InterruptedException {
  12. SpringApplication.run(ProviderApplication.class, args);
  13. TimeUnit.MINUTES.sleep(10); //提供者main线程暂停10分钟等待被调用
  14. System.err.println("服务提供者------>>服务关闭");
  15. }
  16. @Override
  17. public void run(String... args) throws Exception {
  18. System.err.println("服务提供者------>>启动完毕");
  19. }
  20. }

消费端

这里使用了两个注解
Component:在项目启动的时候执行调用
RestController:使用REST风格可以在页面访问接口实现调用
Consumer

  1. package com.bamboo.consumer;
  2. import com.bamboo.ProviderService;
  3. import com.reger.dubbo.annotation.Inject;
  4. import org.springframework.boot.CommandLineRunner;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestMethod;
  8. import org.springframework.web.bind.annotation.ResponseBody;
  9. import org.springframework.web.bind.annotation.RestController;
  10. /**
  11. * Created by bamboo on 2017/12/11.
  12. */
  13. @RestController
  14. @Component//启动时调用
  15. public class Consumer implements CommandLineRunner {
  16. // 使用兼容注入,可以使用dubbo原生注解@Reference注入
  17. @Inject
  18. public ProviderService service;
  19. // 使用兼容注入
  20. @Inject
  21. public ProviderService bidService;
  22. @Override
  23. public void run(String... args){
  24. String name="system start";
  25. System.out.println(service.sayHello(name));;
  26. System.out.println("调用完成");
  27. }
  28. @RequestMapping(value = "/", method = RequestMethod.GET)
  29. @ResponseBody
  30. public String run(String name){
  31. name= name==null?"system start":name;
  32. return service.sayHello(name);
  33. }
  34. }

消费端启动类

  1. package com;
  2. import org.springframework.boot.CommandLineRunner;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. /**
  6. * Created by bamboo on 2017/12/11.
  7. * contextClass
  8. */
  9. @SpringBootApplication
  10. public class ConsumerApplication implements CommandLineRunner {
  11. public static void main(String[] args) {
  12. SpringApplication.run(ConsumerApplication.class, args);
  13. }
  14. @Override
  15. public void run(String... args) throws Exception {
  16. System.err.println("服务调用者------>>启动完毕");
  17. }
  18. }

启动执行

依此启动服务端和消费端
可以在消费端控制台看到

  1. 服务调用者------>>启动完毕
  2. Hello:system start你好,你好~~
  3. 调用完成

说明服务启动的时候已经执行了

然后在浏览器打开消费端的接口
http://localhost:8082/?name=bamboo
可以看到窗口返回的数据,说明调用成功

  1. Hello:bamboo你好,你好~~

当然如果你启动了dubbo-admin,也可以在控制台看到如下情况,这里就不截图了

  1. 应用名:
  2. 角色: 降级: 操作
  3. service-consumer 消费者 未降级 屏蔽 | 容错
  4. service-provider 提供者

配置扩展

由于目前官方并未给出他们的springboot-dubbo-start因此老雷给出的版本其实也是根据现有官方提供的相关xml配置写出的spring胶水代码部分实现的。因此配置和xml官方的是一样的只是以yml的风格实现了配置而已,具体配置请参考官方给出的配置为准。
dubbo官网
http://dubbo.io/
老雷的代码地址
https://gitee.com/reger/spring-boot-starter-dubbo

Dubbo第一章:Dubbo-admin编译和Dubbo简单入门
http://blog.csdn.net/zjcjava/article/details/78766095

发表评论

表情:
评论列表 (有 0 条评论,359人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ssm整合

    在mybatis和spring整合后 , 在把springmvc整合进来 在maven里创建web工程 然后进行mybatis和spring的整合步骤(写在其他博客里)