一、主要組件
- Nacos 服務註冊與發現、配置中心
- Dubbo 分佈式服務框架
版本選擇:2.1.1
二、項目架構
如圖:
- common-api : 存放 Dubbo 服務接口和模型定義
- provider : 服務提供者
- consumer : 服務消費者
三、項目搭建
1、創建父工程spring-cloud-alibaba-example
- 新建項目 file -> new project ..創建一個springboot項目
- 刪除多餘文件,只留下pom文件
- 修改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>
<groupId>com.mlj</groupId>
<artifactId>snapup</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>snapup</name>
<modules>
<module>consumer</module>
<module>provider</module>
<module>common-api</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.1.1.RELEASE</spring-boot.version>
<spring-cloud.version>Greenwich.SR5</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud ali-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<target>${maven.compiler.target}</target>
<source>${maven.compiler.source}</source>
<encoding>UTF-8</encoding>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
2、創建common-api
存放 Dubbo 服務接口和模型定義
- 創建module,普通maven項目
- 創建接口和dto
SnaPupService:
public interface SnaPupService {
/**
* 接口
*
* @param s
* @return
*/
Result get(String s);
}
Result:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result implements Serializable {
private String data;
}
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>com.mlj</groupId>
<artifactId>snapup</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>common-api</artifactId>
</project>
3、nacos創建相關配置
需要提前下載安裝nacos,官方文檔:https://nacos.io/zh-cn/docs/quick-start.html
- 創建命名空間
2.添加provider和consumer配置
4、創建服務提供者 provider
- 創建module 選擇創建springboot項目
- 修改pom,引入相關依賴,如下
- 修改配置文件爲bootstrap.yml yml格式,如下
- 啓動類添加@EnableDubbo註解,開啓註解Dubbo功能;添加@EnableDiscoveryClient註解,進行服務註冊
- 創建SnaPupServiceImpl實現common-api的接口,完善接口功能,SnaPupServiceImpl類上需要@Service註解(org.apache.dubbo.config.annotation.Service)暴露服務
<?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>com.mlj</groupId>
<artifactId>snapup</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>provider</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.mlj</groupId>
<artifactId>common-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Spring Boot 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>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--nacos相關-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--dubbo依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
bootstrap.yml:
spring:
application:
name: @artifactId@
cloud:
nacos:
# nacos地址
server-addr: ****
#服務註冊與發現
discovery:
# group和命名空間
group: SNAPUP_GROUP
namespace: 725d62dc-11f8-451d-ac7e-04427536de08
#配置中心
config:
group: SNAPUP_GROUP
namespace: 725d62dc-11f8-451d-ac7e-04427536de08
file-extension: yaml
enable-remote-sync-config: true
5、創建服務消費者 consumer
- 創建module 選擇創建springboot項目,如provider
- 修改pom,引入相關依賴,如provider
- 修改配置文件爲bootstrap.yml yml格式,如provider
- 啓動類添加@EnableDubbo註解,進行dubbo包掃描;添加@EnableDiscoveryClient註解,進行服務註冊,如provider
- 創建SnaPupController接口,使用@Reference註解注入common-api的接口 來引用服務,進行調用。@RefreshScope註解會實時刷新${user.name}配置信息
@RestController
@RequestMapping("/snaPup")
@RefreshScope
public class SnaPupController {
@Reference
private SnaPupService snaPupService;
@Value("${user.name}")
private String name;
@GetMapping("/get")
public Result get() {
return snaPupService.get(name);
}
}
三、測試組件可用性
-
依此啓動provider、consumer服務
-
觀察nacos客戶端 ,可以看到剛啓動的兩個服務
-
請求接口http://localhost:8003/snaPup/get,訪問成功
四、問題與解決
1、警告信息:
Current application will subscribe all services(size:2) in registry, a lot of memory and CPU cycles may be used, thus it's strongly recommend you using the externalized property 'dubbo.cloud.subscribed-services' to specify the services
解決:dubbo.cloud.subscribed-services : provider 用於服務消費方訂閱服務提供方的應用名稱的列表,若需訂閱多應用,使用 "," 分割。不推薦使用默認值爲 "*",它將訂閱所有應用,默認訂閱所有應用。
2、修改配置不會自動刷新
解決:通過 Spring Cloud 原生註解 @RefreshScope
實現配置自動更新,官方文檔有說明。https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
五、相關注解總結
@org.apache.dubbo.config.annotation.Service 暴露服務
@Reference 引用服務
@EnableDubbo 開啓註解Dubbo功能
@EnableDiscoveryClient 開啓服務註冊發現功能
@RefreshScope 實現配置自動更新
六、參考文檔
- nacos官方文檔 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
- dubbo官方文檔 http://dubbo.apache.org/en-us/docs/user/quick-start.html
- dubbo相關 https://segmentfault.com/a/1190000018991721
- dubbo相關 https://www.jianshu.com/p/3090d63e9cb3