閱讀583 返回首頁    go 技術社區[雲棲]


Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例

“看看星空,會覺得自己很渺小,可能我們在宇宙中從來就是一個偶然。所以,無論什麼事情,仔細想一想,都沒有什麼大不了的。這能幫助自己在遇到挫折時穩定心態,想得更開。”  – 《騰訊傳》
本文提綱
一、為啥整合 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 ,地址 https://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
項目地址見 GitHub – https://github.com/JeffLi1993/springboot-learning-example
git clone git@github.com:JeffLi1993/springboot-learning-example.git

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

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 中出現如下:

...
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 工程目錄結構
├── 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="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://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 協議名稱
spring.dubbo.protocol.port 協議端口
spring.dubbo.scan dubbo 服務類包目錄
c.CityDubboServiceImpl.java 城市業務 Dubbo 服務層實現層類
// 注冊為 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 工程目錄結構
├── 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 配置
## 避免和 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 環境及其各 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 項目。
推薦《Spring boot 那些事



最後更新:2017-05-19 10:01:34

  上一篇:go  《雲周刊》第119期:運維/DevOps在線技術峰會:文章、PDF+回顧視頻!
  下一篇:go  產品的細節能決定成敗嗎?