一、主要组件
- 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