1. 程式人生 > >Springboot整合Dubbo/ZooKeeper 詳解 SOA 案例

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

專案地址見 GitHub – https://github.com/JeffLi1993/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 工程配置詳解

程式碼都在 GitHub 上, https://github.com/JeffLi1993/springboot-learning-example

 

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 專案