Nacos配置管理
Data ID
:具体配置文件的名字idGroup
:一个组下多个配置文件,不同的group
之间可以有相同的dataId
,但是在同一个group
中,不同的配置项的dataId
必须是不同的。- 命名空间:可以将Nacos的命名空间视为一种逻辑上的环境隔离,可以用于区分不同的开发环境,同时也可以用于其他的应用场景,例如将不同的项目、应用、租户等进行隔离管理。
Nacos实时监听
@value(${spring.datasource.username}) //不支持自动更新,需要在类上加入@RefreshScope
private String username;
工程应用反思:
在具体Nacos应用的时候,在我们想要获取Nacos中相关配置的时候都需要在类上加入@RefreshScope
保证实时更新,所以一般我们都是将获取的Nacos配置写在同一个类中,为这些配置写上getter setter
方法,然后在需要用到的地方@autoware
注入一下,这样就可以防止重复写@RefreshScope
Nacos拉取配置优先级
${spring.application.name}-${spring.profile.active}.${spring.clould.nacos.config.file.extension}
文件- 默认
${spring.application.name}.properties
这个可以自己配置 ${spring.application.name}
文件
Nacos额外拉去配置
spring:
cloud:
bootstrap:
enabled: true
nacos:
config:
# share 与 extension 的功能一致,share 表示其他的项目也在用,extension 表示只有这个项目在用
share-configs[0]:
group: DEFAULT_GROUP
data-id: xxx.yml
refresh: false
extension-configs[1]:
group: chat
data-id: xxx.properties
refresh: false
extension-configs[2]: # 下标越大优先级越高
group: chat
data-id: xxx.properties
refresh: false
Nacos注册发现
-
当启动一个服务时,它将自动注册到Nacos注册中心
-
要为服务注册多个实例,只需在不同的主机或端口上多次启动该服务,每个实例都将自动注册到Nacos中
-
因为有多个实例,所以在获取服务的时候需要
@LoadBalance
做负载均衡 -
当然可以自己自定义一个LoadBanlance:
- 手写负载:原理+JUC(CAS + 自旋锁(基于CAS算法的实现)的复习)
- CAS(compareAndSet):比较并交换(期望值:需要比较的值,更新值)
- 不用sync也可以保证数据一致性是因为底层调用Unsafe类+CAS思想(JDK自带的native修饰,提供类似指针的功能,根据内存偏移地址获取数据)
- CAS有三个操作数:内存值V,旧的预期值A,要修改的跟新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
// 1.删除@LoadBanlance public interface LoadBalancer{ // 2.装入所有机器 ServiceInstance instances(List<ServiceInstance> serviceInstances); } @Compoment public class MyLB implements LoadBalancer{ private AtomicInteger atomicInteger = new AtomicInteger(0); //自旋锁 public final int getAndIncrement(){ int current; int next; do{ current = this.atomicInteger.get(); next = current >= 2147483647 ? 0 : current + 1; }while(!this.atomicInteger.compareAndSet(current,next)); return next; } @Override public ServiceInstance instances(List<ServiceInstance> serviceInstances){ int index = getAndIncrement() % serviceInstances.size(); return serviceInstances.get(index); } }