spring/springboot整合dubbo詳細(xì)教程
一、基本使用
需求:
某個(gè)電商系統(tǒng),訂單服務(wù)需要調(diào)用用戶服務(wù)獲取某個(gè)用戶的所有地址;
我們現(xiàn)在需要?jiǎng)?chuàng)建兩個(gè)服務(wù)模塊進(jìn)行測(cè)試
| 模塊 | 功能 |
| 訂單服務(wù)web模塊 | 創(chuàng)建訂單等 |
| 用戶服務(wù)service模塊 | 查詢用戶地址等 |
測(cè)試預(yù)期結(jié)果:
訂單服務(wù)web模塊在A服務(wù)器,用戶服務(wù)模塊在B服務(wù)器,A可以遠(yuǎn)程調(diào)用B的功能。
二、spring整合dubbo
以下使用XML 配置的方式,更多配置方式見(jiàn)官方文檔
2.1 spring-common模塊:
公共接口層(model,service,exception…),定義公共接口,也可以導(dǎo)入公共依賴

UserAddress.java:用戶地址實(shí)體類(lèi)
public class UserAddress implements Serializable {
private Integer id;
private String userAddress;
private String userId;
private String consignee;
private String phoneNum;
private String isDefault;
....
}
IOrderService.java:訂單接口
public interface IOrderService {
/**
* 用戶下單
* @param userId
*/
UserAddress placeOrder(int userId);
}
IUserService.java:用戶接口
public interface IUserService {
/**
* 根據(jù)用戶id獲取用戶地址
* @param userId
* @return
*/
UserAddress getUserAddById(int userId);
}
pom.xml:通用的依賴,引入dubbo和zkclient
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubboStudy</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.10</version>
</dependency>
<!--zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
</project>
2.2 spring-user模塊:
用戶業(yè)務(wù),作為服務(wù)提供者

pom.xml:引入通用模塊,可以使用定義的接口
<dependency> <groupId>org.example</groupId> <artifactId>spring-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
UserServiceImpl.xml:IUserService的實(shí)現(xiàn)類(lèi),供遠(yuǎn)程調(diào)用
public class UserServiceImpl implements IUserService {
@Override
public UserAddress getUserAddById(int userId) {
UserAddress userAddress = new UserAddress();
userAddress.setUserAddress("上海市寶山區(qū)");
return userAddress;
}
}
provider.xml:dubbo配置信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--1、指定當(dāng)前服務(wù)/應(yīng)用的名字(同樣的服務(wù)名字相同,不要和別的服務(wù)同名)-->
<dubbo:application name="spring-user"/>
<!--2、指定注冊(cè)中心的位置-->
<!--<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>-->
<dubbo:registry address="zookeeper://192.168.31.136:2181"/>
<!--3、指定通信規(guī)則(通信協(xié)議? 服務(wù)端口)-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--4、暴露服務(wù) 讓別人調(diào)用 ref指向服務(wù)的真正實(shí)現(xiàn)對(duì)象-->
<bean id="userServiceImpl" class="me.nic.service.impl.UserServiceImpl"/>
<!--服務(wù)的實(shí)現(xiàn)-->
<dubbo:service interface="me.nic.service.IUserService" ref="userServiceImpl"/>
</beans>
ConsumerRun.java:?jiǎn)?dòng):
public class ConsumerRun {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
IOrderService orderService = applicationContext.getBean(IOrderService.class);
orderService.placeOrder(1);
System.in.read();
}
}
2.3 spring-order模塊:
訂單業(yè)務(wù),作為服務(wù)消費(fèi)者

pom.xml:引入通用模塊,可以使用定義的接口,同1.2
OrderServiceImpl.xml:IOrderService的實(shí)現(xiàn)類(lèi),其中遠(yuǎn)程調(diào)用userService
@Service
public class OrderServiceImpl implements IOrderService {
@Autowired
private IUserService userService;
@Override
public UserAddress placeOrder(int userId) {
// 遠(yuǎn)程調(diào)用,獲取用戶地址
UserAddress userAddById = userService.getUserAddById(userId);
// 下單
System.out.println("用戶地址:" + userAddById.getUserAddress());
System.out.println("下單成功");
return null;
}
}
consumer.xml:dubbo配置信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--包掃描-->
<context:component-scan base-package="me.nic.service.impl"/>
<!--指定當(dāng)前服務(wù)/應(yīng)用的名字(同樣的服務(wù)名字相同,不要和別的服務(wù)同名)-->
<dubbo:application name="spring-order"/>
<!--指定注冊(cè)中心的位置-->
<dubbo:registry address="zookeeper://192.168.31.136:2181"/>
<!--調(diào)用遠(yuǎn)程暴露的服務(wù),生成遠(yuǎn)程服務(wù)代理-->
<dubbo:reference id="userService" interface="me.nic.service.IUserService"/>
</beans>
ProviderRun.java:?jiǎn)?dòng)
public class ProviderRun {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("classpath:provider.xml");
System.in.read();
}
}
2.4 效果
ProviderRun啟動(dòng)之后阻塞,
ConsumerRun啟動(dòng)之后調(diào)用orderService.placeOrder(1),placeOrder中遠(yuǎn)程調(diào)用spring-user模塊中的userService.getUserAddById(userId)獲取用戶地址:
用戶地址:上海市寶山區(qū) 下單成功
三、springboot整合dubbo
3.1 boot-common模塊:
公共接口層(model,service,exception…),定義公共接口,也可以導(dǎo)入公共依賴

UserAddress.java:用戶地址實(shí)體類(lèi)
public class UserAddress implements Serializable {
private Integer id;
private String userAddress;
private String userId;
private String consignee;
private String phoneNum;
private String isDefault;
....
}
IOrderService.java:訂單接口
public interface IOrderService {
/**
* 用戶下單
* @param userId
*/
UserAddress placeOrder(int userId);
}
IUserService.java:用戶接口
public interface IUserService {
/**
* 根據(jù)用戶id獲取用戶地址
* @param userId
* @return
*/
UserAddress getUserAddById(int userId);
}
pom.xml:通用的依賴,引入dubbo的starter
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>boot-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-common</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
</project>
3.2 boot-user模塊:
用戶業(yè)務(wù),作為服務(wù)提供者

pom.xml:引入通用模塊,可以使用定義的接口
<dependency> <groupId>org.example</groupId> <artifactId>spring-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
UserServiceImpl.xml:IUserService的實(shí)現(xiàn)類(lèi),供遠(yuǎn)程調(diào)用
@Service 暴露dubbo的服務(wù)
@Service
@Component
public class UserServiceImpl implements IUserService {
@Override
public UserAddress getUserAddById(int userId) {
UserAddress userAddress = new UserAddress();
userAddress.setUserAddress("上海市寶山區(qū)");
return userAddress;
}
}
application.properties:dubbo配置信息
dubbo.application.name=boot-user dubbo.registry.address=192.168.31.136:2181 dubbo.registry.protocol=zookeeper dubbo.protocol.name=dubbo dubbo.protocol.port=20880
BootUserApplication.java:?jiǎn)?dòng):
@EnableDubbo : 開(kāi)啟基于注解的dubbo功能
@EnableDubbo
@SpringBootApplication
public class BootUserApplication {
public static void main(String[] args) {
SpringApplication.run(BootUserApplication.class, args);
}
}
3.3 boot-order模塊:
訂單業(yè)務(wù),作為服務(wù)消費(fèi)者

pom.xml:引入通用模塊,可以使用定義的接口,同1.2
<dependency> <groupId>com.example</groupId> <artifactId>boot-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
OrderServiceImpl.xml:IOrderService的實(shí)現(xiàn)類(lèi),其中遠(yuǎn)程調(diào)用userService
@Reference:引用遠(yuǎn)程提供者服務(wù)
@Service
public class OrderServiceImpl implements IOrderService {
//引用遠(yuǎn)程提供者服務(wù)
@Reference
private IUserService userService;
@Override
public UserAddress placeOrder(int userId) {
// 遠(yuǎn)程調(diào)用,獲取用戶地址
UserAddress userAddById = userService.getUserAddById(userId);
return userAddById;
}
}
OrderController.java:web接口,調(diào)用OrderService:
@Controller
public class OrderController {
@Autowired
IOrderService orderService;
@RequestMapping("/initOrder")
@ResponseBody
public UserAddress initOrder(@RequestParam("uid")int userId) {
return orderService.placeOrder(userId);
}
}
application.properties:dubbo配置信息
server.port=8081 dubbo.application.name=boot-order dubbo.registry.address=zookeeper://192.168.31.136:2181
BootOrderApplication.java:?jiǎn)?dòng)
@EnableDubbo
@SpringBootApplication
public class BootOrderApplication {
public static void main(String[] args) {
SpringApplication.run(BootOrderApplication.class, args);
}
}
3.4 效果

到此這篇關(guān)于springboot整合dubbo詳細(xì)教程的文章就介紹到這了,更多相關(guān)springboot整合dubbo內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis報(bào)錯(cuò)mapkey is required問(wèn)題及解決
這篇文章主要介紹了Mybatis報(bào)錯(cuò)mapkey is required問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Java數(shù)據(jù)結(jié)構(gòu)之HashMap和HashSet
這篇文章主要介紹了HashMap和HashSet,什么是哈希表以及HashMap的部分源碼解讀,想了解更多的小伙伴,可以參考閱讀本文2023-03-03
java實(shí)現(xiàn)哈夫曼壓縮的實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)哈夫曼壓縮的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07
SpringCloud Zuul實(shí)現(xiàn)動(dòng)態(tài)路由
這篇文章主要介紹了SpringCloud Zuul實(shí)現(xiàn)動(dòng)態(tài)路由,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
詳解mybatis-plus的 mapper.xml 路徑配置的坑
這篇文章主要介紹了詳解mybatis-plus的 mapper.xml 路徑配置的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

