Dubbo 架構
一:zookeeper 環境安裝搭建
1、搭建 zookeeper 之前要確保當前的機器已經有 JDK 環境。
2、將 conf 目錄下 zoo_sample.cfg 文件重命名為 zoo.cfg
二 :實現服務接口 dubbo-interface
主要分為下面幾步:
- 創建 Maven 項目;
- 創建接口類
- 將項目打成 jar 包供其他項目使用
項目結構:
dubbo-interface 后面被打成 jar 包,它的作用只是提供接口。
1. dubbo-interface 項目創建
File->New->Module... ,然后選擇 Maven類型的項目,其他的按照提示一步一步走就好。
2. 創建接口類
package com.fengx.service;
/**
* @author: Fengx
* @date: 2021-07-21
* @description: 服務接口
**/
public interface HelloService {
String sayHello(String name);
}
3. 將項目打成 jar 包供其他項目使用
點擊右邊的 Maven Projects 然后選擇 install ,這樣 jar 包就打好了。
三 :實現服務提供者 dubbo-provider
主要分為下面幾步:
- 創建 springboot 項目;
- 加入 dubbo 、zookeeper以及接口的相關依賴 jar 包;
- 在 application.properties 配置文件中配置 dubbo 相關信息;
- 實現接口類;
- 服務提供者啟動類編寫
項目結構:
1. dubbo-provider 項目創建
創建一個 SpringBoot 項目,注意勾選上 web 模塊。
2. pom 文件引入相關依賴
需要引入 dubbo 、zookeeper以及接口的相關依賴 jar 包。注意將本項目和 dubbo-interface 項目的 dependency 依賴的 groupId 和 artifactId 改成自己的。dubbo 整合spring boot 的 jar 包在這里找dubbo-spring-boot-starter。zookeeper 的 jar包在 Maven 倉庫 搜索 zkclient 即可找到。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fengx</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fengx</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依賴-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3. 在 application.properties 配置文件中配置 dubbo 相關信息
配置很簡單,這主要得益於 springboot 整合 dubbo 專屬的@EnableDubboConfiguration
注解提供的 Dubbo 自動配置。
# 配置端口
server.port=8333
spring.dubbo.application.name=dubbo-provider
spring.dubbo.application.registry=zookeeper://127.0.0.1:2181
4. 實現接口
注意: @Service
注解使用的時 Dubbo 提供的而不是 Spring 提供的。另外,加了Dubbo 提供的 @Service
注解之后還需要加入
package com.fengx.dubboprovider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.fengx.service.HelloService;
import org.springframework.stereotype.Component;
/**
* @author: Fengx
* @date: 2021-07-21
* @description: 服務接口實現
**/
@Component
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
5. 服務提供者啟動類編寫
注意:不要忘記加上 @EnableDubboConfiguration
注解開啟Dubbo 的自動配置。
package com.fengx.dubboprovider;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 服務提供者
*/
@SpringBootApplication
// 開啟dubbo的自動配置
@EnableDubboConfiguration
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
四:實現服務消費者 dubbo-consumer
主要分為下面幾步:
- 創建 springboot 項目;
- 加入 dubbo 、zookeeper以及接口的相關依賴 jar 包;
- 在 application.properties 配置文件中配置 dubbo 相關信息;
- 編寫測試類;
- 服務消費者啟動類編寫
- 測試效果
項目結構:
1. dubbo-consumer 項目創建
創建一個 SpringBoot 項目,注意勾選上 web 模塊。
2. 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fengx</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入接口項目jar包-->
<dependency>
<groupId>com.fengx</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依賴-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 引入zookeeper的依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3. 在 application.properties 配置文件中配置 dubbo 相關信息
配置很簡單,這主要得益於 springboot 整合 dubbo 專屬的@EnableDubboConfiguration
注解提供的 Dubbo 自動配置。
# 配置端口
server.port=8330
spring.dubbo.application.name=dubbo-consumer
spring.dubbo.application.registry=zookeeper://127.0.0.1:2181
4. 編寫一個簡單 Controller 調用遠程服務
package com.fengx.dubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.fengx.service.HelloService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: Fengx
* @date: 2021-07-21
* @description: 調用遠程服務
**/
@RestController
public class HelloController {
@Reference
private HelloService helloService;
@RequestMapping("/hello")
public String hello() {
String hello = helloService.sayHello("world");
System.out.println(helloService.sayHello("fengx"));
return hello;
}
}
5. 服務消費者啟動類編寫
package com.fengx.dubboconsumer;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfiguration
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
6. 測試效果
瀏覽器訪問 http://localhost:8330/hello 頁面返回 Hello world,控制台輸出 Hello fengx,和預期一致,使用SpringBoot+Dubbo 搭建第一個簡單的分布式服務實驗成功!
參考:https://github.com/CodingDocs/springboot-guide/blob/master/docs/advanced/springboot-dubbo.md