SpringBoot集成org.apache.Dubbo
一、前言
Dubbo作為一款優(yōu)秀的RPC框架狭莱,在國內(nèi)有著眾多的使用者,自從2018年2月,Dubbo被阿里捐獻(xiàn)給Apache基金會以后跌捆,Dubbo似乎以全新的名稱 Apache Dubbo煥發(fā)了新的生命力。雖然有著同樣優(yōu)秀和優(yōu)勢的Spring Clould框架象颖,但是Dubbo能煥發(fā)新生也是一件好事佩厚,期待著Dubbo能夠完善機(jī)制,更新迭代出的更好说订。
所有代碼我已上傳到github抄瓦,需要的可以自取測試,歡迎start陶冷,傳送門
https://github.com/AggerChen/spring-boot-dubbo
二钙姊、項目簡介
在Dubbo新的官網(wǎng)上查看資料,雖然也有很多demo發(fā)現(xiàn)要不還是舊包名com.alibaba.dubbo埃叭,要不就是集成的SpringBoot1.x摸恍,根本沒法滿足新的需要嘛,既然都已經(jīng)是Apache Dubbo了赤屋,當(dāng)然要使用最新的org.apache.dubbo和最新的SpringBoot2.x版本了~
此篇文章就是以一下版本來展示示例:
SpringBoot 2.2.2
org.apache.dubbo 2.7.5
zookeeper 3.4.14
三立镶、項目開發(fā)
既然是Dubbo項目,那么我們的使用場景就是分布式微服務(wù)类早,多個service和一個consumer媚媒,還需要一個公共項目common來編寫公用的類與接口。
3.1 創(chuàng)建項目spring-boot-dubbo
- 在IDEA中創(chuàng)建一個project涩僻,取名spring-boot-dubbo缭召。這是一個根項目,其中pom.xml包含依賴如下:
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<!-- 父級引用 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 基本信息 -->
<groupId>com.agger</groupId>
<artifactId>spring-boot-dubbo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>dubbo根項目</description>
<!--配置-->
<properties>
<skip_maven_deploy>true</skip_maven_deploy>
<dubbo.version>2.7.5</dubbo.version>
<zookeeper.version>3.4.14</zookeeper.version>
<spring.version>5.2.2.RELEASE</spring.version>
<dubbo.common>0.0.1-SNAPSHOT</dubbo.common>
</properties>
<modules>
<module>dubbo-common</module>
<module>dubbo-consumer</module>
<module>dubbo-provider</module>
</modules>
<!--聲明全局依賴(子項目需要顯示的引用才會繼承依賴)-->
<dependencyManagement>
<dependencies>
<!-- dubbo依賴 -->
<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>
<!-- dubbo-start依賴 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- zookeeper依賴 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--聲明全局依賴(子項目不需要顯示的引用逆日,自動繼承依賴)-->
<dependencies>
<!--spring-boot依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- lombook依賴 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 公共項目依賴 -->
<dependency>
<groupId>com.agger</groupId>
<artifactId>dubbo-common</artifactId>
<version>${dubbo.common}</version>
</dependency>
</dependencies>
<!-- 打包插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
-
通過IDEA在項目spring-boot-dubbo中創(chuàng)建三個module嵌巷,分別為:dubbo-common、dubbo-consumer室抽、dubbo-privider搪哪。生成的目錄結(jié)構(gòu)為:
3.2 dubbo-comm項目
此項目是一個公共項目,不需要其他多余的依賴坪圾,只是編寫接口和公共的類使用晓折。
編寫一個接口名為HelloService:
HelloService.java
package com.agger.dubbocommon.service;
/**
* @classname: HelloService
* @description: Hello服務(wù)接口
* @author chenhx
* @date 2020-01-14 13:55:38
*/
public interface HelloService {
String sayHello(String name);
}
pom.xml
<?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>com.agger</groupId>
<artifactId>spring-boot-dubbo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>com.agger</groupId>
<artifactId>dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-common</name>
<packaging>jar</packaging>
<description>dubbo公共項目</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.3 dubbo-provider項目
此項目是一個服務(wù)類項目惑朦,也就是將接口服務(wù)注冊到zookeeper注冊中心供消費(fèi)端調(diào)取使用。
- 編寫pom文件依賴
pom.xml
<?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>com.agger</groupId>
<artifactId>spring-boot-dubbo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<!-- 基本信息 -->
<groupId>com.agger</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<packaging>jar</packaging>
<description>dubbo項目服務(wù)端</description>
<dependencies>
<!-- dubbo依賴 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- zookeeper依賴 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 編寫一個service類實(shí)現(xiàn)接口
注意:@Service注解是dubbo里的注解漓概,不是spring里的注解
HelloServiceImpl.java
package com.agger.dubboprovider.impl;
import com.agger.dubbocommon.service.HelloService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
/**
* @classname: HelloServiceImpl
* @description: HelloService實(shí)現(xiàn)
* @author chenhx
* @date 2020-01-14 14:11:39
*/
@Service
@Component
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
System.out.println("dubbo服務(wù)調(diào)用:" + name);
return "早上好啊~" + name;
}
}
- 在springBoot啟動類上添加配置
@EnableDubboConfig注解表示開啟Dubbo的相關(guān)配置
@DubboComponentScan用來掃描提供的接口實(shí)現(xiàn)位置
DubboProviderApplication.java
package com.agger.dubboprovider;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubboConfig
@DubboComponentScan("com.agger.dubboprovider.impl")
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
- 添加dubbo配置
dubbo添加配置的方式有多種漾月,既有xml和properties也有API方式。既然我們使用的是SpringBoot那么就應(yīng)該消滅xml的配置方式胃珍,使用properties和yml方式都就可以梁肿,在此使用yml作為示例。
application.yml
server:
port: 8087 # 服務(wù)端口
dubbo:
application:
id: dubbo-provider
name: dubbo-provider #應(yīng)用名稱
owner: aggerChen #應(yīng)用所屬者
organization: agger #應(yīng)用所屬組織
registry:
id: zookeeper-registry #注冊中心id
protocol: zookeeper #注冊中心協(xié)議
address: zookeeper://127.0.0.1:2181 #注冊中心地址
metadata-report:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo #協(xié)議名稱
port: 20880 #協(xié)議端口
accesslog: dubbo-access.log #協(xié)議訪問log
provider:
retries: 0 #重試次數(shù)
timeout: 3000 #超時時間
monitor:
protocol: registry # 注冊監(jiān)控中心
3.4 dubbo-consumer項目
- 此項目就是一個web消費(fèi)項目堂鲜,當(dāng)然也可以不是web項目栈雳,在此方便演示就使用了web項目,首先來看依賴文件缔莲。依賴于provider項目一樣,只多了一個spring-boot-starter-web
pom.xml
<?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>com.agger</groupId>
<artifactId>spring-boot-dubbo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>com.agger</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-consumer</name>
<packaging>jar</packaging>
<description>dubbo項目客戶端</description>
<dependencies>
<!-- dubbo依賴 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- dubbo的zookeeper依賴 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<!-- web項目依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 編寫一個controller來調(diào)用方法
使用@Reference注解來注入接口
HelloController.java
package com.agger.dubboconsumer.controller;
import com.agger.dubbocommon.service.HelloService;
import com.agger.dubboconsumer.vo.ResultVO;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @classname: HelloController
* @description: Hello控制器
* @author chenhx
* @date 2020-01-14 13:57:48
*/
@RestController
@RequestMapping("/hello")
public class HelloController {
@Reference
HelloService helloService;
@GetMapping("/morning/{name}")
public ResultVO morning(@PathVariable("name") String name){
System.out.println(name);
String hello = helloService.sayHello(name);
System.out.println(hello);
return ResultVO.builder().flag(true).msg("調(diào)用成功").data(hello).build();
}
}
當(dāng)然你可以將調(diào)用接口的方法再封裝一層service霉旗,方便更改service的版本號等等痴奏。
- 在項目啟動類上添加配置
在項目的啟動類DubboConsumerApplication中添加Dubbo啟動注解和掃描注解。
DubboConsumerApplication.java
package com.agger.dubboconsumer;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubboConfig
@DubboComponentScan("com.agger.dubboconsumer.controller")
@SpringBootApplication
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
- 填寫配置文件
application.yml
server:
port: 8088
dubbo:
application:
name: dubbo-consumer # 應(yīng)用名稱
owner: aggerChen # 應(yīng)用所屬者
organization: agger # 應(yīng)用所屬組織
registry:
id: zookeeper-registry #注冊中心id
protocol: zookeeper #注冊中心協(xié)議
address: zookeeper://127.0.0.1:2181 #注冊中心地址
monitor:
protocol: registry # 注冊監(jiān)控中心
3.5 測試
到此為止編碼部分就完成了厌秒,現(xiàn)在開始啟動測試读拆。
- 啟動zookeeper
啟動項目之前需要先啟動zookeeper客戶端,這個可以從官網(wǎng)上去下載傳送門
選擇穩(wěn)定版本并下載鸵闪。
下載完成后檐晕,記得將conf文件夾下面的文件zoo_sample.cfg改名為zoo.cfg,然后啟動bin/zkServer.cmd就可以了蚌讼。
-
啟動dubbo-provider
如果你在內(nèi)網(wǎng)有多臺機(jī)器或者虛擬機(jī)辟灰,可以打包dubbo-provider項目在不同的機(jī)器上多啟動幾臺。并使用java -jar dubbo-provider命令啟動運(yùn)行篡石。我在IDEA中運(yùn)行查看控制臺信息:已經(jīng)成功將接口HelloService注冊到zookeeper上了
-
啟動dubbo-cosumer
啟動后可以看到consumer已經(jīng)從注冊中心訂閱了自己需要的接口
-
測試訪問
在瀏覽器訪問地址:http://localhost:8088/hello/morning/tom
或者可以用IDEA的測試工具HTTP Client非常好用
看到測試結(jié)果如下芥喇,OK,測試成功凰萨!
四继控、總結(jié)
- 以上的所有代碼我已上傳到github,需要的可以自取測試胖眷,歡迎start武通,傳送門
https://github.com/AggerChen/spring-boot-dubbo - 大家可以訪問阿里中間件團(tuán)隊的博客,傳送門珊搀,下載阿里插件可以快速構(gòu)建項目并生成需要的common冶忱、consumer、provider包食棕。
插件如下:Alibaba Cloud Toolkit
構(gòu)建Dubbo項目:
一路完成朗和,就會自動構(gòu)建需要的項目错沽,大家可以測試一下~
- 此篇文章沒有講解Dubbo的太多原理,只是一個快速上手demo眶拉,要學(xué)習(xí)更多Dubbo的其他方面還需要多多啃一啃官網(wǎng)千埃。
- 最后我們可以在dubbo-admin上查看我們的服務(wù)情況,需要選取下載項目并構(gòu)建啟動忆植,傳送門
https://github.com/apache/dubbo-admin
- 我們需要先打開dubbo-admin\dubbo-admin-server\src\main\resources\application.properties配置文件填寫zookeeper地址和登陸用戶名和密碼放可。
- Maven方式安裝:
git clone https://github.com/apache/dubbo-admin.git
cd dubbo-admin mvn clean package
cd dubbo-admin-distribution/target java -jar dubbo-admin-0.1.jar
- 如果啟動是報8080端口被占用,那么一定是zookeeper搗鬼朝刊,因為zookeeper客戶端3.5版本Zookeeper AdminServer默認(rèn)占用8080耀里,所以我們需要在客戶端配置文件zoo.cfg上添加更改端口配置:
admin.serverPort=8999
- 登陸http://localhost:8080/ 點(diǎn)擊服務(wù)查詢,輸入賬號密碼拾氓,默認(rèn)root root冯挎。可以看到我啟動的兩個dubbo-provider服務(wù)咙鞍,點(diǎn)擊消費(fèi)者可以查看消費(fèi)者ip等信息房官。