Dubbo是Alibaba開源的分布式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合),從服務模型的角度來看,Dubbo采用的是一種非常簡單的模型,要么是提供方提供服務,要么是消費方消費服務,所以基于這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色,

Dubbo 的RPC 呼叫流程主要涉及到4個模塊:
1、Registry:服務注冊,我們一般會采取Zookeeper 作為我們的注冊中心
2、Provider:服務提供者(生產者),提供具體的服務實作
3、Consumer:消費者,從注冊中心中訂閱服務
4、Monitor:監控中心,RPC呼叫次數和呼叫時間監控
從上圖中我們可以看出RPC 服務呼叫的程序主要為:
1、生產者發布服務到服務注冊中心
2、消費者在服務注冊中心中訂閱服務
3、消費者呼叫已注冊的服務
1、IDEA下將SpringBoot與dubbo整合
專案結構圖

- common: 通用模塊
- provider: 服務提供者
- consumer: 服務呼叫者
## 最外部springboot-dubbo的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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lcxu</groupId>
<artifactId>springboot-dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-dubbo</name>
<description>Demo project for Spring Boot-Dubbo</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<modules>
<module>common</module>
<module>provider</module>
<module>consumer</module>
</modules>
<dependencies>
<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>
</dependency>
<!--dubbo-springBoot依賴-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>1.0.1</version>
</dependency>
<!--zookeeper依賴-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.11</version>
</dependency>
<!--
1)zookeeper原生API使用中,經常會遇到session expire這類例外,例外發生后需要進行重新連接,重新建立session,會比較麻煩
2)zookeeper的watcher機制是一次性的,如果你想訂閱節點的狀態變化、子節點變化等,每次在處理完變化事件之后,需要重新注冊watcher,可想而知這是一件令人絕望的事情,這個特性使得在處理事件和重新加上watcher這段時間發生的節點變化將無法被感知,
3)zookeeper的API介面中,節點資料默認為二進制byte陣列,如果想直接保存物件型別的資料,需要相關的序列化作業,
以上問題,zkClient可以很好的解決,
-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.5</version>
</plugin>
</plugins>
</build>
</project>
公共pom主要引入了: SpringBoot依賴,dubbo-springBoot依賴,zookeeper依賴,zkClient依賴等,
1、provider模塊
-
專案代碼結構:

-
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.lcxu</groupId>
<artifactId>springboot-dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.lcxu</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.5</version>
</plugin>
</plugins>
</build>
</project>
- application.yml
server:
port: 8081
spring:
dubbo:
appname: provider
registry: zookeeper://127.0.0.1:2181
protocol: dubbo
port: 20880
- ProviderApplication
package com.example.provider;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo //啟動dubbo服務,它整合了 @EnableDubboConfig 和 @DubboComponentScan
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
- BookServiceImpl
package com.example.provider.service.impl;
import com.lcxu.common.api.provider.IBookServiceApi;
import org.springframework.stereotype.Service;
@Service
@com.alibaba.dubbo.config.annotation.Service
public class BookServiceImpl implements IBookServiceApi {
@Override
public String sayHello() {
return "hello, dubbo!這是一個簡單的dubbo-demo!";
}
}
Provider模塊代碼就這么多,
2、Consumer模塊
-
專案代碼結構

-
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.lcxu</groupId>
<artifactId>springboot-dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.lcxu</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.5</version>
</plugin>
</plugins>
</build>
</project>
- application.yml
server:
port: 8082
spring:
dubbo:
appname: provider
registry: zookeeper://127.0.0.1:2181
protocol: dubbo
port: 20880
- ConsumerApplication
package com.example.consumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
- BookController
package com.example.consumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.lcxu.common.api.provider.IBookServiceApi;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/book")
public class BookController {
@Reference
private IBookServiceApi bookService;
@GetMapping("/book")
private String getBook() {
return this.bookService.sayHello();
}
}
呼叫provider模塊定義的service的時候,必須要加入@Reference注解
@Reference是dubbo的注解,也是注入,他一般注入的是分布式的遠程服務的物件,需要dubbo配置使用,
3、common模塊
common只是一個基礎包,可以放一些介面,或者工具類,一些bean等,
- 專案結構圖

- 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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lcxu</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>common</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.5</version>
</plugin>
</plugins>
</build>
</project>
- IBookServiceApi
只定義了一個公共介面
package com.lcxu.common.api.provider;
public interface IBookServiceApi {
String sayHello();
}
至此,代碼模塊撰寫完成,但是目前還不能運行,因為還沒有啟動zookeeper,
2、zookeeper的安裝,windows為例
1、下載zookeeper
下載地址:
https://zookeeper.apache.org/releases.html
2、解壓

3、復制zoo_simple.cfg,重命名為zoo.cfg

根據實際情況修改下面配置

4、啟動zookeeper

zookeeper命令,參照下面鏈接
zookeeper之 zkServer.sh命令、zkCli.sh命令、四字命令
cnblogs.com/andy6/p/7674028.html
啟動zookeeper后,然后啟動provider與consumer模塊,再瀏覽器輸入http://localhost:8082/book/book,即可實作模塊的遠程呼叫,

3、zookeeper可視化工具 zkui
1、下載zkui原始碼
原始碼地址:https://github.com/DeemOpen/zkui.git
2、編譯
mvn clean
mvn install
編譯成功,此時生成兩個jar包,zkui-2.0-SNAPSHOT.jar和zkui-2.0-SNAPSHOT-jar-with-dependencies.jar,使用的是第二個jar包
3、修改組態檔
zkui運行生成的jar包,可以直接運行,在運行該檔案之前,我們還需要修改zkui的組態檔config.cfg,config.cfg 檔案中配置了zkui需要連接的zookeeper集群的IP地址和埠,訪問UI的用戶名和密碼,以及zkui監聽的埠號

4、啟動程式
java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar
注意,需要將config.cfg復制到jar包的同一層目錄去,不然啟動會報錯


5、訪問頁面,輸入組態檔里的用戶名密碼


6、登錄zkui ,選擇導航“Host” 出現錯誤提示:KeeperErrorCode = NoNode for /appconfig/hosts 如下所示:

解決方案:
- 啟動zkcli.cmd客戶端,然后執行下面命令即可,

- 重繪,正常

至此,完成!
專案代碼地址:https://gitee.com/lcxu/springboot-dubbo.git
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/281759.html
標籤:其他
上一篇:【高效編碼】IDEA的常用插件(二)!!!,非常實用(DataBase,VisualVM Launcher等等)
下一篇:Spring學習(一):框架概述
