Nacos的简单回顾

Nacos配置管理

  • Data ID:具体配置文件的名字id
  • Group:一个组下多个配置文件,不同的group之间可以有相同的dataId,但是在同一个group中,不同的配置项的dataId必须是不同的。
  • 命名空间:可以将Nacos的命名空间视为一种逻辑上的环境隔离,可以用于区分不同的开发环境,同时也可以用于其他的应用场景,例如将不同的项目、应用、租户等进行隔离管理。

Nacos实时监听

@value(${spring.datasource.username}) //不支持自动更新,需要在类上加入@RefreshScope
private String username;

工程应用反思:

在具体Nacos应用的时候,在我们想要获取Nacos中相关配置的时候都需要在类上加入@RefreshScope保证实时更新,所以一般我们都是将获取的Nacos配置写在同一个类中,为这些配置写上getter setter方法,然后在需要用到的地方@autoware注入一下,这样就可以防止重复写@RefreshScope

Nacos拉取配置优先级

  1. ${spring.application.name}-${spring.profile.active}.${spring.clould.nacos.config.file.extension}文件
  2. 默认${spring.application.name}.properties这个可以自己配置
  3. ${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);
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值