SpringBoot 整合Dubbo構建分散式服務
SpringBoot Dubbo 實踐 概述:
Dubbo是Alibaba開源的分散式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地鬆耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。
專案構建
注:專案構建通過: http://start.spring.io/ 快速構建web 專案,
具體操作可以參考《SpringBoot使用SpringDataJPA完成資料查詢 -Demo》。
在基礎環境確定好了之後,我們專案的目錄結構如下:
**上圖所示,我們專案主要分為了兩個模組,
一部分是生產者:hdd-doorplate-dubbo-server ,
一部分是消費者:hdd-doorplate-dubbo-client。
hdd
父pom檔案當中的配置資訊
<?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>com.herbert.hdd</groupId> <artifactId>hdd</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <!-- 引入專案子模組 --> <modules> <module>hdd-doorplate-dubbo-server</module> <module>hdd-doorplate-dubbo-client</module> </modules> </project>
配置檔案
由於我們底層使用的是Spring-Boot 進行開發,那麼我們就應該善於利用Spring-Boot 給我們帶來的優勢,因此我們可以直接在Application.properties 檔案中配置Dubbo 服務:
server.port=6660 ## Dubbo 服務提供者配置 spring.dubbo.application.name=provider spring.dubbo.registry.address=zookeeper://127.0.0.1:2182 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=20880 spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo
服務提供
在服務提供主要包括兩部分,一個是暴露服務,一個是服務實現
暴露服務:即我們平常開發中所使用的的介面,這裡我們建立一個 DoorplateServer 的介面,主要包括操作資訊的方法。
package com.herbret.hdd.doorplate.dubbo;
import java.util.List;
/**
* Created by Herbert on 2018/11/7.
*
* 程式業務 Dubbo 服務層
*
*/
public interface DoorplateServer {
/**
* 查詢資訊
* @return
*/
List<String> list();
}
服務實現:
服務實現,與我們平常的服務一樣,對介面進行實現,比較特別的是,我們這裡需要使用到Dubbo 的 @Service 註解
package com.herbert.hdd.doorplate.dubbo.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Herbert on 2018/11/7.
*/
// 註冊為 Dubbo 服務
@Service(version = "1.0.0")
public class DoorplateServerImpl implements DoorplateServer {
@Override
public List<String> list() {
List<String> list = new ArrayList<String>();
list.add("城市中心運動公園");
return list;
}
}
hdd-doorplate-dubbo-server
pom檔案配置
<?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>com.herbert.hdd</groupId>
<artifactId>hdd-doorplate-dubbo-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hdd-doorplate-dubbo-server</name>
<description>Doorplate project for Spring Boot</description>
<!-- 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>
hdd-doorplate-dubbo-client
pom檔案配置
<?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>com.herbert.hdd</groupId>
<artifactId>hdd-doorplate-dubbo-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hdd-doorplate-dubbo-server</name>
<description>Doorplate project for Spring Boot</description>
<!-- 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>
配置檔案
配置檔案與生產者稍有區別:
## 避免和 server 工程埠衝突
server.port=6661
## Dubbo 服務消費者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2182
spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo
服務實現
在這裡,如果我們需要呼叫註冊服務中的相關服務,則需要實現相關的介面。
package com.herbert.hdd.doorplate.dubbo;
import java.util.List;
/**
* Created by Herbert on 2018/11/7.
*/
public interface DoorplateServer {
List<String> list();
}
服務呼叫
我們需要實現一個RESTful 介面,提供給使用者呼叫:
package com.herbert.hdd.doorplate.dubbo.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Created by Herbert on 2018/11/7.
*/
@RestController
@RequestMapping("/user")
public class DoorpalteController {
@Reference(version = "1.0.0")
DoorplateServer doorplateServer;
@RequestMapping("/list")
public List<String> list(){
List<String> list =doorplateServer.list();
System.out.println(list.toString());
return list;
}
}
另外,我們還可以在需要使用到生產者中的方法,則需要建立一個介面,然後再呼叫時,使用 @Reference 註解進行引用也可以直接引用
測試
我們啟動hdd-doorplate-dubbo-server 來註冊服務,前提是已經啟動ZooKeeper註冊中心
啟動hdd-doorplate-dubbo-server
package com.herbert.hdd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Spring Boot 應用的標識
@SpringBootApplication
public class HddDoorplateDubboProviderApplication {
public static void main(String[] args) {
// 程式啟動入口
// 啟動嵌入式的 Tomcat 並初始化 Spring 環境及其各 Spring 元件
SpringApplication.run(HddDoorplateDubboProviderApplication.class, args);
}
}
啟動完成
啟動hdd-doorplate-dubbo-client
package com.herbert.hdd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HddDoorplateDubboClientApplication {
public static void main(String[] args) {
SpringApplication.run(HddDoorplateDubboClientApplication.class, args);
}
}
啟動完成
介面訪問
http://127.0.0.1:6661/user/list
返回值
["城市中心運動公園"]
歡迎關注公眾號