Spring Cloud整合dubbo3并使用Nacos作为服务注册中心【最佳实践】

一、#创作灵感#

Dubbo3在公司项目中运用越来越多,固写下此笔记以巩固知识要点。

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1]Spring框架无缝集成。

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

二、环境

待完善

三、SpringCloud Alibaba版本说明

SpringCloud Alibaba版本说明

由于作者所在公司软件安全比较严苛,所以没有完全按照版本关系来。但功能都测试通过,所有组件算集成成功。当然之个过程也费了一些精力。

SpringCloud Alibaba不是本文的重点,SpringCloud Alibaba本身包含一套SpringCloud 与Nacos,本文主要讲SpringCloud 与Nacos的集成。

因专业人员都会考虑这一点,所以这里简单说明一下

四、Nacos安装及验证

熟悉Nacos安装的可跳过该章节

详见:Spring Cloud整合Nacos作为注册配置中心【最佳实践】

五、Spring Cloud整合Nacos作为dubbo服务注册中心

nacos高手一般直接看官网就够

Nacos 融合 Spring Cloud,成为注册配置中心 | Nacos 官网

dubbo官网(目前好像普通网络访问不了2025.08)

https://cn.dubbo.apache.org/

1、添加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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--  3.5.4  3.4.8  3.3.13  3.2.12   3.1.12  3.0.12  2.7.18 -->
        <version>2.7.18</version>
        <!--  lookup parent from repository  -->
        <relativePath/>
    </parent>

    <groupId>com.*****.boot</groupId>
    <artifactId>smet-rpc-service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 统一管理jar包版本 -->
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>

        <!--  3.1.5  3.0.12  2.7.18 2.6.13
           官方三件套: 2.6.13  2021.0.5   2021.0.6.1
        -->
        <spring-boot.version>2.7.18</spring-boot.version>
        <!--  2023.0.3      2022.0.5      2021.0.9  2021.0.5  -->
        <spring-cloud.version>2021.0.9</spring-cloud.version>

        <!--  2023.0.1.3    2022.0.0.0    2021.1   2021.0.6.1   2021.0.5.0   -->
        <spring-cloud-alibaba.version>2021.0.6.1</spring-cloud-alibaba.version>

        <!--  springcloud 2020.02 以后需要单独引入     4.1.4   4.0.5  3.1.9  3.0.6  -->
        <spring-cloud-starter-bootstrap.version>3.1.9</spring-cloud-starter-bootstrap.version>
        <!-- 0.3.0-RC 适配springboot3    0.2.12 适配springboot2    0.1.10 适配springboot1   -->
        <nacos-config-spring-boot-starter.version>0.2.12</nacos-config-spring-boot-starter.version>
        <!--    <spring-boot-admin.version>2.7.17</spring-boot-admin.version>-->

        <!-- Dubbo 3.3.2  3.2.16  3.1.11   2.7.23   
       阿里新平台已经将HSF换成了dubbo3    -->
        <dubbo.version>3.3.2</dubbo.version>
        <!-- 4.1.4   4.0.5  3.1.9   3.0.6  2.2.9.RELEASE   -->
        <loadbalancer.version>3.1.9</loadbalancer.version>

        <!--  2.3  2.2  1.33  1.30  -->
        <snakeyaml.version>2.3</snakeyaml.version>
        <fastjson2.version>2.0.53</fastjson2.version>
    </properties>

    <dependencies>

        <!-- Apache Dubbo Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-bom</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>${spring-cloud-starter-bootstrap.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-commons</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--  如果要作为配置中心就添加  -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-context</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-commons</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 如果要作为注册中心就添加 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-context</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-commons</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
        </dependency>

        <!-- Spring Cloud Alibaba Dubbo  Apr 08, 2021 开始没有跟版本演进(版本:2021.1)
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency> -->

        <!--添加loadbalanncer依赖, 添加spring-cloud的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>${loadbalancer.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.yaml</groupId>
                    <artifactId>snakeyaml</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </dependency>
        <!-- form数据验证依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

    <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>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </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>org.yaml</groupId>
                <artifactId>snakeyaml</artifactId>
                <version>${snakeyaml.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>


</project>

2、bootstrap.properties配置

这里涉及4个JVM启动参数:

-Dprofile=dev

-Dnacos-addr=10.130.***.**:18848

-Dnacos-password=nacos2024****

-Dgroup=A

TypeScript 复制代码
logging.config=classpath:logback-spring.xml

spring.application.name=***-rpc-service

# Nacos地址
spring.cloud.nacos.config.server-addr=${nacos-addr}

# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=${nacos-password}
spring.cloud.nacos.config.contextPath=/nacos

# 服务配置
# 主配置 > 扩展配置(extension-configs) > 共享配置(shared-configs)
# extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0]
# shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]
spring.cloud.nacos.config.import-check.enabled=true
spring.cloud.nacos.config.namespace=***-rpc-service
spring.cloud.nacos.config.group=${group}
spring.cloud.nacos.config.refresh-enabled=true
spring.cloud.nacos.config.file-extension=properties
### 将 DataID 设置到 nacos: 协议后面, 如果是默认分组则不用配置import
spring.config.import=nacos:smet-basic,nnacos:smet-datasource,nacos:smet-mq,nacos:smet-management,nacos:smet-prometheus,nacos:smet-elasticsearch,nacos:smet-sw-ui,nacos:smet-job,nacos:smet-****....

# 服务注册
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=${nacos-password}
spring.cloud.nacos.discovery.namespace=***-rpc-service
spring.cloud.nacos.discovery.group=${group}
spring.cloud.nacos.discovery.server-addr=${nacos-addr}

3、application.properties配置

TypeScript 复制代码
spring.profiles.active=${profile}

spring.cloud.nacos.config.extension-configs[10].data-id=****
spring.cloud.nacos.config.extension-configs[10].group=smet-rpc-service
# 自动刷新配置
spring.cloud.nacos.config.extension-configs[10].refresh=true

# dubbo配置
spring.cloud.nacos.config.extension-configs[9].data-id=smet-dubbo
spring.cloud.nacos.config.extension-configs[9].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[9].refresh=true

# 汇总基础配置
spring.cloud.nacos.config.extension-configs[8].data-id=smet-basic
spring.cloud.nacos.config.extension-configs[8].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[8].refresh=true

# 数据源
spring.cloud.nacos.config.extension-configs[7].data-id=smet-datasource
spring.cloud.nacos.config.extension-configs[7].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[7].refresh=true

# 消息队列
spring.cloud.nacos.config.extension-configs[6].data-id=smet-mq
spring.cloud.nacos.config.extension-configs[6].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[6].refresh=true

# 应用管理
spring.cloud.nacos.config.extension-configs[5].data-id=smet-management
spring.cloud.nacos.config.extension-configs[5].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[5].refresh=true

# 普米
spring.cloud.nacos.config.extension-configs[4].data-id=smet-prometheus
spring.cloud.nacos.config.extension-configs[4].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[4].refresh=true

# es
spring.cloud.nacos.config.extension-configs[3].data-id=smet-elasticsearch
spring.cloud.nacos.config.extension-configs[3].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[3].refresh=true

# skywalking-ui
spring.cloud.nacos.config.extension-configs[2].data-id=smet-sw-ui
spring.cloud.nacos.config.extension-configs[2].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[2].refresh=true

#  外围接口
spring.cloud.nacos.config.extension-configs[1].data-id=smet-***
spring.cloud.nacos.config.extension-configs[1].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[1].refresh=true

# 定时任务
spring.cloud.nacos.config.extension-configs[0].data-id=smet-job
spring.cloud.nacos.config.extension-configs[0].group=smet-rpc-service
spring.cloud.nacos.config.extension-configs[0].refresh=true

4、添加命名空间

5、添加配置(详细介绍Dubbo配置)

Dubbo配置:

TypeScript 复制代码
dubbo.application.name=smet-rpc-service
dubbo.application.logger=slf4j
# 禁用QOS同一台机器可能会有端口冲突现象,qos=Quality of Service 是Dubbo的在线运维命令,可以对服务进行动态的配置、控制(上下线)及查询
dubbo.application.qos-enable=true
# 默认端口号是 22222  一台机器启动多个包含dubbo的应用 2: 22223  3:  33333
dubbo.application.qos-port=22222
# 允许访问的ip,缺省就是false,表示任何ip都可访问
dubbo.application.qos-accept-foreign-ip=false

# 这里通过环境变量注入
dubbo.registry.address=nacos://${nacos-addr}
# Nacos认证信息 也可写在url中:?username=nacos&password=${nacos-password:nacos}&namespace=smet-rpc-service&group=A
dubbo.registry.username=nacos
# nacos2024ip92  本地:nacos2024
dubbo.registry.password=${nacos-password}
# instance   interface   all (default)
dubbo.registry.register-mode=all
dubbo.registry.parameters.namespace=smet-rpc-service
dubbo.registry.parameters.group=${group}
#dubbo.registry.simplified=true

# tri : dubbo3主推协议,新一代dubbo协议 ,其他协议: dubbo rmi hessian rest, dubbo支持多协议,同协议多端口, 但不适合在properties中配置
dubbo.protocol.name=tri
# dubbo服务是独立的端口 ( -1 表示自增端口,从 20880 开始)
# tri 50051 -1时从50052开始找 
# dubbo 20880 -1时从20881开始找
dubbo.protocol.port=50051

6、服务(提供)类

java 复制代码
/**
 * @Description: *****
 * @Author: daizd
 * @CreateDate: 2025/5/6 09:02
 * @Version: 1.0
    dubbo 3 Service和DubboService注释不会冲突
 */
@Slf4j
@Service
@DubboService(version = "1.0") 
public class SmsLinkageServiceImpl   {

    @Override
    public String saasCtTopErrMsg(String systemCode, String dateStr) {
        String ret=null;
        ret = "success";
        System.out.println("success!");
        return retStr;
    }
}

常见问题(FAQ)

Q1:为什么nacos界面菜单:服务管理-》服务列表 中只能看到应用名而看不到服务提供者的类名?

A:显示应用名、还是类名、亦或都显示由这条dubbo配置决定

css 复制代码
# instance   interface   all (default)
dubbo.registry.register-mode=all

配置instance效果图:

Q2:SpringBoot2.7.18能与dubbo3集成吗?

A:能,本文就是。而且作者还有一遍文章写的dubbo3客户端,是用的springboot3.3.2

Q3:客户端是SpringBoot3能调用该服务吗?

A:能,可参考作者另一篇客户端的文章

附件一:logback日志门面配置(经典模板)

带级别分类、文件大小滚动、存储周期、根路径注入

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">
    <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
    <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
    <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
    <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->

    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使"${}"来使用变量。 -->
<!--    <property name="log.path" value="/Users/daizhongde/logs/logback/saashealth" />-->
    <property name="log.path" value="${log.path}/logs/logback/saashealth" />
<!--        <property name="log.path" value="${HOME}/logs/logback/saashealth" />-->

    <!-- 彩色日志 -->
    <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 -->
    <!-- magenta:洋红 -->
    <!-- boldMagenta:粗红-->
    <!-- cyan:青色 -->
    <!-- white:白色 -->
    <!-- magenta:洋红 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>

    <!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!--输出到文件-->

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_debug.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数, 1天有 7GB,可优化 -->
            <maxHistory>1</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录 debug 级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_info.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 WARN 日志 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_warn.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/log_error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
        <logger>仅有一个name属性,
        一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              如果未设置此属性,那么当前logger将会继承上级的级别。
    -->
    <!--
        使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
        第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
        第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:
     -->
    <!--开发环境:打印控制台-->
    <springProfile name="dev">
        <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
        <logger name="com.asiainfo" level="DEBUG" />
        <logger name="com.zaxxer.hikari" level="INFO"/>
        <logger name="java.sql.Connection" level="DEBUG"/>
        <logger name="java.sql.Statement" level="DEBUG"/>
        <logger name="java.sql.PreparedStatement" level="DEBUG"/>
        <logger name="org.apache.hc.client5.http" level="INFO"/>
        <logger name="com.clickhouse.client.http.ClickHouseHttpClient" level="DEBUG"/>


        <!--
            root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
            可以包含零个或多个appender元素。
        -->
        <root level="DEBUG">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>

    <!-- CI环境:打印控制台-->
    <springProfile name="ci">
        <!--可以输出项目中的debug日志,包括mybatis的sql日志-->
        <logger name="com.asiainfo" level="INFO" />

        <!--
            root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
            level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG
            可以包含零个或多个appender元素。
        -->
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>

    <!-- 测试环境:输出到文件 -->
    <springProfile name="test">

        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>

    <!-- 生产环境:输出到文件 -->
    <springProfile name="prod">

        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>

</configuration>

附件二:参考资料

|------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 名称 | 地址 |
| 阿里新一代微服务解决方案: Spring Cloud Alibaba | ++++https://blog.csdn.net/emprere/article/details/103982655++++ |
| dubbo RPC协议概述 | ++++https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/spring/spring-boot/++++ |
| dubbo RPC协议概述 | ++++https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/overview/++++ |
| dubbo RPC协议概述 | ++++https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/properties/#dubboprotocol++++ |
| dubbo RPC协议概述 | ++++https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/protocols/protocol/Dubbo 支持的 RPC 通信协议++++ |
| dubbo RPC协议概述 | ++++https://blog.csdn.net/weixin_43931625/article/details/123033801tri : dubbo3主推协议,新一代dubbo协议 ,其他协议: dubbo rmi hessian, dubbo支持多协议,同协议多端口++++ |
| openfegin | ++++Common application properties++++ |
| openfegin | ++++Spring Cloud OpenFeign++++ |
| openfegin | ++++https://github.com/OpenFeign/feign++++ |
| openfegin | ++++微服务服务间调用方式_微服务调用-CSDN博客++++ |
| openfegin | ++++https://developer.aliyun.com/article/1264489++++ |