Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例 | 泥瓦匠BYSocket

2023-05-11 10:17 更新
摘要: 原創(chuàng)出處:www.bysocket.com 泥瓦匠BYSocket 希望轉載,保留摘要,謝謝!
“看看星空,會覺得自己很渺小,可能我們在宇宙中從來就是一個偶然。所以,無論什么事情,仔細想一想,都沒有什么大不了的。這能幫助自己在遇到挫折時穩(wěn)定心態(tài),想得更開?!? – 《騰訊傳》
本文提綱
一、為啥整合 Dubbo 實現(xiàn) SOA
二、運行 springboot-dubbo-server 和 springboot-dubbo-client 工程
三、springboot-dubbo-server 和 springboot-dubbo-client 工程配置詳解

Spring Boot 系列文章:《Spring Boot 那些事

一、為啥整合 Dubbo 實現(xiàn) SOA

Dubbo 不單單只是高性能的 RPC 調用框架,更是 SOA 服務治理的一種方案。
核心
1. 遠程通信,向本地調用一樣調用遠程方法。
2. 集群容錯
3. 服務自動發(fā)現(xiàn)和注冊,可平滑添加或者刪除服務提供者。
我們常常使用 Springboot 暴露 HTTP 服務,并走 JSON 模式。但慢慢量大了,一種 SOA 的治理方案。這樣可以暴露出 Dubbo 服務接口,提供給 Dubbo 消費者進行 RPC 調用。下面我們詳解下如何集成 Dubbo。

 

二、運行 springboot-dubbo-server 和 springboot-dubbo-client 工程

運行環(huán)境:JDK 7 或 8,Maven 3.0+
技術棧:SpringBoot 1.5+、Dubbo 2.5+、ZooKeeper 3.3+

 

1.ZooKeeper 服務注冊中心
ZooKeeper 是一個分布式的,開放源碼的分布式應用程序協(xié)調服務。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
下載 ZooKeeper ,地址 http://www.apache.org/dyn/closer.cgi/zookeeper

解壓 ZooKeeper

tar zxvf zookeeper-3.4.8.tar.gz

在 conf 目錄新建 zoo.cfg ,照著該目錄的 zoo_sample.cfg 配置如下。

cd zookeeper-3.3.6/conf
vim zoo.cfg

zoo.cfg 代碼如下(自己指定 log 文件目錄):

tickTime=2000
dataDir=/javaee/zookeeper/data 
dataLogDir=/javaee/zookeeper/log
clientPort=2181

在 bin 目錄下,啟動 ZooKeeper:

cd zookeeper-3.3.6/bin
./zkServer.sh start
2. git clone 下載工程 springboot-learning-example
git clone git@github.com:JeffLi1993/springboot-learning-example.git

然后,Maven 編譯安裝這個工程:

cd springboot-learning-example
mvn cleaninstall
3.運行 springboot-dubbo-server Dubbo 服務提供者工程
右鍵運行 springboot-dubbo-server 工程 ServerApplication 應用啟動類的 main 函數(shù)。Console 中出現(xiàn)如下表示項目啟動成功:
這里表示 Dubbo 服務已經啟動成功,并注冊到 ZK (ZooKeeper)中。

 

4.運行 springboot-dubbo-client Dubbo 服務消費者工程

右鍵運行 springboot-dubbo-client 工程 ClientApplication 應用啟動類的 main 函數(shù)。Console 中出現(xiàn)如下:

...
2017-03-01 16:31:38.473  INFO 9896 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beansfor JMX exposure on startup
2017-03-01 16:31:38.538  INFO 9896 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2017-03-01 16:31:38.547  INFO 9896 --- [           main] org.spring.springboot.ClientApplication  : Started ClientApplicationin 6.055 seconds (JVM runningfor 7.026)
City{id=1, provinceId=2, cityName='溫嶺', description='是我的故鄉(xiāng)'}
最后打印的城市信息,就是通過 Dubbo 服務接口調用獲取的。順利運行成功,下面詳解下各個代碼及配置。

 

三、springboot-dubbo-server 和 springboot-dubbo-client 工程配置詳解

代碼都在 GitHub 上, https://github.com/JeffLi1993/springboot-learning-example。
1.詳解 springboot-dubbo-server Dubbo 服務提供者工程

springboot-dubbo-server 工程目錄結構

├── pom.xml
└── src
   └── main
       ├── java
       │   └── org
       │       └── spring
       │           └── springboot
       │               ├── ServerApplication.java
       │               ├── domain
       │               │   └── City.java
       │               └── dubbo
       │                   ├── CityDubboService.java
       │                   └── impl
       │                       └── CityDubboServiceImpl.java
       └── resources
           └── application.properties
a.pom.xml 配置

pom.xml 中依賴了 spring-boot-starter-dubbo 工程,該項目地址是 https://github.com/teaey/spring-boot-starter-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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>springboot</groupId>
    <artifactId>springboot-dubbo-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-dubbo 服務端:: 整合 Dubbo/ZooKeeper 詳解 SOA 案例</name>
    <!-- Spring Boot 啟動父依賴 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>
    <properties>
        <dubbo-spring-boot>1.0.0</dubbo-spring-boot>
    </properties>
    <dependencies>
        <!-- Spring Boot Dubbo 依賴 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>${dubbo-spring-boot}</version>
        </dependency>
        <!-- Spring Boot Web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Boot Test 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

b.application.properties 配置

## Dubbo 服務提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=org.spring.springboot.dubbo

這里 ZK 配置的地址和端口,就是上面本機搭建的 ZK 。如果有自己的 ZK 可以修改下面的配置。配置解釋如下:
spring.dubbo.application.name 應用名稱
spring.dubbo.registry.address 注冊中心地址
spring.dubbo.protocol.name 協(xié)議名稱
spring.dubbo.protocol.port 協(xié)議端口
spring.dubbo.scan dubbo 服務類包目錄

c.CityDubboServiceImpl.java 城市業(yè)務 Dubbo 服務層實現(xiàn)層類

// 注冊為 Dubbo 服務
@Service(version ="1.0.0")
public class CityDubboServiceImplimplements CityDubboService {
   public City findCityByName(String cityName) {
       return new City(1L,2L,"溫嶺","是我的故鄉(xiāng)");
   }
}
@Service 注解標識為 Dubbo 服務,并通過 version 指定了版本號。
d.City.java 城市實體類
實體類通過 Dubbo 服務之間 RPC 調用,則需要實現(xiàn)序列化接口。最好指定下 serialVersionUID 值。

 

2.詳解 springboot-dubbo-client Dubbo 服務消費者工程

springboot-dubbo-client 工程目錄結構

├── pom.xml
└── src
   └── main
       ├── java
       │   └── org
       │       └── spring
       │           └── springboot
       │               ├── ClientApplication.java
       │               ├── domain
       │               │   └── City.java
       │               └── dubbo
       │                   ├── CityDubboConsumerService.java
       │                   └── CityDubboService.java
       └── resources
           └── application.properties
pom.xml 、 CityDubboService.java、City.java 沒有改動。Dubbo 消費者通過引入接口實現(xiàn) Dubbo 接口的調用。

a.application.properties 配置

## 避免和 server 工程端口沖突
server.port=8081
## Dubbo 服務消費者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=org.spring.springboot.dubbo
因為 springboot-dubbo-server 工程啟動占用了 8080 端口,所以這邊設置端口為 8081。 

b.CityDubboConsumerService.java 城市 Dubbo 服務消費者

@Component
public class CityDubboConsumerService {
   @Reference(version ="1.0.0")
   CityDubboService cityDubboService;
   public void printCity() {
       String cityName="溫嶺";
       City city = cityDubboService.findCityByName(cityName);
       System.out.println(city.toString());
   }
}
@Reference(version = “1.0.0”) 通過該注解,訂閱該接口版本為 1.0.0 的 Dubbo 服務。

這里將 CityDubboConsumerService 注入 Spring 容器,是為了更方便的獲取該 Bean,然后驗證這個 Dubbo 調用是否成功。

 

c.ClientApplication.java 客戶端啟動類
@SpringBootApplication
public class ClientApplication {
   public static void main(String[] args) {
       // 程序啟動入口
       // 啟動嵌入式的 Tomcat 并初始化 Spring 環(huán)境及其各 Spring 組件
       ConfigurableApplicationContext run = SpringApplication.run(ClientApplication.class, args);
       CityDubboConsumerService cityService = run.getBean(CityDubboConsumerService.class);
       cityService.printCity();
   }
}
解釋下這段邏輯,就是啟動后從 Bean 容器中獲取城市 Dubbo 服務消費者 Bean。然后調用該 Bean 方法去驗證 Dubbo 調用是否成功。

四、小結

還有涉及到服務的監(jiān)控,治理。這本質上和 SpringBoot 無關,所以這邊不做一一介紹。感謝阿里 teaey 提供的 starter-dubbo 項目。

 

歡迎掃一掃我的公眾號關注 — 及時得到博客訂閱哦!
— http://www.bysocket.com/ —
— https://github.com/JeffLi1993 —



以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號