版本:
Java :1.8
Spring Boot :2.2.10
Dubbo Spring Boot :0.2.0
項目結構:
-
api 模塊——接口、實體等定義
-
provider 模塊——提供者
-
consumer 模塊——消費者
項目地址:
Github 地址:https://github.com/Silentims/springboot-dubbo
一、父工程項目 Dubbo:
1. 在 IDEA 中新建一個 SpringBoot 初始化項目
2. 給項目起名,使用 jdk1.8版本
3. 選擇 springboot 的版本:
4. 刪除多余不用文件目錄
5. 編輯 pom.xml 文件,添加打包方式為 pom,增加子模塊 module 引用(后面步驟一一創建),完整 xml 文件如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.2.10.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.example</groupId> 12 <artifactId>dubbo-boot</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <name>dubbo-boot</name> 15 <description>Spring Boot整合Dubbo(注解方式)</description> 16 17 <!--打包方式:pom--> 18 <packaging>pom</packaging> 19 20 <properties> 21 <java.version>1.8</java.version> 22 </properties> 23 24 <!--子模塊引用--> 25 <modules> 26 <module>dubbo-api</module> 27 <module>dubbo-consumer</module> 28 <module>dubbo-provider</module> 29 </modules> 30 31 <dependencies> 32 <dependency> 33 <groupId>org.springframework.boot</groupId> 34 <artifactId>spring-boot-starter</artifactId> 35 </dependency> 36 37 <dependency> 38 <groupId>org.springframework.boot</groupId> 39 <artifactId>spring-boot-starter-test</artifactId> 40 <scope>test</scope> 41 <exclusions> 42 <exclusion> 43 <groupId>org.junit.vintage</groupId> 44 <artifactId>junit-vintage-engine</artifactId> 45 </exclusion> 46 </exclusions> 47 </dependency> 48 </dependencies> 49 50 <build> 51 <plugins> 52 <plugin> 53 <groupId>org.springframework.boot</groupId> 54 <artifactId>spring-boot-maven-plugin</artifactId> 55 </plugin> 56 </plugins> 57 </build> 58 59 </project>
二、api 模塊
1. 創建子模塊(與第一步一樣創建流程)
2. 刪除多余的文件目錄,也刪除主啟動類,該模塊主要定義接口,實體,公共資源,這里演示整合 dubbo 的demo 接口,代碼目錄結構如下
3. 修改pom.xml 文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.2.10.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.example</groupId> 12 <artifactId>dubbo-api</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <name>dubbo-api</name> 15 <description>Demo project for Spring Boot</description> 16 17 <!--打包方式:jar--> 18 <packaging>jar</packaging> 19 20 <properties> 21 <java.version>1.8</java.version> 22 </properties> 23 24 <dependencies> 25 <dependency> 26 <groupId>org.springframework.boot</groupId> 27 <artifactId>spring-boot-starter</artifactId> 28 </dependency> 29 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-test</artifactId> 33 <scope>test</scope> 34 <exclusions> 35 <exclusion> 36 <groupId>org.junit.vintage</groupId> 37 <artifactId>junit-vintage-engine</artifactId> 38 </exclusion> 39 </exclusions> 40 </dependency> 41 </dependencies> 42 43 <build> 44 <plugins> 45 <plugin> 46 <groupId>org.springframework.boot</groupId> 47 <artifactId>spring-boot-maven-plugin</artifactId> 48 </plugin> 49 </plugins> 50 </build> 51 52 </project>
4. 接口代碼如下:
package com.example.dubbo.api.manager; /** * 接口定義 * @auth Jessy Heung * @date 2020-09-25 */ public interface DemoApi { /** * demo 方法 * @param name * @return */ String sayHello(String name); }
5. 完整的 api 模塊,代碼結構如下:
三、provider 模塊
1. 創建子模塊 dubbo-provider,與前面流程一樣,創建后刪除多余文件,文件目錄如下:
2. 修改 pom.xml 文件,完整配置如下(注釋的部分為新增的依賴):
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.2.10.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.example</groupId> 12 <artifactId>dubbo-provider</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <name>dubbo-provider</name> 15 <description>Demo project for Spring Boot</description> 16 17 <!--打包方式:jar--> 18 <packaging>jar</packaging> 19 20 <properties> 21 <java.version>1.8</java.version> 22 </properties> 23 24 <dependencies> 25 <dependency> 26 <groupId>org.springframework.boot</groupId> 27 <artifactId>spring-boot-starter</artifactId> 28 </dependency> 29 30 <!-- dubbo provider 啟動不成功的主要問題在這里,沒有添加 spring-boot-starter-web 依賴,所以啟動日志里一直沒有顯示 “o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8087 (http)” 這行日志輸出 --> 31 <dependency> 32 <groupId>org.springframework.boot</groupId> 33 <artifactId>spring-boot-starter-web</artifactId> 34 </dependency> 35 36 <!-- 這個是定義的接口包,在 provider 和 consumer 都需要引用的 --> 37 <dependency> 38 <groupId>com.example</groupId> 39 <artifactId>dubbo-api</artifactId> 40 <version>0.0.1-SNAPSHOT</version> 41 </dependency> 42 43 <!--新增 dubbo 依賴--> 44 <dependency> 45 <groupId>com.alibaba.boot</groupId> 46 <artifactId>dubbo-spring-boot-starter</artifactId> 47 <version>0.2.0</version> 48 </dependency> 49 50 <dependency> 51 <groupId>org.springframework.boot</groupId> 52 <artifactId>spring-boot-starter-test</artifactId> 53 <scope>test</scope> 54 <exclusions> 55 <exclusion> 56 <groupId>org.junit.vintage</groupId> 57 <artifactId>junit-vintage-engine</artifactId> 58 </exclusion> 59 </exclusions> 60 </dependency> 61 </dependencies> 62 63 <build> 64 <plugins> 65 <plugin> 66 <groupId>org.springframework.boot</groupId> 67 <artifactId>spring-boot-maven-plugin</artifactId> 68 </plugin> 69 </plugins> 70 </build> 71 72 </project>
3. 修改 application 配置文件(這里我改成了 yml 文件格式)
1 server: 2 port: 8087 3 4 dubbo: 5 application: 6 # 這個 name 作為提供者展示(在 dubbo-admin 可視化界面看到的提供者名稱就是這個) 7 name: dubbo-springboot-provider 8 # 應用所屬者 9 owner: Jessy Heung 10 # 應用所屬組織 11 organization: Jessy Heung 12 registry: 13 id: zookeeper-registry 14 # 注冊中心協議 15 protocol: zookeeper 16 # 注冊中心地址 此處采用本地 zk 注冊,服務器的話寫對應 ip 地址 17 address: zookeeper://127.0.0.1:2181 18 19 # dubbo協議在20880端口暴露服務 20 # 協議名稱 21 protocol: 22 name: dubbo 23 # 協議端口 24 port: 20880 25 # 協議訪問log 26 accesslog: dubbo-access.log 27 # 重試次數 28 provider: 29 retries: 0 30 # 超時時間 31 timeout: 3000 32 # 注冊監控中心 33 monitor: 34 protocol: registry
4. 寫服務實現代碼,創建一個服務實現類,具體代碼如下:
-
注意@service 注解為 dubbo 下的
1 package com.example.dubbo.provider.impl; 2 3 import com.alibaba.dubbo.config.annotation.Service; 4 import com.example.dubbo.api.manager.DemoApi; 5 import org.slf4j.Logger; 6 import org.slf4j.LoggerFactory; 7 8 @Service 9 public class DemoApiImpl implements DemoApi { 10 11 public static final Logger logger = LoggerFactory.getLogger(DemoApiImpl.class); 12 13 @Override 14 public String sayHello(String name) { 15 logger.info("【提供者】【服務實現】---請求參數 name :{}",name); 16 return "hello"+ name +"(Springboot 整合 Dubbo --采用注解方式)"; 17 } 18 }
5. 主啟動類中,啟動用 dubbo
1 package com.example.dubbo.provider; 2 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 @SpringBootApplication 8 @EnableDubbo //啟用 dubbo 9 public class DubboProviderApplication { 10 11 public static void main(String[] args) { 12 SpringApplication.run(DubboProviderApplication.class, args); 13 } 14 15 }
6. 完整的文件目錄結構:
四、consumer 模塊
1. 創建子模塊 dubbo-consumer(流程與 provider 一樣,只是模塊名稱不一樣)
2. 修改 pom.xml(與 provider 一樣)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.2.10.RELEASE</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.example</groupId> 12 <artifactId>dubbo-consumer</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <name>dubbo-consumer</name> 15 <description>Demo project for Spring Boot</description> 16 17 <!--打包方式:jar--> 18 <packaging>jar</packaging> 19 20 <properties> 21 <java.version>1.8</java.version> 22 </properties> 23 24 <dependencies> 25 <dependency> 26 <groupId>org.springframework.boot</groupId> 27 <artifactId>spring-boot-starter</artifactId> 28 </dependency> 29 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-test</artifactId> 33 <scope>test</scope> 34 <exclusions> 35 <exclusion> 36 <groupId>org.junit.vintage</groupId> 37 <artifactId>junit-vintage-engine</artifactId> 38 </exclusion> 39 </exclusions> 40 </dependency> 41 42 <!-- dubbo consumer 啟動不成功的主要問題在這里,沒有添加 spring-boot-starter-web 依賴,所以啟動日志里一直沒有顯示 “o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8088 (http)” 這行日志輸出 --> 43 <dependency> 44 <groupId>org.springframework.boot</groupId> 45 <artifactId>spring-boot-starter-web</artifactId> 46 </dependency> 47 48 <!-- 這個是定義的接口包,在 provider 和 consumer 都需要引用的 --> 49 <dependency> 50 <groupId>com.example</groupId> 51 <artifactId>dubbo-api</artifactId> 52 <version>0.0.1-SNAPSHOT</version> 53 </dependency> 54 55 <!--新增 dubbo 依賴--> 56 <dependency> 57 <groupId>com.alibaba.boot</groupId> 58 <artifactId>dubbo-spring-boot-starter</artifactId> 59 <version>0.2.0</version> 60 </dependency> 61 62 </dependencies> 63 64 <build> 65 <plugins> 66 <plugin> 67 <groupId>org.springframework.boot</groupId> 68 <artifactId>spring-boot-maven-plugin</artifactId> 69 </plugin> 70 </plugins> 71 </build> 72 73 </project>
3. 修改 application 配置文件(改為 yml 格式),主要是修改端口號,application 名稱
1 server: 2 port: 8088 3 4 dubbo: 5 application: 6 # dubbo admin中消費者名稱 7 name: dubbo-springboot-consumer 8 # 應用所屬者 9 owner: Jessy Heung 10 # 應用所屬組織 11 organization: Jessy Heung 12 registry: 13 id: zookeeper-registry 14 # 注冊中心協議 15 protocol: zookeeper 16 # 注冊中心地址 此處為本地 zk 注冊 17 address: zookeeper://127.0.0.1:2181 18 19 # dubbo協議在20880端口暴露服務 20 # 協議名稱 21 protocol: 22 name: dubbo 23 # 協議端口 24 port: 20880 25 # 協議訪問log 26 accesslog: dubbo-access.log 27 # 重試次數 28 provider: 29 retries: 0 30 # 超時時間 31 timeout: 3000 32 # 注冊監控中心 33 monitor: 34 protocol: registry
4. 服務層代碼實現
1 package com.example.dubbo.consumer.service; 2 3 import com.alibaba.dubbo.config.annotation.Reference; 4 import com.example.dubbo.api.manager.DemoApi; 5 import org.slf4j.Logger; 6 import org.slf4j.LoggerFactory; 7 import org.springframework.stereotype.Service; 8 9 /** 10 * 消費者-服務層 11 * @auth Jessy Heung 12 * @date 2020-09-25 13 */ 14 @Service //此處為 spring 的注解 15 public class DemoService { 16 private static final Logger logger = LoggerFactory.getLogger(DemoService.class); 17 18 @Reference //dubbo 注解 19 private DemoApi demoApi; 20 21 public String sayHello(String name){ 22 logger.info("【消費者】【服務層】---請求參數 name :{}",name); 23 return demoApi.sayHello(name); 24 } 25 }
5. 控制層代碼實現
1 package com.example.dubbo.consumer.controller; 2 3 import com.example.dubbo.consumer.service.DemoService; 4 import org.slf4j.Logger; 5 import org.slf4j.LoggerFactory; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestMethod; 9 import org.springframework.web.bind.annotation.ResponseBody; 10 import org.springframework.web.bind.annotation.RestController; 11 12 /** 13 * 消費者--控制層 14 * @auth Jessy Heung 15 * @date 2020-09-25 16 */ 17 @RestController 18 @RequestMapping("/demo") 19 public class DemoController { 20 21 private static Logger logger = LoggerFactory.getLogger(DemoController.class); 22 23 @Autowired 24 private DemoService demoService; 25 26 /** 27 * 打開瀏覽器,輸入/demo/sayHello 28 * @return 29 */ 30 @RequestMapping(value = "/sayHello", method = RequestMethod.GET) 31 @ResponseBody 32 public String sayHello(){ 33 logger.info("【消費者】【控制層】---請求入口"); 34 return demoService.sayHello("Jessy"); 35 } 36 }
6. 主啟動類中,啟動用 dubbo
1 package com.example.dubbo.consumer; 2 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 @SpringBootApplication 8 @EnableDubbo 9 public class DubboConsumerApplication { 10 public static void main(String[] args) { 11 SpringApplication.run(DubboConsumerApplication.class, args); 12 } 13 }
7. 完整文件目錄結構
五、編譯和部署 dubbo admin
1. 下載官方項目Git 克隆到本地,官方項目地址https://github.com/apache/dubbo-admin
git clone https://github.com/apache/dubbo-admin.git
2. 打開項目中的 README_ZH.md 文件,按照教程部署即可
3. 瀏覽器輸入:localhost://8080訪問,如下頁面表示部署成功
六、啟動項目,測試
1. 先啟動 provider,后啟動 consumer:
2. 訪問地址 localhost:8088/demo/sayHello
七、查看 dubbo admin 中的服務調用情況
1. 查看服務信息
2. 查看服務調用關系
至此,springboot 整合 dubbo 采用注解的簡單 demo 完成。
Github 項目地址:https://github.com/Silentims/springboot-dubbo