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

一、#创作灵感#

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

二、环境

- SpringBoot 2.7.18   官方地址:SpringBoot 2.7.18

- SpringCloud 2021.0.9   官方地址:SpringCloud 2021.0.9

- SpringCloud Alibaba 2021.0.6.1  官方地址:SpringCloud Alibaba 2021.0.6.1

- Nacos 2.4.3   官方下载地址:Nacos 2.4.3 

- Oracle JDK8u202(Oracle JDK8最后一个非商业版本)   下载地址:Oracle JDK8u202

三、SpringCloud Alibaba版本说明

SpringCloud Alibaba版本说明

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

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

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

四、Nacos安装及验证

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

1、下载

见前面的环境章节

2、安装

略。解压即可

3、配置

server.port=8848

spring.sql.init.platform=mysql

db.num=1

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
db.user.0=root
db.password.0=Dzd*****

nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true

nacos.core.auth.caching.enabled=true
nacos.core.auth.enable.userAgentAuthWhite=false

nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos2****

# 自定义的Base64编码字符串,确保长度至少32字符且各Nacos节点配置一致。可以使用在线工具生成,例如此网站,并确保不使用默认值。
nacos.core.auth.plugin.nacos.token.secret.key=bmFjb3MuY29yZS5hdXRoLnBsdWdpbi5uYWNvcy50b2tlbi5zZWNyZXQua2V5LnNtZXQ=

nacos.core.auth.plugin.nacos.token.secret.key 说明

4、启动

#Linux/Unix/Mac
#启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone

#如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone

#Windows
#启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone

5、登陆/验证是否安装成功

五、Nacos 融合 Spring Cloud,成为注册配置中心

高手一般直接看官网就够

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

觉得官网不够的读者我们往下看

1、添加pom依赖

        <--  如果要作为配置中心就添加  --->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2021.0.6.1</version>
        </dependency>

        <--  如果要作为注册中心就添加  --->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.0.6.1</version>
        </dependency>

2、bootstrap.properties配置

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

-Dprofile=dev
-Dnacos-addr=10.130.***.**:18848
-Dnacos-password=nacos2024****
-Dgroup=A

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配置

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

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、添加配置

总结

1、应用主启动没有增加额外的注解

2、新版本的Nacos整合非常简单

附件一:实现Nacos属性值自动刷新的三种方式

实现Nacos属性值自动刷新的三种方式
在Spring Boot项目中,我们经常使用Nacos作为配置中心,用于管理应用程序的属性配置。当我们在Nacos上修改属性值时,希望应用程序能够自动刷新并应用最新的属性值,以避免重启应用。本篇博客将介绍三种实现Nacos属性值自动刷新的方式,并提供相应的示例代码。

方式一:使用@RefreshScope注解

@RefreshScope注解是Spring Cloud提供的一种属性刷新机制。它可以应用于需要动态刷新的类或方法上,当Nacos上的属性值发生变化时,通过调用/actuator/refresh端点来刷新被注解的类或方法。

步骤:
在Spring Boot项目的pom.xml文件中添加依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

在需要动态刷新的类或方法上添加@RefreshScope注解:

import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
@RefreshScope
public class MyComponent {
    // ...
}

示例代码

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class MyController {

    @Value("${my.property}")
    private String myProperty;

    @GetMapping("/property")
    public String getProperty() {
        return myProperty;
    }
}

在上述示例中,当Nacos上的my.property属性值发生变化时,调用/actuator/refresh接口即可刷新MyController中的myProperty属性。

方式二:使用@NacosValue注解

@NacosValue注解是Nacos提供的一种属性刷新机制。它可以直接应用于类的属性上,当Nacos上的属性值发生变化时,自动刷新注解的属性。

步骤:
在Spring Boot项目的pom.xml文件中添加依赖(已添加则跳过):

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

在需要动态刷新的属性上添加@NacosValue注解:

import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @NacosValue(value = "${my.property}", autoRefreshed = true)
    private String myProperty;

    // ...
}

示例代码

import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @NacosValue(value = "${my.property}", autoRefreshed = true)
    private String myProperty;

    public String getProperty() {
        return myProperty;
    }
}

在上述示例中,当Nacos上的my.property属性

值发生变化时,自动刷新myProperty属性。

方式三:使用Spring Cloud Bus

Spring Cloud Bus是一个事件、消息传输总线,可以将配置刷新事件广播给多个应用程序实例。通过结合Nacos和Spring Cloud Bus,可以实现多个应用程序实例之间的属性刷新。

步骤:
在Spring Boot项目的pom.xml文件中添加依赖(已添加则跳过):

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

配置RabbitMQ或Kafka作为消息中间件

  1. 在应用程序的配置文件中添加Spring Cloud Bus的配置:

spring:
  cloud:
    bus:
      enabled: true
      refresh:
        endpoints: /refresh

示例代码

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class MyController {

    @Value("${my.property}")
    private String myProperty;

    @GetMapping("/property")
    public String getProperty() {
        return myProperty;
    }
}

 在上述示例中,当Nacos上的my.property属性值发生变化时,通过发送POST请求到/actuator/bus-refresh接口即可刷新所有应用程序实例中的属性。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞火流星02027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值