Spring Boot整合Dubbo2.x,解决其中遇到的坑
Dubbo了解
a high-performance, java based open source RPC framework.
快速知道用法
本地服务 Spring 配置
local.xml:
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
<bean id=“xxxAction” class=“com.xxx.XxxAction”>
<property name=“xxxService” ref=“xxxService” />
</bean>
远程服务 Spring 配置
在本地服务的基础上,只需做简单配置,即可完成远程化:
- 将上面的
local.xml
配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml
,将服务引用部分放在服务消费方remote-consumer.xml
。 - 并在提供方增加暴露服务配置
<dubbo:service>
,在消费方增加引用服务配置<dubbo:reference>
。
remote-provider.xml:
<!-- 和本地服务一样实现远程服务 -->
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
<!-- 增加暴露远程服务配置 -->
<dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” />
remote-consumer.xml:
<!-- 增加引用远程服务配置 -->
<dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” />
<!-- 和本地服务一样使用远程服务 -->
<bean id=“xxxAction” class=“com.xxx.XxxAction”>
<property name=“xxxService” ref=“xxxService” />
</bean>
Spring Boot中使用Dubbo
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发布服务
- pom.xml文件中添加需要的依赖
<!-- springboot整合dubbo的start包 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- zookeeper相关的包 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
</dependency>
<!-- 客户端连接zookeeper所需的包 引入ZooKeeper客户端工具 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
- 公共接口,及其实现类
TicketService
接口
package com.gqz.ticket.service;
/**
* @ClassName: TicketService
* @author: ganquanzhong
* @date: 2019/10/30 9:40
*/
public interface TicketService {
/** dubbo中的公共api
* 获取票
*/
public String getTicket(String name);
}
TicketServiceImpl
实现类
package com.gqz.ticket.service;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
/**
* @ClassName: TicketServiceImpl
* @author: ganquanzhong
* @date: 2019/10/30 9:43
*/
@Component
@Service(version = "1.0.0") //Dubbo的注解,将服务发布出去
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket(String name) {
return name+"成功订购《银河补习班》电影票";
}
}
- Spring Boot应用启动类
ProviderTicketApplication
package com.gqz.ticket;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 1、 将服务提供者注册到注册中心
* 1.引入dubbo和zkclient组件依赖
* 2.配置dubbo的扫描包和注册中心的地址
* 3.使用@Service发布服务
*/
@EnableDubbo()
@DubboComponentScan()
@SpringBootApplication
public class ProviderTicketApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderTicketApplication.class, args);
}
}
- application.properties 配置
主要配置PRC框架和注册中心
#dubbo服务名称
dubbo.application.name =provider-ticket
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
dubbo.scan.base-packages = com.gqz.ticket.service
# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}
# Dubbo Protocol
# 通讯规则dubbo,hession...
dubbo.protocol.name=dubbo
#dubbo服务端口,我们无需知道dubbo服务运行在哪个端口,故也将其设为随机端口
dubbo.protocol.port=12345
## Dubbo Registry
#注册中心地址, 如果搭建是集群,所以用逗号分开 192.168.1.112:2181,192.168.1.112:2182,192.168.1.112:2183
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.1.112:2181
到这里,服务提供者就配置完成了,可以启动应用将服务发布到注册中
2.配置服务调用者
调用注册中的服务,完成自己的业务
1.引入依赖Dubbo和zkClient
2.配置dubbo的注册中心地址
3.引用服务
- pom.xml文件中添加需要的依赖
<!-- springboot整合dubbo的start包 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- zookeeper相关的包 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
</dependency>
<!-- 客户端连接zookeeper所需的包 引入ZooKeeper客户端工具 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
- 公共接口(需要和服务提供者的路径相同),自身的业务
TicketService
公共接口
package com.gqz.ticket.service;
/**
* @ClassName: TicketService
* @author: ganquanzhong
* @date: 2019/10/30 9:40
*/
public interface TicketService {
/** dubbo中的公共api
* 获取票
*/
public String getTicket(String name);
}
UserService
自身的业务,调用远程ticketService
服务
package com.gqz.user.service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.gqz.ticket.service.TicketService;
import org.springframework.stereotype.Service;
/**
* 调用远程RPC Remote Procedure Call
* 调用com.gqz.ticket.service.TicketService中的服务
*
* @ClassName: UserService
* @author: ganquanzhong
* @date: 2019/10/30 9:48
*/
@Service
public class UserService {
/**
* @Reference注解 通过 @Reference 注入TicketService
* 是通过全类名引用
*/
@Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
TicketService ticketService;
//调用远程接口的服务
public void orderTicket(String name){
System.out.println(ticketService.getTicket(name));
}
}
- properties配置
# 配置Dubbo
#dubbo服务名称
dubbo.application.name =consumer-user
#通讯规则
dubbo.protocol.name=dubbo
#注册中心地址
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.1.112:2181
- 测试Test
ConsumerUserApplicationTests
测试
package com.gqz.user;
import com.gqz.user.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ConsumerUserApplicationTests {
@Autowired
UserService userService;
@Test
void testRPC() {
System.out.println("调用RPC provider中的订票业务");
userService.orderTicket("甘全中-陈蓉");
}
}
运行成功!!
issue&空指针
服务者必须运行,提供服务
其中经常遇到空指针异常,不能调用远程的服务主要是Dubbo配置、注解、版本等问题。严格参照官方的demo,不同版本可能出现一些架构方面的变更。
Dubbo Spring Boot 工程
Dubbo Apache Dubbo™ 是一款高性能Java RPC框架。
Spring Boot 应用场景的开发。同时也整合了 Spring Boot 特性:
- 自动装配 (比如: 注解驱动, 自动装配等).
- Production-Ready (比如: 安全, 健康检查, 外部化配置等).
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
English README
已发行版本
您可以为您的工程引入最新 dubbo-spring-boot-starter
的发布,增加以下依赖到工程的 pom.xml
文件中:
<properties>
<spring-boot.version>2.1.1.RELEASE</spring-boot.version>
<dubbo.version>2.7.3</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Apache Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
</dependencies>
如果您的工程遇到了依赖问题, 请尝试添加如下 Maven 参考到工程的 pom.xml
文件中:
<repositories>
<repository>
<id>apache.snapshots.https</id>
<name>Apache Development Snapshot Repository</name>
<url>https://repository.apache.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</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 仓库:
- Maven install 当前工程
Maven install =
mvn install
快速开始
如果您对 Dubbo 不是非常了解,耽误您几分钟访问 http://dubbo.apache.org/ 。了解后,如果您期望更深入的探讨,可以移步用户手册。
通常情况 , Dubbo 应用有两种使用场景 , 其一为 Dubbo 服务提供方 , 另外一个是 Dubbo 服务消费方,当然也允许两者混合,下面我们一起快速开始!
首先,我们假设存在一个 Dubbo RPC API ,由服务提供方为服务消费方暴露接口 :
public interface DemoService {
String sayHello(String name);
}
实现 Dubbo 服务提供方
实现
DemoService
接口@Service(version = "1.0.0")
public class DefaultDemoService implements DemoService { /**
* The default value of ${dubbo.application.name} is ${spring.application.name}
*/
@Value("${dubbo.application.name}")
private String serviceName; public String sayHello(String name) {
return String.format("[%s] : Hello, %s", serviceName, name);
}
}
编写 Spring Boot 引导程序
@EnableAutoConfiguration
public class DubboProviderDemo { public static void main(String[] args) {
SpringApplication.run(DubboProviderDemo.class,args);
}
}
配置
application.properties
:# Spring boot application
spring.application.name=dubbo-auto-configuration-provider-demo
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
dubbo.scan.base-packages=org.apache.dubbo.spring.boot.demo.provider.service # Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name} # Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=12345 ## Dubbo Registry
dubbo.registry.address=N/A
实现 Dubbo 服务消费方
通过
@Reference
注入DemoService
:@EnableAutoConfiguration
public class DubboAutoConfigurationConsumerBootstrap { private final Logger logger = LoggerFactory.getLogger(getClass()); @Reference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
private DemoService demoService; public static void main(String[] args) {
SpringApplication.run(DubboAutoConfigurationConsumerBootstrap.class).close();
} @Bean
public ApplicationRunner runner() {
return args -> {
logger.info(demoService.sayHello("mercyblitz"));
};
}
}
配置
application.yml
:spring:
application:
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,解决其中遇到的坑的更多相关文章
- Spring boot 整合CXF webservice 遇到的问题及解决
将WebService的WSDL生成的代码的命令: wsimport -p com -s . com http://localhost:8080/service/user?wsdl Spring bo ...
- spring boot整合Hadoop
最近需要用spring boot + mybatis整合hadoop,其中也有碰到一些坑,记录下来方便后面的人少走些弯路. 背景呢是因为需要在 web 中上传文件到 hdfs ,所以需要在spring ...
- spring boot 整合quartz ,job不能注入的问题
在使用spring boot 整合quartz的时候,新建定时任务类,实现job接口,在使用@AutoWire或者@Resource时,运行时出现nullpointException的问题.显然是相关 ...
- Spring Boot初识(3)- Spring Boot整合Swagger
一.本文介绍 如果Web项目是完全前后端分离的话(我认为现在完全前后端分离已经是趋势了)一般前端和后端交互都是通过接口的,对接口入参和出参描述的文档就是Mock文档.随着接口数量的增多和参数的个数增加 ...
- Spring Boot初识(2)- Spring Boot整合Mybaties
一.本文介绍 首先读这篇文章之前如果没有接触过Spring Boot可以看一下之前的文章,并且读这篇文章还需要你至少能写基本的sql语句.我在写这篇文章之前也想过到底是选择JPA还是Mybaties作 ...
- 【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 ], ...
- Spring Boot 整合 FastDFS 客户端
原文地址:Spring Boot 整合 FastDFS 客户端 博客地址:http://www.extlight.com 一.前言 前两篇介绍整体上介绍了通过 Nginx 和 FastDFS 的整合来 ...
- Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式
前面我们已经介绍了spring boot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是E ...
- activeMQ入门+spring boot整合activeMQ
最近想要学习MOM(消息中间件:Message Oriented Middleware),就从比较基础的activeMQ学起,rabbitMQ.zeroMQ.rocketMQ.Kafka等后续再去学习 ...
随机推荐
- Android布局管理器-使用LinearLayout实现简单的登录窗口布局
场景 Android布局管理器-从实例入手学习相对布局管理器的使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1038389 ...
- ACM 英文学习系列
因为ACM题目描述全是英文,所以有必要学习学习相关词汇...内心极为无奈 废话不多说 rooted binary tree 有根二叉树 integers n 英[ˈɪntɪdʒəz] 整数 ...
- AB实验人群定向HTE模型5 - Meta Learner
Meta Learner和之前介绍的Casual Tree直接估计模型不同,属于间接估计模型的一种.它并不直接对treatment effect进行建模,而是通过对response effect(ta ...
- mybatis_day01
Mybatis01 1.什么是mybatis 1.1mybatis 一个基于Java的持久层框架 1.2持久层 操作数据库那层代码 项目分层: 界面层(jps/controller) 业务层(serv ...
- 令人抓狂的redis和rediscluster Python驱动包的安装
本文环境:centos 7,Python3编译安装成功,包括pip3,然后需要安装redis相关的Python3驱动包,本的redis指redis包而非redis数据库,rediscluster类似. ...
- [TJOI2008] 小偷
TJOI2008小偷 题目背景 一位著名的小偷进入了一个充满宝石的储藏室,这个储藏室是由一连串房间构成的,房间的标号从0开始,想进入第i个房间就必须从第i-1个房间进入,如图: 题目描述 上图为三个房 ...
- SpringBoot从1.5.1→2.2.4项目加包扫雷三:org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter已过时
@Configuration@Slf4j@PropertySource({"classpath:/config.properties"})public class MyWebApp ...
- Tensor--tensorflow的数据类型
在tensorflow2.0版本之前,1.x版本的tensorflow的基本数据类型有计算图(Computation Graph)和张量(Tensor)两种,但tensorflow2.0之后的版本取消 ...
- java中equals与==号的区别
1.==号对于基本数据类型来说,比较的是值,对于引用数据类型来说比较的是地址值 2.equals方法在object类中,比较的是地址值,但是String类重写了Object类中的equals方法,所以 ...
- npm ERR! Cannot read property 'match' of undefined
在Vue项目中运行npm i命令时直接提示npm ERR! Cannot read property 'match' of undefined错误了,此时需要把package-lock.json文件删 ...