文章目錄
1. 前言
Dubbo的相關資料:
dubbo官網: http://dubbo.apache.org dubbo github
源碼地址:https://github.com/apache/incubator-dubbo dubbo
運維項目源碼地址:https://github.com/apache/incubator-dubbo-ops
2 zookeeper安裝
由於Kafka的運行依賴於Zookeeper
,所以在運行Kafka
之前需要安裝並運行Zookeeper
2.1 下載zookeeper
Zookeeper下載路徑:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.7/ 如上圖所示。
2.2 安裝並修改zoo.cfg配置文件
1.解壓到文件下(我的目錄是 D:\webserver\apache-zookeeper-3.5.7-bin),我習慣修改目錄名稱爲:apache-zookeeper-3.5.7
2.打開D:\webserver\apache-zookeeper-3.5.7\conf,複製zoo_sample.cfg重命名成zoo.cfg
3.編輯zoo.cfg,修改dataDir爲【dataDir=D:\webserver\apache-zookeeper-3.5.7\data】,
在D:\webserver\apache-zookeeper-3.5.7目錄下創建data目錄。
//zookeeper默認用的是8080端口,和tomcat的默認端口衝突,因此這個地方最好修改。
在文件的最後增加一行:admin.serverPort=8888
2.3 設置zookeeper環境變量
ZOOKEEPER_HOME D:\webserver\apache-zookeeper-3.5.7
Path 在現有的值後面添加 %ZOOKEEPER_HOME%\bin
如圖所示:
2.4 驗證安裝是否成功
打開cmd,輸入zkServer.cmd
,運行如下:
說明運行成功了。
3. 工程創建
集成之前我們先介紹一下目前結構:基本dubbo通信需要有客戶端和服務端,服務端服務提供接口,客戶端負責調用接口,同時,關於接口的定義及通訊數據結構需要實現定義。因此,我們需要創建三個項目:
- API接口:提供接口定義,數據結構定義
- 服務端:提供接口實現
- 客戶端:去使用接口
3.1 創建父工程
在idea中,單擊file》new》project,彈出下面對話框,左邊選擇maven,這裏不要選擇Create from archetype複選框。
如圖所示操作;
如圖所示操作;
完成父工程創建。
這個初始目錄下有src目錄,可以刪除。
3.2 創建API 模塊
在dubbopro工程上點擊右鍵,選擇new->Module…
選擇new->Module… 輸入group及Artifact,Artifact一般是工程名稱,group一般是包路徑名。
點擊下一步
不用選擇,直接Next,然後Finish,這樣,接口工程就創建完畢。
3.3 創建dubbo-provider/dubbo-consumer 服務端/客戶端
在dubbopro工程上點擊右鍵,選擇new->Module… 如圖所示進行選擇(和上一步不一樣,這個是建立Springboot的工程):
next後,組的名稱和工程的名稱都需要修改,如下圖:客戶端名稱爲:dubbo-consumer,服務端名稱爲:dubbo-provider
Next,如圖所示,需要打鉤,開啓熱部署及lombok插件;
next後,選擇左側的web,然後右側選擇spring web 建立web工程:
點擊Finish結束創建。
4. Springboot2.x 集成Dubbo
4.1 定義接口
首先在dubbo-api工程中定義通信的數據結構類,如下:
package com.ieslab.powergrid.dubboapi.model;
import java.io.Serializable;
public class TestDubboData implements Serializable {
String id;
String name;
String data;
Long time;
String des;
public TestDubboData() {
}
public TestDubboData(String id, String name, String data, Long time, String des) {
this.id = id;
this.name = name;
this.data = data;
this.time = time;
this.des = des;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Long getTime() {
return time;
}
public void setTime(Long time) {
this.time = time;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
}
接口類TestDubboService.java:
package com.ieslab.powergrid.dubboapi.service;
import com.ieslab.powergrid.dubboapi.model.TestDubboData;
public interface TestDubboService{
TestDubboData TestDubboService(String uuid, String name);
}
這個接口很簡單,傳入兩個參數,返回我們定義的數據結構。
如果跨語言通訊,數據結構可以用Google Protobuff進行定義,這樣方便序列化和反序列化
4.2 Springboot2.x 集成Dubbo實現服務端
4.2.1 導入Dubbo依賴
下面是dubbo-provider的pom文件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.ieslab.powergrid</groupId>
<artifactId>dubbo-provider</artifactId>
<name>dubbo-provider</name>
<properties>
<revision>2.7.6</revision>
<dubbo.version>2.7.6</dubbo.version>
<spring-boot.version>2.2.6.RELEASE</spring-boot.version>
</properties>
<dependencies>
<!-- Spring Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.ieslab.powergrid</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0</version>
</dependency>
<!-- Zookeeper dependencies -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>false</executable>
<finalName>${project.artifactId}-${spring-boot.version}</finalName>
<outputDirectory>${user.dir}/target</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.2.3 編寫接口實現
編寫實現類TestDubboServiceImp.java
package com.ieslab.powergrid.dubboprovider.service;
import com.ieslab.powergrid.dubboapi.model.TestDubboData;
import com.ieslab.powergrid.dubboapi.service.TestDubboService;
import org.apache.dubbo.config.annotation.Service;
@Service(version = "${provider.service.version}")
public class TestDubboServiceImp implements TestDubboService {
/**
* 實現TestDubboService接口
* @param uuid 訪問的訂單ID
* @param name 用戶名稱
* @return
*/
@Override
public TestDubboData getTestDubboData(String uuid, String name) {
//構建一個數據進行返回
TestDubboData td = new TestDubboData();
td.setId(uuid);
td.setName(name);
td.setTime(System.currentTimeMillis());
td.setDes("這是一個測試接口,你測試成功了");
td.setData("您好,"+name+",這是您訪問的數據!!!");
return td;
}
}
注意:@Service(version = “${provider.service.version}”)
這個註釋,表示這是個dubbo的接口實現類,@Service註解是屬於dubbo的,包是:org.apache.dubbo.config.annotation.Service
其中的version = “${provider.service.version}” 表示接口的版本,在配置文件中配置的。
實現很簡單,我就是實現了接口的方法,構建了一個測試數據直接返回。
到此,我們完成了實現,但是我們怎麼把這個實現發佈出去呢?
4.2.4 添加dubbo配置信息,發佈到zookeeper上
在application.properties添加如下配置信息:
server.port=20201
# Spring boot application
spring.application.name=dubbo-provider
# Base packages to scan Dubbo Component: @org.apache.dubbo.config.annotation.Service
dubbo.scan.base-packages=com.ieslab.powergrid.dubboprovider.service
# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}
# Dubbo Protocol
dubbo.protocol.name=dubbo
## Random port
dubbo.protocol.port=-1
## Dubbo Registry
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.file = ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
## Service version
provider.service.version=1.0.0
因爲我們的zookeeper運行在本機,因此,配置成127.0.0.1:2182,如果zookeeper是集羣方式,只需要配置集羣的幾個ip:端口 用分號隔開即可。此處我們用單機版的。
其中的 dubbo.scan.base-packages=com.ieslab.powergrid.dubboprovider.service 配置了實現類的路徑。
4.2.5 啓動類
運行主類:DubboProviderApplication.java
package com.ieslab.powergrid.dubboprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
4.3 客戶端代碼實現
4.3.1 pom文件引用
在dubbo-consumer,在pom文件中增加依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.ieslab.powergrid</groupId>
<artifactId>dubbo-consumer</artifactId>
<name>dubbo-consumer</name>
<properties>
<revision>2.7.6</revision>
<dubbo.version>2.7.6</dubbo.version>
<spring-boot.version>2.2.6.RELEASE</spring-boot.version>
</properties>
<dependencies>
<!-- Spring Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.ieslab.powergrid</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0</version>
</dependency>
<!-- Zookeeper dependencies -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>false</executable>
<finalName>${project.artifactId}-${spring-boot.version}</finalName>
<outputDirectory>${user.dir}/target</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
客戶端的pom文件基本和服務端一致,只是名稱不一樣。
4.3.2 配置文件
修改application.yml文件:
spring:
application:
name: dubbo-registry-zookeeper-consumer-sample
server:
port: 8090
provider:
service:
version: 1.0.0
embedded:
zookeeper:
port: 2181
dubbo:
registry:
address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
file: ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
和服務端的格式不一致,這裏只爲學習,生產環境最好統一格式。
版本號要和服務端保持一致
4.3.2 測試入口類
創建測試類:TestController.java
package com.ieslab.powergrid.dubboconsumer;
import com.ieslab.powergrid.dubboapi.model.TestDubboData;
import com.ieslab.powergrid.dubboapi.service.TestDubboService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.apache.dubbo.config.annotation.Reference;
@RestController
public class TestController {
@Reference(version = "${provider.service.version}")
TestDubboService testDubboService;
@RequestMapping("/test")
public TestDubboData test(String uuid, String name){
TestDubboData test = testDubboService.getTestDubboData(uuid,name);
return test;
}
}
@Reference(version = “${provider.service.version}”) 一定指定的版本一定要和服務端一致,如果服務端設置了版本,這個地方一定也要設置版本,不然鏈接不上。
4.3.3 主類
package com.ieslab.powergrid.dubboconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
4.4 測試
運行dubbo-provider的主類:DubboProviderApplication.java
運行dubbo-consumer的主類:DubboConsumerApplication.java
訪問接口:http://localhost:8090/test?uuid=1&name=binge
如下圖,返回如下測試數據就成功了。
5. 總結
本文是使用的最新版本的dubbo,如果服務端和客戶端的dubbo版本不一致,會導致鏈接不成功,請切記。