SpringCloud Alibaba+Nacos+Dubbo,文末有完整项目代码链接
- 前言
- 一、这几者之间关系
- 二、准备工作
- 1.Nacos
- 2.SpringCloud Alibaba
- 4.SpringCloud
- 5.Dubbo
- 项目中层级关系
- 三、代码调用逻辑
- 1.dubbo-api模块
- 2.account-api模块
- 3.api-service模块
- 4.逻辑梳理
- 四、Maven和配置
- 1.parent的pom.xml文件
- 2.dubbo-api的pom.xml文件
- 3.api-service的application.yml和pom.xml
- 4.account-service的application.yml和pom.xml
- 五、容易踩坑的点重点说明
- 1.循环依赖问题
- 2.dubbo端口问题
- 3.关闭服务检查
- 4.nacos鉴权问题
- 5.namespace的问题
- 6.订阅问题
- 7.版本适配问题
- 8.Maven依赖问题
- 五、完整项目
前言
本文是几种技术的结合,里面详细的描述了一个简单的框架是怎么搭建起来的,并且包含了版本依赖和各种踩坑经历,文末附有完整项目链接,有需要的可以免费拿走,如果对你有帮助麻烦点个赞哦。
一、这几者之间关系
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 {@Overridepublic 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 {@Overridepublic 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-serviceregistry:address: nacos://172.16.72.132:8848?namespace=e8942369-0b37-44a0-b711-3927db1796adusername: nacospassword: nacosconsumer:check: falsescan:base-packages: com.wq.dubboprotocol:name: dubboport: -1cloud:subscribed-services: friend-service,account-service
spring:cloud:nacos:discovery:server-addr: 172.16.72.132:8848namespace: df115cd8-6506-4417-bc91-4ee08a8ec2f1username: nacospassword: nacosconfig:server-addr: 172.16.72.132:8848namespace: 76dae550-4133-44d8-b591-dc82f5f97b6eusername: nacospassword: nacosapplication:name: api-servicemain:allow-circular-references: truedatasource:url: jdbc:mysql://172.16.72.132:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&useUnicode=trueusername: rootpassword: 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-serviceregistry:address: nacos://172.16.72.132:8848?namespace=e8942369-0b37-44a0-b711-3927db1796adusername: nacospassword: nacosconsumer:check: falsescan:base-packages: com.wq.dubboprotocol:name: dubboport: -1cloud:subscribed-services: api-service,friend-service
spring:cloud:nacos:discovery:server-addr: 172.16.72.132:8848namespace: df115cd8-6506-4417-bc91-4ee08a8ec2f1username: nacospassword: nacosconfig:server-addr: 172.16.72.132:8848namespace: 76dae550-4133-44d8-b591-dc82f5f97b6eusername: nacospassword: nacosapplication:name: account-servicemain:allow-circular-references: truedatasource:url: jdbc:mysql://172.16.72.132:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&useUnicode=trueusername: rootpassword: 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: dubboport: -1
3.关闭服务检查
此处不检查,启动的时候会报错,比如consumer先启动,但是provider未启动,这时候就会报错
dubbo:consumer:check: false
4.nacos鉴权问题
dubbo和nacos都要填写username和password,不填会启动报错
dubbo:registry:username: nacospassword: nacos
spring:cloud:nacos:discovery:username: nacospassword: nacosconfig:username: nacospassword: 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: 项目是没有任何错误完整可运行的,我就不过多展示运行效果了,大家可以自行去试。如果本文有错误欢迎指出,对你有帮助点个赞就行了。