太细了有手就行,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: 项目是没有任何错误完整可运行的,我就不过多展示运行效果了,大家可以自行去试。如果本文有错误欢迎指出,对你有帮助点个赞就行了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值