SpringBoot2.0+Dubbo+Zookeeper 實現簡單的服務調用
網上t整合DUBBO的springBoot大都是1.#版本的,現在springBoot 的版本都已經2.#了,springBoot版本升級後區別跟之前還是挺大的,網上的例子百分之九十的整合有問題(反正拉下來的代碼是不能運行的),而且還都是配置xml。我個人還是喜歡升級後的springBoot,做項目也大多用的是2.#的版本。恰好,項目中正好用到了dubbo,自己整合一版就當學習!
1. 項目結構
項目地址:git 地址
說明:項目爲子父模塊,dubboExample爲父工程,紅框中的爲子模塊。
1.1 父工程 pom.xml
<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.zxf</groupId>
<artifactId>dubboExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubboExample</name>
<description>dubboExample</description>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<java.version>1.8</java.version>
<curator-framework>4.0.1</curator-framework>
<zookeeper.version>3.4.13</zookeeper.version>
<dubbo.starter.version>0.2.0</dubbo.starter.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<!-- SpringBoot 整合 Web組件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.starter.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<modules>
<module>consumers</module>
<module>providers</module>
<module>common</module>
</modules>
</project>
說明:這裏跟網上其他的不同,只引入<dubbo.starter.version>0.2.0</dubbo.starter.version>
是因爲依賴中自己引入了zookeeper及其客戶端,所以我沒有額外引入。
1.2 common 模塊
說明:只有一個接口,接口中有一個testRpc 方法
public interface BookService {
String testRpc(String name);
}
1.3 providers 模塊
1.3.1 pom.xml
<!--引入common模塊-->
<dependency>
<groupId>com.zxf</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
1.3.2 application.properties
server.port=8001
#註冊到註冊中心的名稱
dubbo.application.name=service-providers
#採用協議和端口號
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
#註冊中心地址
dubbo.registry.address=zookeeper://localhost:2181
#控制檯彩色輸出
spring.output.ansi.enabled=always
1.3.3 定義BookServiceImpl 實現 BookService
package com.zxf.provider.serviceImpl;
import org.springframework.beans.factory.annotation.Value;
import com.alibaba.dubbo.config.annotation.Service;
import com.zxf.common.service.BookService;
@Service()
public class BookServiceImpl implements BookService {
@Value("${server.port}")
private String provitePort;
@Override
public String testRpc(String name) {
// TODO Auto-generated method stub
return "接受到的name=" + name + " 端口號爲=" + provitePort;
}
}
注意:這裏的@Service是com.alibaba.dubbo.config.annotation.Service;
1.3.4 啓動類
package com.zxf.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
@EnableDubbo
@SpringBootApplication
public class ProviderApp {
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ProviderApp.class, args);
}
}
注意:加上@EnableDubbo 它會自動掃描有“@Service”的類,將其暴露爲服務。
服務提供者配置完畢,啓動服務(一定先啓動註冊中心,要不然會報錯,有關zookeeper請自己去查資料),如下所示表明服務提供者已經註冊等到註冊中心:
或者打開dubbo-admin
1.4 consumers 模塊
1.4.1 pom.xml
<!-- 引入common模塊 -->
<dependency>
<groupId>com.zxf</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
1.4.2 application.properties
#tomcat端口號
server.port=8082
dubbo.application.name=service-consumers
#zookeeper註冊中心的地址
dubbo.registry.address=zookeeper://localhost:2181
dubbo.protocol.name=dubbo
#dubbo默認超時爲1s,有時服務調用會超過默認時間,所以設置超時稍微大一點
dubbo.consumer.timeout=5000
#控制檯彩色輸出
spring.output.ansi.enabled=always
1.4.3 定義 controller
package com.zxf.consumer.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zxf.common.service.BookService;
@RestController
public class BookController{
// dubbo用@Reference 調用服務
@Reference
private BookService bookService;
@RequestMapping(value = "testRpc/", method = RequestMethod.GET)
@ResponseBody
public String testRpc(String name){
return bookService.testRpc(name);
}
}
注意:dubbo 中 用 @Reference 調用服務
1.4.4 啓動類
package com.zxf.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
@EnableDubbo
@SpringBootApplication
public class ConsumerApp{
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
啓動消費端,再查看dubbo-admin:
如上所示,服務提供者和服務消費者都已註冊到zookeeper。
訪問:http://127.0.0.1:8082/testRpc/?name=20200403,如下所示,服務調用成功:
至此,springBoot2.0+dubbo+zookeeper 實現服務調用完成!