SpringCloud Alibaba+Nacos+Dubbo,文末有完整项目代码链接
前言
本文是几种技术的结合,里面详细的描述了一个简单的框架是怎么搭建起来的,并且包含了版本依赖和各种踩坑经历,文末附有完整项目链接,有需要的可以免费拿走,如果对你有帮助麻烦点个赞哦。
一、这几者之间关系
Dubbo是阿里出的一套RPC框架
Spring Cloud Alibaba是阿里遵循Spring Cloud规范实现的一套以Alibaba自研组件组成的整体解决方
案,其中涵盖的Dubbo作为RPC,Nacos作为注册中心和配置中心以及其他阿里出品的优秀框架。
为什么要封装这一层呢,其实有两个原因:
- Dubbo是Dubbo的调用协议,是长连接,Spring Cloud是HTTP协议属于短连接,所以Dubbo比SpringCloud调用速度快。
- 阿里想开发一套自己的微服务框架,包括Dubbo和Nacos这些都是阿里的产品,而且封装了SpringCloud后还能享受到SpringCloud生态带来的各种优势,包括熔断,监控,网关等等各种。
在本文项目中的体现,就是Dubbo和Spring Cloud Alibaba和Spring Cloud的依赖都要添加,下面会详
说。
二、准备工作
版本用对很关键,我在版本上踩坑了很多,如果无特殊要求,直接用我这个版本
1.Nacos
我用的虚拟机,采用Docker安装的,详情参考我的这篇文章:Docker安装nacos并开启鉴权,在本文编写的时间,最新的Nacos版本是2.4.1,是有鉴权的版本,建议大家Nacos版本都用2.2之后的,开启鉴权。
当然,你也可以在Windows本地下载Nacos安装,也很简单,效果都是一样的。
2.SpringCloud Alibaba
根据官方的版本发布公告:版本发布说明,我选择的版本是2021.0.6.0版本
4.SpringCloud
选择2021.0.6版本
5.Dubbo
由于SpringCloud Alibaba2021.1版本之后,Dubbo不在随SpringCloud Alibaba主干更新,所以我们要在项目中单独引入Dubbo的依赖,本文引入的是3.2.14版本的dubbo-bom。
dubbo-bom:是Dubbo的统一版本管理工具,类似于Maven中dependencyManagement的功能
项目中层级关系
demo
--dubbo-api
--pom.xml
--api-service
--pom.xml
--acount-service
--pom.xml
-pom.xml
1.demo作为parent层的存在,统一管理Maven依赖。
2.dubbo-api和api-service和acount-service属于平级的子模块。
3.dubbo-api:提供统一远程调用接口,供给其他子模块用,接口的实现在各自子模块内部进行。
4.account-service:模仿用户模块
5.api-service:模仿业务模块
直接给张图吧:
三、代码调用逻辑
1.dubbo-api模块
添加account的通用调用接口AccountService ,添加方法testDubbo:
public interface AccountService {
void testDubbo(String value);
}
2.account-api模块
实现AccountService 接口,模拟其他模块调用testDubbo方法:
此处记得一定加上@DubboService注解
@DubboService
public class AccountDubboService implements AccountService {
@Override
public void testDubbo(String value) {
System.out.println(value);
}
}
3.api-service模块
创建testcontroller,引入dubbo-api模块的接口AccountService
@RestController
@RequestMapping("/test")
public class TestController {
@DubboReference(mock = "com.wq.dubbo.mock.AccountServiceMock")
AccountService accountService;
@RequestMapping("/testTwo")
public void testTwo() {
accountService.testDubbo("api->account");
}
}
记得此处一定加上@DubboReference注解
mock参数:如果AccountService 远程调用失败,则调用mock参数里面的类的方法,其实dubbo默认的规则就是在调用失败,自动找mock方法,比如:AccountService ->AccountServiceMock,FriendService->FriendServiceMock,但是此处DubboReference注解里如果不指定mock参数,有时候会找不到,所以我习惯性加上。
我们来看看AccountServiceMock:
public class AccountServiceMock implements AccountService {
@Override
public void testDubbo(String value) {
System.out.println("调用Account失败");
}
}
4.逻辑梳理
我用一张图来梳理下流程,还是很简单的:
我们在TestController调用参数传入:“api->account”,调用成功后,会在account-api模块控制台输出这个参数。
四、Maven和配置
1.parent的pom.xml文件
里面集成了子模块,并且用<dependencyManagementsd>来管理,记得一定要分清<dependencyManagement>和<dependencies>之间的关系,我写了注释的。
<?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>
<packaging>pom</packaging>
<modules>
<module>account-service</module>
<module>api-service</module>
<module>dubbo-api</module>
<module>friend-service</module>
</modules>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<properties>
<java.version>11</java.version>
<spring-boot.version>2.7.18</spring-boot.version>
<spring-cloud-alibaba.version>2021.0.6.0</spring-cloud-alibaba.version>
<spring.cloud.version>2021.0.6</spring.cloud.version>
<mysql.version>8.0.20</mysql.version>
<hutol.version>5.5.7</hutol.version>
<dubbo.version>3.2.14</dubbo.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<!-- 配置在此模块下的,子模块自动引入依赖-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<!-- 统一管理,配置在此模块下的,子模块要引入依赖必须声明groupId和artifactId,不需要声明版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>dubbo-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>api-service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>friend-service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>account-service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutol.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.dubbo-api的pom.xml文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-api</artifactId>
<dependencies>
<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>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
3.api-service的application.yml和pom.xml
application.yml:
server:
port: 8080
dubbo:
application:
name: api-service
registry:
address: nacos://172.16.72.132:8848?namespace=e8942369-0b37-44a0-b711-3927db1796ad
username: nacos
password: nacos
consumer:
check: false
scan:
base-packages: com.wq.dubbo
protocol:
name: dubbo
port: -1
cloud:
subscribed-services: friend-service,account-service
spring:
cloud:
nacos:
discovery:
server-addr: 172.16.72.132:8848
namespace: df115cd8-6506-4417-bc91-4ee08a8ec2f1
username: nacos
password: nacos
config:
server-addr: 172.16.72.132:8848
namespace: 76dae550-4133-44d8-b591-dc82f5f97b6e
username: nacos
password: nacos
application:
name: api-service
main:
allow-circular-references: true
datasource:
url: jdbc:mysql://172.16.72.132:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&useUnicode=true
username: root
password: 12345
pom.xml:本项目我以前集成了Mybatis-Plus,所以Maven和项目有部分数据库相关的,如果你不需要可以删掉,不会影响Rpc调用逻辑。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
</dependencies>
</project>
4.account-service的application.yml和pom.xml
application.yml:
server:
port: 8081
dubbo:
application:
name: account-service
registry:
address: nacos://172.16.72.132:8848?namespace=e8942369-0b37-44a0-b711-3927db1796ad
username: nacos
password: nacos
consumer:
check: false
scan:
base-packages: com.wq.dubbo
protocol:
name: dubbo
port: -1
cloud:
subscribed-services: api-service,friend-service
spring:
cloud:
nacos:
discovery:
server-addr: 172.16.72.132:8848
namespace: df115cd8-6506-4417-bc91-4ee08a8ec2f1
username: nacos
password: nacos
config:
server-addr: 172.16.72.132:8848
namespace: 76dae550-4133-44d8-b591-dc82f5f97b6e
username: nacos
password: nacos
application:
name: account-service
main:
allow-circular-references: true
datasource:
url: jdbc:mysql://172.16.72.132:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&useUnicode=true
username: root
password: 12345
pom.xml:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>account-service</artifactId>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>api-service</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
<configuration>
<mainClass>com.wq.AccountApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
五、容易踩坑的点重点说明
1.循环依赖问题
springboot和dubbo不是最新版本引起的,加入一下配置,允许就行。
spring:
main:
allow-circular-references: true
2.dubbo端口问题
这里是dubbo的SPI扩展,name不能随便写,用dubbo就行了,port填-1是从20880自增
dubbo:
protocol:
name: dubbo
port: -1
3.关闭服务检查
此处不检查,启动的时候会报错,比如consumer先启动,但是provider未启动,这时候就会报错
dubbo:
consumer:
check: false
4.nacos鉴权问题
dubbo和nacos都要填写username和password,不填会启动报错
dubbo:
registry:
username: nacos
password: nacos
spring:
cloud:
nacos:
discovery:
username: nacos
password: nacos
config:
username: nacos
password: nacos
5.namespace的问题
这个问题我以前用的时候没遇到,但是这次遇到了,就是dubbo的namespace和nacos中discovery、config的namespace不能一样,不然启动会报错。
6.订阅问题
在yml中的subscribed-services参数,指定订阅的服务,可以订阅自己,不然项目启动后,控制台会定时打印日志,提示你不订阅的话消耗CPU性能。
7.版本适配问题
请一定参照官网发布的版本适配说明去选择版本:版本发布说明
8.Maven依赖问题
这个问题比较小,涉及到父子模块的依赖引入,和dubbo和SpringCloud alibaba的引入,大家照着我项目来就行。
五、完整项目
项目地址,大家根据需要用git拉取就行
https:https://gitee.com/wangqingWQ_code/DubboAndNacos.git
ssh:git@gitee.com:wangqingWQ_code/DubboAndNacos.git
PS: 项目是没有任何错误完整可运行的,我就不过多展示运行效果了,大家可以自行去试。如果本文有错误欢迎指出,对你有帮助点个赞就行了。