Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例

Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例

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

一、爲啥整合 Dubbo 實現 SOA

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

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

運行環境:JDK 7 或 8,Maven 3.0+
技術棧:SpringBoot 1.5+、Dubbo 2.5+、ZooKeeper 3.3+
 
1.ZooKeeper 服務註冊中心
ZooKeeper 是一個分佈式的,開放源碼的分佈式應用程序協調服務。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。
下載 ZooKeeper ,地址 http://www.apache.org/dyn/closer.cgi/zookeeper
 
解壓 ZooKeeper
 
1
tar zxvf zookeeper-3.4.8.tar.gz
 
在 conf 目錄新建 zoo.cfg ,照着該目錄的 zoo_sample.cfg 配置如下。
 
1
2
cd zookeeper-3.3.6/conf
vim zoo.cfg
 
zoo.cfg 代碼如下(自己指定 log 文件目錄):
 
1
2
3
4
tickTime=2000
dataDir=/javaee/zookeeper/data 
dataLogDir=/javaee/zookeeper/log
clientPort=2181
 
在 bin 目錄下,啓動 ZooKeeper:
 
1
2
cd zookeeper-3.3.6/bin
./zkServer.sh start
 
2. git clone 下載工程 springboot-learning-example
git clone [email protected]:JeffLi1993/springboot-learning-example.git
 
然後,Maven 編譯安裝這個工程:

 

1
2
cd springboot-learning-example
mvn clean install
 
 
3.運行 springboot-dubbo-server Dubbo 服務提供者工程
右鍵運行 springboot-dubbo-server 工程 ServerApplication 應用啓動類的 main 函數。Console 中出現如下表示項目啓動成功:
這裏表示 Dubbo 服務已經啓動成功,並註冊到 ZK (ZooKeeper)中。
 
 
4.運行 springboot-dubbo-client Dubbo 服務消費者工程
右鍵運行 springboot-dubbo-client 工程 ClientApplication 應用啓動類的 main 函數。Console 中出現如下:

 

1
2
3
4
5
...
2017-03-01 16:31:38.473  INFO 9896 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for 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 ClientApplication in 6.055 seconds (JVM running for 7.026)
City{id=1, provinceId=2, cityName='溫嶺', description='是我的故鄉'}
 
最後打印的城市信息,就是通過 Dubbo 服務接口調用獲取的。順利運行成功,下面詳解下各個代碼及配置。
 
 

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

 
1.詳解 springboot-dubbo-server Dubbo 服務提供者工程
springboot-dubbo-server 工程目錄結構
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
├── 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 配置如下

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?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 配置

 

1
2
3
4
5
6
## 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 協議名稱
spring.dubbo.protocol.port 協議端口
spring.dubbo.scan dubbo 服務類包目錄
 
c.CityDubboServiceImpl.java 城市業務 Dubbo 服務層實現層類
 
1
2
3
4
5
6
7
8
// 註冊爲 Dubbo 服務
@Service(version = "1.0.0")
public class CityDubboServiceImpl implements CityDubboService {
 
    public City findCityByName(String cityName) {
        return new City(1L,2L,"溫嶺","是我的故鄉");
    }
}
 
@Service 註解標識爲 Dubbo 服務,並通過 version 指定了版本號。
 
d.City.java 城市實體類
實體類通過 Dubbo 服務之間 RPC 調用,則需要實現序列化接口。最好指定下 serialVersionUID 值。
 
2.詳解 springboot-dubbo-client Dubbo 服務消費者工程
springboot-dubbo-client 工程目錄結構
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
├── 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 消費者通過引入接口實現 Dubbo 接口的調用。
 
a.application.properties 配置
 
1
2
3
4
5
6
7
## 避免和 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 服務消費者
 
1
2
3
4
5
6
7
8
9
10
11
12
@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 客戶端啓動類
 
1
2
3
4
5
6
7
8
9
10
11
@SpringBootApplication
public class ClientApplication {
 
    public static void main(String[] args) {
        // 程序啓動入口
        // 啓動嵌入式的 Tomcat 並初始化 Spring 環境及其各 Spring 組件
        ConfigurableApplicationContext run = SpringApplication.run(ClientApplication.class, args);
        CityDubboConsumerService cityService = run.getBean(CityDubboConsumerService.class);
        cityService.printCity();
    }
}
解釋下這段邏輯,就是啓動後從 Bean 容器中獲取城市 Dubbo 服務消費者 Bean。然後調用該 Bean 方法去驗證 Dubbo 調用是否成功。
 

四、小結

還有涉及到服務的監控,治理。這本質上和 SpringBoot 無關,所以這邊不做一一介紹。感謝阿里 teaey 提供的 starter-dubbo 項目。
發佈了51 篇原創文章 · 獲贊 24 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章