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

2023-05-11 10:17 更新
摘要: 原創(chuàng)出處:www.bysocket.com 泥瓦匠BYSocket 希望轉(zhuǎn)載,保留摘要,謝謝!
“看看星空,會覺得自己很渺小,可能我們在宇宙中從來就是一個偶然。所以,無論什么事情,仔細(xì)想一想,都沒有什么大不了的。這能幫助自己在遇到挫折時穩(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 調(diào)用框架,更是 SOA 服務(wù)治理的一種方案。
核心
1. 遠(yuǎn)程通信,向本地調(diào)用一樣調(diào)用遠(yuǎn)程方法。
2. 集群容錯
3. 服務(wù)自動發(fā)現(xiàn)和注冊,可平滑添加或者刪除服務(wù)提供者。
我們常常使用 Springboot 暴露 HTTP 服務(wù),并走 JSON 模式。但慢慢量大了,一種 SOA 的治理方案。這樣可以暴露出 Dubbo 服務(wù)接口,提供給 Dubbo 消費者進(jìn)行 RPC 調(diào)用。下面我們詳解下如何集成 Dubbo。

 

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

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

 

1.ZooKeeper 服務(wù)注冊中心
ZooKeeper 是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù)。它是一個為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。
下載 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 服務(wù)提供者工程
右鍵運行 springboot-dubbo-server 工程 ServerApplication 應(yīng)用啟動類的 main 函數(shù)。Console 中出現(xiàn)如下表示項目啟動成功:
這里表示 Dubbo 服務(wù)已經(jīng)啟動成功,并注冊到 ZK (ZooKeeper)中。

 

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

右鍵運行 springboot-dubbo-client 工程 ClientApplication 應(yīng)用啟動類的 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 服務(wù)接口調(diào)用獲取的。順利運行成功,下面詳解下各個代碼及配置。

 

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

1.詳解 springboot-dubbo-server Dubbo 服務(wù)提供者工程

springboot-dubbo-server 工程目錄結(jié)構(gòu)

├── 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 服務(wù)端:: 整合 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 服務(wù)提供者配置
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 應(yīng)用名稱
spring.dubbo.registry.address 注冊中心地址
spring.dubbo.protocol.name 協(xié)議名稱
spring.dubbo.protocol.port 協(xié)議端口
spring.dubbo.scan dubbo 服務(wù)類包目錄

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

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

 

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

springboot-dubbo-client 工程目錄結(jié)構(gòu)

├── 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 接口的調(diào)用。

a.application.properties 配置

## 避免和 server 工程端口沖突
server.port=8081
## Dubbo 服務(wù)消費者配置
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 端口,所以這邊設(shè)置端口為 8081。 

b.CityDubboConsumerService.java 城市 Dubbo 服務(wù)消費者

@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 服務(wù)。

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

 

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 服務(wù)消費者 Bean。然后調(diào)用該 Bean 方法去驗證 Dubbo 調(diào)用是否成功。

四、小結(jié)

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

 

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



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號