Dubbo了解

a high-performance, java based open source RPC framework.

Dubbo官网 源码 文档

快速知道用法

本地服务 Spring 配置

local.xml:

  1. <bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
  2. <bean id=“xxxAction” class=“com.xxx.XxxAction”>
  3. <property name=“xxxService” ref=“xxxService” />
  4. </bean>

远程服务 Spring 配置

在本地服务的基础上,只需做简单配置,即可完成远程化:

  • 将上面的 local.xml 配置拆分成两份,将服务定义部分放在服务提供方 remote-provider.xml,将服务引用部分放在服务消费方 remote-consumer.xml
  • 并在提供方增加暴露服务配置 <dubbo:service>,在消费方增加引用服务配置 <dubbo:reference>

remote-provider.xml:

  1. <!-- 和本地服务一样实现远程服务 -->
  2. <bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
  3. <!-- 增加暴露远程服务配置 -->
  4. <dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” />

remote-consumer.xml:

  1. <!-- 增加引用远程服务配置 -->
  2. <dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” />
  3. <!-- 和本地服务一样使用远程服务 -->
  4. <bean id=“xxxAction” class=“com.xxx.XxxAction”>
  5. <property name=“xxxService” ref=“xxxService” />
  6. </bean>

Spring Boot中使用Dubbo

阿里官方demo

dubbo-spring-boot-project

Dubbo Spring Boot (v0.1.0) : https://github.com/dubbo/dubbo-spring-boot-project
Dubbo (v2.0.1) : https://github.com/alibaba/dubbo
Google group : http://groups.google.com/group/dubbo

下面就给出一个完整整合案例,适合入门级别

官方给出的一些案例:dubbo-spring-boot-samples

1.配置服务提供者

将服务提供者注册到注册中心
1. 引入dubbo和zkclient组件依赖
2. 配置dubbo的扫描包和注册中心的地址
3. 使用@Service发布服务

  1. pom.xml文件中添加需要的依赖
  1. <!-- springboot整合dubbo的start包 -->
  2. <dependency>
  3. <groupId>com.alibaba.spring.boot</groupId>
  4. <artifactId>dubbo-spring-boot-starter</artifactId>
  5. <version>2.0.0</version>
  6. </dependency>
  7. <!-- zookeeper相关的包 -->
  8. <dependency>
  9. <groupId>org.apache.zookeeper</groupId>
  10. <artifactId>zookeeper</artifactId>
  11. <version>3.4.12</version>
  12. </dependency>
  13. <!-- 客户端连接zookeeper所需的包 引入ZooKeeper客户端工具 -->
  14. <dependency>
  15. <groupId>com.101tec</groupId>
  16. <artifactId>zkclient</artifactId>
  17. <version>0.9</version>
  18. </dependency>
  1. 公共接口,及其实现类

TicketService 接口

  1. package com.gqz.ticket.service;
  2. /**
  3. * @ClassName: TicketService
  4. * @author: ganquanzhong
  5. * @date: 2019/10/30 9:40
  6. */
  7. public interface TicketService {
  8. /** dubbo中的公共api
  9. * 获取票
  10. */
  11. public String getTicket(String name);
  12. }

TicketServiceImpl实现类

  1. package com.gqz.ticket.service;
  2. import com.alibaba.dubbo.config.annotation.Service;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @ClassName: TicketServiceImpl
  6. * @author: ganquanzhong
  7. * @date: 2019/10/30 9:43
  8. */
  9. @Component
  10. @Service(version = "1.0.0") //Dubbo的注解,将服务发布出去
  11. public class TicketServiceImpl implements TicketService {
  12. @Override
  13. public String getTicket(String name) {
  14. return name+"成功订购《银河补习班》电影票";
  15. }
  16. }
  1. Spring Boot应用启动类

ProviderTicketApplication

  1. package com.gqz.ticket;
  2. import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
  3. import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. /**
  7. * 1、 将服务提供者注册到注册中心
  8. * 1.引入dubbo和zkclient组件依赖
  9. * 2.配置dubbo的扫描包和注册中心的地址
  10. * 3.使用@Service发布服务
  11. */
  12. @EnableDubbo()
  13. @DubboComponentScan()
  14. @SpringBootApplication
  15. public class ProviderTicketApplication {
  16. public static void main(String[] args) {
  17. SpringApplication.run(ProviderTicketApplication.class, args);
  18. }
  19. }
  1. application.properties 配置
    主要配置PRC框架和注册中心
  1. #dubbo服务名称
  2. dubbo.application.name =provider-ticket
  3. # Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
  4. dubbo.scan.base-packages = com.gqz.ticket.service
  5. # Dubbo Application
  6. ## The default value of dubbo.application.name is ${spring.application.name}
  7. ## dubbo.application.name=${spring.application.name}
  8. # Dubbo Protocol
  9. # 通讯规则dubbo,hession...
  10. dubbo.protocol.name=dubbo
  11. #dubbo服务端口,我们无需知道dubbo服务运行在哪个端口,故也将其设为随机端口
  12. dubbo.protocol.port=12345
  13. ## Dubbo Registry
  14. #注册中心地址, 如果搭建是集群,所以用逗号分开 192.168.1.112:2181,192.168.1.112:2182,192.168.1.112:2183
  15. dubbo.registry.protocol=zookeeper
  16. dubbo.registry.address=192.168.1.112:2181

到这里,服务提供者就配置完成了,可以启动应用将服务发布到注册中

2.配置服务调用者

调用注册中的服务,完成自己的业务
1.引入依赖Dubbo和zkClient
2.配置dubbo的注册中心地址
3.引用服务

  1. pom.xml文件中添加需要的依赖
  1. <!-- springboot整合dubbo的start包 -->
  2. <dependency>
  3. <groupId>com.alibaba.spring.boot</groupId>
  4. <artifactId>dubbo-spring-boot-starter</artifactId>
  5. <version>2.0.0</version>
  6. </dependency>
  7. <!-- zookeeper相关的包 -->
  8. <dependency>
  9. <groupId>org.apache.zookeeper</groupId>
  10. <artifactId>zookeeper</artifactId>
  11. <version>3.4.12</version>
  12. </dependency>
  13. <!-- 客户端连接zookeeper所需的包 引入ZooKeeper客户端工具 -->
  14. <dependency>
  15. <groupId>com.101tec</groupId>
  16. <artifactId>zkclient</artifactId>
  17. <version>0.9</version>
  18. </dependency>
  1. 公共接口(需要和服务提供者的路径相同),自身的业务

TicketService公共接口

  1. package com.gqz.ticket.service;
  2. /**
  3. * @ClassName: TicketService
  4. * @author: ganquanzhong
  5. * @date: 2019/10/30 9:40
  6. */
  7. public interface TicketService {
  8. /** dubbo中的公共api
  9. * 获取票
  10. */
  11. public String getTicket(String name);
  12. }

UserService自身的业务,调用远程ticketService服务

  1. package com.gqz.user.service;
  2. import com.alibaba.dubbo.config.annotation.Reference;
  3. import com.gqz.ticket.service.TicketService;
  4. import org.springframework.stereotype.Service;
  5. /**
  6. * 调用远程RPC Remote Procedure Call
  7. * 调用com.gqz.ticket.service.TicketService中的服务
  8. *
  9. * @ClassName: UserService
  10. * @author: ganquanzhong
  11. * @date: 2019/10/30 9:48
  12. */
  13. @Service
  14. public class UserService {
  15. /**
  16. * @Reference注解 通过 @Reference 注入TicketService
  17. * 是通过全类名引用
  18. */
  19. @Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
  20. TicketService ticketService;
  21. //调用远程接口的服务
  22. public void orderTicket(String name){
  23. System.out.println(ticketService.getTicket(name));
  24. }
  25. }
  1. properties配置
  1. # 配置Dubbo
  2. #dubbo服务名称
  3. dubbo.application.name =consumer-user
  4. #通讯规则
  5. dubbo.protocol.name=dubbo
  6. #注册中心地址
  7. dubbo.registry.protocol=zookeeper
  8. dubbo.registry.address=192.168.1.112:2181
  1. 测试Test

ConsumerUserApplicationTests测试

  1. package com.gqz.user;
  2. import com.gqz.user.service.UserService;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. @SpringBootTest
  7. class ConsumerUserApplicationTests {
  8. @Autowired
  9. UserService userService;
  10. @Test
  11. void testRPC() {
  12. System.out.println("调用RPC provider中的订票业务");
  13. userService.orderTicket("甘全中-陈蓉");
  14. }
  15. }

运行成功!!

issue&空指针


服务者必须运行,提供服务

其中经常遇到空指针异常,不能调用远程的服务主要是Dubbo配置、注解、版本等问题。严格参照官方的demo,不同版本可能出现一些架构方面的变更。

Dubbo Spring Boot 工程

Dubbo Apache Dubbo™ 是一款高性能Java RPC框架。
Spring Boot 应用场景的开发。同时也整合了 Spring Boot 特性:

Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

English README

已发行版本

您可以为您的工程引入最新 dubbo-spring-boot-starter 的发布,增加以下依赖到工程的 pom.xml 文件中:

  1. <properties>
  2. <spring-boot.version>2.1.1.RELEASE</spring-boot.version>
  3. <dubbo.version>2.7.3</dubbo.version>
  4. </properties>
  5. <dependencyManagement>
  6. <dependencies>
  7. <!-- Spring Boot -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-dependencies</artifactId>
  11. <version>${spring-boot.version}</version>
  12. <type>pom</type>
  13. <scope>import</scope>
  14. </dependency>
  15. <!-- Apache Dubbo -->
  16. <dependency>
  17. <groupId>org.apache.dubbo</groupId>
  18. <artifactId>dubbo-dependencies-bom</artifactId>
  19. <version>${dubbo.version}</version>
  20. <type>pom</type>
  21. <scope>import</scope>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.apache.dubbo</groupId>
  25. <artifactId>dubbo</artifactId>
  26. <version>${dubbo.version}</version>
  27. <exclusions>
  28. <exclusion>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring</artifactId>
  31. </exclusion>
  32. <exclusion>
  33. <groupId>javax.servlet</groupId>
  34. <artifactId>servlet-api</artifactId>
  35. </exclusion>
  36. <exclusion>
  37. <groupId>log4j</groupId>
  38. <artifactId>log4j</artifactId>
  39. </exclusion>
  40. </exclusions>
  41. </dependency>
  42. </dependencies>
  43. </dependencyManagement>
  44. <dependencies>
  45. <!-- Dubbo Spring Boot Starter -->
  46. <dependency>
  47. <groupId>org.apache.dubbo</groupId>
  48. <artifactId>dubbo-spring-boot-starter</artifactId>
  49. <version>2.7.3</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>org.apache.dubbo</groupId>
  53. <artifactId>dubbo</artifactId>
  54. </dependency>
  55. </dependencies>

如果您的工程遇到了依赖问题, 请尝试添加如下 Maven 参考到工程的 pom.xml 文件中:

  1. <repositories>
  2. <repository>
  3. <id>apache.snapshots.https</id>
  4. <name>Apache Development Snapshot Repository</name>
  5. <url>https://repository.apache.org/content/repositories/snapshots</url>
  6. <releases>
  7. <enabled>false</enabled>
  8. </releases>
  9. <snapshots>
  10. <enabled>true</enabled>
  11. </snapshots>
  12. </repository>
  13. </repositories>

历史版本

如果您现在使用的Dubbo版本低于2.7.0,请使用如下对应版本的Dubbo Spring Boot:

Dubbo Spring Boot Dubbo Spring Boot
0.2.1.RELEASE 2.6.5+ 2.x
0.1.2.RELEASE 2.6.5+ 1.x

源代码构建

如果您需要尝试最新 dubbo-spring-boot-project 的特性,您可将当前工程手动 Maven install 到本地 Maven 仓库:

  1. Maven install 当前工程

Maven install = mvn install

快速开始

如果您对 Dubbo 不是非常了解,耽误您几分钟访问 http://dubbo.apache.org/ 。了解后,如果您期望更深入的探讨,可以移步用户手册

通常情况 , Dubbo 应用有两种使用场景 , 其一为 Dubbo 服务提供方 , 另外一个是 Dubbo 服务消费方,当然也允许两者混合,下面我们一起快速开始!

首先,我们假设存在一个 Dubbo RPC API ,由服务提供方为服务消费方暴露接口 :

  1. public interface DemoService {
  2. String sayHello(String name);
  3. }

实现 Dubbo 服务提供方

  1. 实现 DemoService 接口

    1. @Service(version = "1.0.0")
    2. public class DefaultDemoService implements DemoService {
    3. /**
    4. * The default value of ${dubbo.application.name} is ${spring.application.name}
    5. */
    6. @Value("${dubbo.application.name}")
    7. private String serviceName;
    8. public String sayHello(String name) {
    9. return String.format("[%s] : Hello, %s", serviceName, name);
    10. }
    11. }
  2. 编写 Spring Boot 引导程序

    1. @EnableAutoConfiguration
    2. public class DubboProviderDemo {
    3. public static void main(String[] args) {
    4. SpringApplication.run(DubboProviderDemo.class,args);
    5. }
    6. }
  3. 配置 application.properties :

    1. # Spring boot application
    2. spring.application.name=dubbo-auto-configuration-provider-demo
    3. # Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
    4. dubbo.scan.base-packages=org.apache.dubbo.spring.boot.demo.provider.service
    5. # Dubbo Application
    6. ## The default value of dubbo.application.name is ${spring.application.name}
    7. ## dubbo.application.name=${spring.application.name}
    8. # Dubbo Protocol
    9. dubbo.protocol.name=dubbo
    10. dubbo.protocol.port=12345
    11. ## Dubbo Registry
    12. dubbo.registry.address=N/A

实现 Dubbo 服务消费方

  1. 通过 @Reference 注入 DemoService :

    1. @EnableAutoConfiguration
    2. public class DubboAutoConfigurationConsumerBootstrap {
    3. private final Logger logger = LoggerFactory.getLogger(getClass());
    4. @Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
    5. private DemoService demoService;
    6. public static void main(String[] args) {
    7. SpringApplication.run(DubboAutoConfigurationConsumerBootstrap.class).close();
    8. }
    9. @Bean
    10. public ApplicationRunner runner() {
    11. return args -> {
    12. logger.info(demoService.sayHello("mercyblitz"));
    13. };
    14. }
    15. }
  2. 配置 application.yml :

    1. spring:
    2. application:
    3. name: dubbo-auto-configure-consumer-sample

请确保 Dubbo 服务提供方服务可用, DubboProviderDemo 运行方可正常。

更多的实现细节,请参考 Dubbo 示例

社区交流

如果您在使用 Dubbo Spring Boot 中遇到任何问题或者有什么建议? 我们非常需要您的支持!

  • 如果您需要升级版本,请提前阅读发布公告,了解最新的特性和问题修复。
  • 如果您遇到任何问题 ,您可以订阅 Dubbo 用户邮件列表
  • 问题反馈,您可以在 issues 提出您遇到的使用问题。

模块工程

Dubbo Spring Boot 采用多 Maven 模块工程 , 模块如下:

dubbo-spring-boot-parent

dubbo-spring-boot-parent 模块主要管理 Dubbo Spring Boot 工程的 Maven 依赖

dubbo-spring-boot-autoconfigure

dubbo-spring-boot-autoconfigure 模块提供 Spring Boot’s @EnableAutoConfiguration 的实现 - DubboAutoConfiguration
它简化了 Dubbo 核心组件的装配。

dubbo-spring-boot-actuator

dubbo-spring-boot-actuator 提供 Production-Ready 特性:

dubbo-spring-boot-starter

dubbo-spring-boot-starter 模块为标准的 Spring Boot Starter ,
当您将它引入到工程后,dubbo-spring-boot-autoconfigure 模块会一同被间接依赖。

dubbo-spring-boot-samples

Dubbo Spring Boot 示例工程包括:

Spring Boot整合Dubbo2.x,解决其中遇到的坑的更多相关文章

  1. Spring boot 整合CXF webservice 遇到的问题及解决

    将WebService的WSDL生成的代码的命令: wsimport -p com -s . com http://localhost:8080/service/user?wsdl Spring bo ...

  2. spring boot整合Hadoop

    最近需要用spring boot + mybatis整合hadoop,其中也有碰到一些坑,记录下来方便后面的人少走些弯路. 背景呢是因为需要在 web 中上传文件到 hdfs ,所以需要在spring ...

  3. spring boot 整合quartz ,job不能注入的问题

    在使用spring boot 整合quartz的时候,新建定时任务类,实现job接口,在使用@AutoWire或者@Resource时,运行时出现nullpointException的问题.显然是相关 ...

  4. Spring Boot初识(3)- Spring Boot整合Swagger

    一.本文介绍 如果Web项目是完全前后端分离的话(我认为现在完全前后端分离已经是趋势了)一般前端和后端交互都是通过接口的,对接口入参和出参描述的文档就是Mock文档.随着接口数量的增多和参数的个数增加 ...

  5. Spring Boot初识(2)- Spring Boot整合Mybaties

    一.本文介绍 首先读这篇文章之前如果没有接触过Spring Boot可以看一下之前的文章,并且读这篇文章还需要你至少能写基本的sql语句.我在写这篇文章之前也想过到底是选择JPA还是Mybaties作 ...

  6. 【spring boot】【elasticsearch】spring boot整合elasticsearch,启动报错Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8

    spring boot整合elasticsearch, 启动报错: Caused by: java.lang.IllegalStateException: availableProcessors ], ...

  7. Spring Boot 整合 FastDFS 客户端

    原文地址:Spring Boot 整合 FastDFS 客户端 博客地址:http://www.extlight.com 一.前言 前两篇介绍整体上介绍了通过 Nginx 和 FastDFS 的整合来 ...

  8. Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式

    前面我们已经介绍了spring boot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是E ...

  9. activeMQ入门+spring boot整合activeMQ

    最近想要学习MOM(消息中间件:Message Oriented Middleware),就从比较基础的activeMQ学起,rabbitMQ.zeroMQ.rocketMQ.Kafka等后续再去学习 ...

随机推荐

  1. npm下载文件临时目录、实际存放目录路劲

    npm 下载文件临时存放目录 路劲:C:\Users\xxxxxx\AppData\Roaming\npm\node_modules ( C:\Users\dihongwanyan\AppData\R ...

  2. Linux 实时查看日志文件动态内容

    tailf 27.log | grep 'Classcomment/praise'               'Classcomment/praise' 接口名:查看请求固定接口的时间,实时 tai ...

  3. 127.0.0.1 拒绝了我们的连接请求--访问本地IP时显示拒绝访问

    问题描述 今天在访问http://127.0.0.1时,浏览器显示"127.0.0.1 拒绝了我们的连接请求",需要设置浏览器设置 解决方法 1.打开控制面板,搜索"程序 ...

  4. java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

  5. Resnet——深度残差网络(一)

    我们都知道随着神经网络深度的加深,训练过程中会很容易产生误差的积累,从而出现梯度爆炸和梯度消散的问题,这是由于随着网络层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定(特别大或特别小),出现最多 ...

  6. MySql学习-2. NavicatforMySQL 与 MySql的对接以及一些操作:

    1.连接: 2.数据库的创建: 3.数据库中表的创建:    4.表的设计: 4.1 设计表: 4.2 增加数据(自动递增只是保证唯一值,即使数据删除了也是得前进):

  7. 《手把手教你构建自己的 Linux 系统》学习笔记(10)

    目录 /etc/fstab 文件的作用是什么? Linux 内核的图形化启动是怎么回事? Linux 系统中的文件名是否以大小写来进行区别? 「GRUB 中无法找到硬盘」怎么解决? 「GRUB 及配置 ...

  8. gcc 将两个文件合成一个文件(c)

    一个文件是: 一个文件是: 两个文件的作用是输出一段文字,其中一个文件调用了另一个文件 gcc 命令为: -c 生成了object 文件,-o 生成了可执行文件,并且合成.

  9. Python之lambda表达式的妙用

    用法 Python的lambda表达式用于构建匿名函数,基本语法是在冒号左边放原函数的参数,可以有多个参数,用逗号隔开即可:冒号右边是返回值. >>> lambda x,y: (x+ ...

  10. 文件下载(download) 前后台备注自用

    1.后台 1.1 ResponseBean 返回封装的格式 @Data @Accessors(chain = true) public class ResponseBean { private Str ...