一、概述
Nacos 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
https://github.com/alibaba/nacos
https://nacos.io/
作用:服务的注册与发现,服务的配置与刷新
二、实战:服务注册与发现
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
2.1、改POM
<!--nacos-discovery-->
<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-loadbalancer</artifactId>
</dependency>
2.2、写YAML
cloud:
nacos:
discovery:
server-addr: 192.168.200.129:8848 #配置Nacos地址
2.3、写代码
https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html
package com.nacos.consmer.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @Author: 史小创
* @Time: 2024/8/26 下午7:44
* @Description:
*/
@Configuration
public class RestTemplateConfig {
/**
* 这个注解用于启用客户端负载均衡功能。
* 注解作用在 RestTemplate 上时,Spring 会为 RestTemplate 配置一个拦截器,
* 这个拦截器会在你调用服务时自动根据服务名称(例如通过 Consul 注册中心注册的服务名)进行负载均衡。
* 也就是说,当你在 RestTemplate 中使用服务名称来调用服务时,@LoadBalanced 会确保请求被分发到不同的服务实例上,以实现负载均衡。
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.4、测试一
启动服务的提供者有消费者
http://localhost:9002/nacos/consumer/id/66
2.5、测试二
克隆服务的提供者
-Dserver.port=9003
http://localhost:9002/nacos/consumer/id/66
三、实战:服务配置与刷新
3.1、改POM
<dependencies>
<!--bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
3.2、写YAML
微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动,为了满足动态刷新和全局广播通知。
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
# nacos配置
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 192.168.200.129:8848 #Nacos服务注册中心地址
config:
server-addr: 192.168.200.129:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
# nacos端配置文件DataId的命名规则是:
# ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml nacos-config-client-test.yaml
server:
port: 3377
spring:
profiles:
active: dev # 表示开发环境
#active: prod # 表示生产环境
#active: test # 表示测试环境
3.3、主启动
package com.nacos.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Author: 史小创
* @Time: 2024/8/27 下午5:41
* @Description:
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
3.4、在Nacos添加配置信息
3.4.1、Nacos匹配规则
https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html
3.4.2、Nacos实操
nacos-config-client-dev.yaml
config:
info: nacos-config-client-dev.yaml version=1
3.4.3、代码实操
package com.nacos.config.web;
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;
/**
* @Author: 史小创
* @Time: 2024/8/27 下午5:42
* @Description:
*/
@RestController
public class NacosConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
3.4.4、测试
http://localhost:3377/config/info
3.5、配置热更新
我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html
@RefreshScope
看图:
3.6、回滚
四、实战:进阶
4.1、问题
问题1:
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生产环境。
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
问题2:
一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行分组和命名空间管理呢?
4.2、概述
https://nacos.io/zh-cn/docs/architecture.html
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
是什么 | 类似Java里面的package名和类名,最外层的Namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象 |
---|---|
默认值 | 默认情况:Namespace=public,Group=DEFAULT_GROUPNacos默认的命名空间是public,Namespace主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去 |
Service就是微服务 | 一个Service可以包含一个或者多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。见下一节:服务领域模型-补充说明 |
服务领域模型
4.3、三种方案加载配置
4.3.1、DataID
1️⃣默认空间public+默认分组DEFAULT_GROUP+新建DatalD
指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
nacos-config-client-test.yaml
config:
info: nacos-config-client-test.yaml version=1
修改yaml
http://localhost:3377/config/info
4.3.2、Group
2️⃣默认空间public+新建PROD_GROUP+新建DatalD
nacos-config-client-prod.yaml
config:
info: nacos-config-client-pro.yaml version=1
PROD_GROUP
修改yaml
group: PROD_GROUP
http://localhost:3377/config/info
4.3.3、Namespace
3️⃣新建public+新建PROD_GROUP+新建DatalD
Prod_Namespace
Prod2_Namespace
新建yaml
nacos-config-client-prod.yaml
PROD_GROUP
config:
info: nacos-config-client-prod-group.yaml version=1
配置本地的yaml
group: PROD_GROUP
namespace: Prod_Namespace
http://localhost:3377/config/info
五、环境搭建
SpringBoot+SpringCloud
<spring.boot.version>3.2.0</spring.boot.version>
<spring.cloud.version>2023.0.0</spring.cloud.version>
<spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version>
docker
Nacos
docker pull nacos/nacos-server:v2.0.3
docker run --env MODE=standalone --name nacos --restart=always -d -p 8848:8848 -p 9848:9848 -p 9849:9849 -e JVM_XMS=512m -e JVM_XMX=512m -v /opt/nacos:/home/nacos/nacos-server-2.0.3/nacos/standalone/data nacos/nacos-server:v2.0.3
http://192.168.200.129:8848/nacos/#/login
jdk:
Maven
IDEA
代码汇总:
https://github.com/shixiaochuangjob/markdownfile/tree/main/20240827