Nacos的一些其他功能

配置相关

配置的自动刷新原理===

SpringCloud中,
Scope是Spring的一个作用域,SpringCloud相当于单独定义了一个作用域,refresh,配置可以刷新的一个Bean

@RefreshScope

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.cloud.context.config.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Scope("refresh")
@Documented
public @interface RefreshScope {
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}

默认情况下,主配置会自动刷新,extension-configs和shared-configs不会自动刷新,可以通过spring.cloud.nacos.config.refresh-enable=false关闭主配置的自动刷新

自动配置的意思是一旦引用的配置发生了变化,应用端也能及时获取到最新值

值得注意的是,尽管默认情况下会自动刷新,但是对于通过@Value的使用方式,还需要在改Bean上增加@RefreshScope,这样才能动态修改@Value的属性达到动态更新的最终效果

配置的历史版本回滚

image

image

监听查询正在使用某个配置的应用

image

服务相关

临时实例和持久实例

默认情况下,注册给Nacos的实例都是临时实例
临时实例:会通过客户端与服务器之间的心跳来保活,默认情况下客户端每隔5s发送一次心跳

public static final long DEFAULT_HEAT_BEAT_INTERVAL = TimeUnit.SECONDS.toMillis(5);

在服务端如果超过15s没有收到客户端的心跳,就会把实例标记为不健康状态

public static final long DEFAULT_HEAT_BEAT_TIMEOUT = TTimeUnit.SECONDS.toMillis(15);

在服务端,如果超过30s没有收到客户端的心跳,就会删除实例

public static final long DEFAULT_IP_DEELTE_TIMEOUT = TTimeUnit.SECONDS.toMillis(30);

对于持久化实例,就算服务下线了,也不会被删除
配置持久化实例,将实例信息持久化到磁盘:

spring.cloud.nacos.discovery.ephemeral=false

持久实例会永远在线,所以如果消费者在某种情况下想要拿到已经下线的实例的实例信息,就可以将实例注册为持久实例。

保护阈值

在使用的过程中,可以设置一个0-1的比例,表示如果服务的所有实例中,健康实例的比重低于这个比重就会触发,一旦出发保护,在服务消费端就会不论是否健康把所有实例拉取下来,这样就能起到保护的作用,正常情况下消费者只能拿到健康的实例,但是如果健康实例的比例过小,就会导致所有流量压到那一点的健康实例上,这样仅剩的几个健康实例也会被压垮,所以只要触发了保护,消费者会拿到全部实例,虽然部分消费者会因为访问到不健康的实例导致请求失败,但是也有一部分的请求能访问到健康实例,达到保护的作用。

在SpringCloud Tencent中这个功能叫“全死全活”。

权重,NacosRule配置权重

一个服务的多个实例,可能对应的机器配置不同,可以给不同的实例设置不同的权重
不过在消费一个服务时,通常是通过Ribbon负载均衡的,默认情况下Nacos配置的权重不生效

使用Nacos的权重:

@Bean
public IRule ribbonRule(){
	return new NacosRule();
}

Cluster就近访问

一个服务下会有多个实例,nacos可以将这些实例指定到不同的集群中
指定当前实例所属的集群:

spring.cloud.nacos.discovery.cluster-name=beijing

消费者也可以配置使服务调用者也在“beijing”集群:

spring.cloud.nacos.discovery.cluster-name=beijing

这样服务消费者就只会调用到“beijing”集群的实例

如果没有配置cluster-name就会默认使用所有集群

posted @ 2024-04-20 02:04  燕子去了  阅读(13)  评论(0编辑  收藏  举报

Powered by .NET 8.0 on Kubernetes

我会翻山越岭,到每一个我想去的地方

...