SpringBoot整合dubbo詳解(阿里官方dubbo-spring-boot-starter)
Dubbo是Alibaba開源的分散式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地鬆耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。
Dubbo 的RPC 呼叫流程主要涉及到4個模組:
1、Registry:服務註冊,我們一般會採取Zookeeper 作為我們的註冊中心
2、Provider:服務提供者(生產者),提供具體的服務實現
3、Consumer:消費者,從註冊中心中訂閱服務
4、Monitor:監控中心,RPC呼叫次數和呼叫時間監控
從上圖中我們可以看出RPC 服務呼叫的過程主要為:
1、生產者釋出服務到服務註冊中心
2、消費者在服務註冊中心中訂閱服務
3、消費者呼叫已註冊的服務
下面筆者給大家講解在IDEA環境下如何實現將SpringBoot與Dubbo整合。
專案結構如圖:
先來看common下的pom檔案:
<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.boot.dubbo</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>common</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!--dubbo-springBoot依賴--> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>1.0.1</version> </dependency> <!--zookeeper依賴--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.11</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> </dependencies> <modules> <module>api</module> <module>provider</module> <module>consumer</module> </modules> </project>
由上圖可以看出公共pom主要引入了: SpringBoot依賴,dubbo-springBoot依賴,zookeeper依賴,zkClient依賴等。
下面筆者將逐個講解各個模組:
一、 provider(服務提供者)
pom檔案如下:
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.boot.dubbo</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>provider</artifactId> <name>provider</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
因為筆者將provider作為web形式啟動,所以僅需要引入spring-boot-starter-web即可。
專案結構:
src/main/resources/application.yml配置如下:
server:
port: 8081
spring:
dubbo:
appname: provider
registry: zookeeper://127.0.0.1:2181
protocol: dubbo
port: 20880
介面定義IBookService.java程式碼如下:
package com.boot.dubbo.service;
public interface IBookService {
String sayHello();
}
介面實現BookServiceImpl.java程式碼如下:
package com.boot.dubbo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.boot.dubbo.service.IBookService;
@Service
@org.springframework.stereotype.Service
public class BookServiceImpl implements IBookService {
@Override
public String sayHello() {
return "Hello World";
}
}
注意該類有兩個service註解,一個是alibaba的,一個是spring的,大家要注意區分。
Application.java程式碼如下:
package com.boot.dubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
@SpringBootApplication
@EnableDubboConfiguration
public class Application {
public static void main( String[] args ){
SpringApplication.run(Application.class, args);
}
}
springBoot啟動加入了@EnableDubboConfiguration,表示啟動dubbo配置。
注意,在本地測試之前,必須先下載zookeeper在本地,然後啟動zookeeper,然後執行provider模組,使服務註冊到zookeeper!
二、consumer(服務消費者)
pom檔案如下:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.boot.dubbo</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>consumer</artifactId>
<name>consumer</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
</dependencies>
</project>
consumer沒有引入任何依賴,因為該模組只有介面定義,沒有實現。
結構如下:
三、api(測試介面)
pom檔案如下:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.boot.dubbo</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>api</artifactId>
<name>api</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.boot.dubbo</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
api只需要引入consumer模組(只有介面定義,沒有實現,沒有application.yml)即可。
專案結構如下:
src/main/resources/application.yml配置如下:
spring:
dubbo:
appname: consumer
registry: zookeeper://127.0.0.1:2181
protocol: dubbo
port: 20880
DubboController.java程式碼如下:
package com.boot.dubbo.api.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.boot.dubbo.service.IBookService;
@RestController
public class DubboController {
@Reference
IBookService bookService;
@GetMapping("test")
public String testDubbo() {
return bookService.sayHello();
}
}
在呼叫consumer模組定義的service的時候,必須要加入@Reference註解。
Application.java程式碼如下:
package com.boot.dubbo.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
@SpringBootApplication
@EnableDubboConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@EnableDubboConfiguration表示啟動dubbo配置。
下面開始進行測試(必須先將本地zookeeper啟動):
1、首先將provider模組啟動:
2、啟動api:
3、訪問: http://localhost:8080/test
可以看到"Hello World",說明呼叫service成功!
掃一掃關注筆者的公眾號,每天都有乾貨分享,你還在等什麼