nacos-API代码解析

本文详细解读了Nacos API中的ClientAbilities和ServerAbilities类,介绍了配置注入、SPI机制、ConfigListener和ConfigChangeParser等关键部分,涉及Spring框架下的服务发现与配置管理。同时涵盖了事件监听、远程集群请求响应与相关工具的讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code,Keep progress,make a better result.
Survive during the day and develop at night。

目录

在这里插入图片描述

概 述

nacos-API代码解析

总结:

首先是客户端ClientAbilities类:

public class ClientAbilities implements Serializable {
    
    private static final long serialVersionUID = -3590789441404549261L;
    
    private ClientRemoteAbility remoteAbility = new ClientRemoteAbility();
    
    private ClientConfigAbility configAbility = new ClientConfigAbility();
    
    private ClientNamingAbility namingAbility = new ClientNamingAbility();
    
    public ClientRemoteAbility getRemoteAbility() {
        return remoteAbility;
    }
    
    public void setRemoteAbility(ClientRemoteAbility remoteAbility) {
        this.remoteAbility = remoteAbility;
    }
    
    public ClientConfigAbility getConfigAbility() {
        return configAbility;
    }
    
    public void setConfigAbility(ClientConfigAbility configAbility) {
        this.configAbility = configAbility;
    }
    
    public ClientNamingAbility getNamingAbility() {
        return namingAbility;
    }
    
    public void setNamingAbility(ClientNamingAbility namingAbility) {
        this.namingAbility = namingAbility;
    }
}

接着就是服务端的abilities:

public class ServerAbilities implements Serializable {
    
    private static final long serialVersionUID = -2120543002911304171L;
    
    private ServerRemoteAbility remoteAbility = new ServerRemoteAbility();
    
    private ServerConfigAbility configAbility = new ServerConfigAbility();
    
    private ServerNamingAbility namingAbility = new ServerNamingAbility();
    
    public ServerRemoteAbility getRemoteAbility() {
        return remoteAbility;
    }
    
    public void setRemoteAbility(ServerRemoteAbility remoteAbility) {
        this.remoteAbility = remoteAbility;
    }
    
    public ServerConfigAbility getConfigAbility() {
        return configAbility;
    }
    
    public void setConfigAbility(ServerConfigAbility configAbility) {
        this.configAbility = configAbility;
    }
    
    public ServerNamingAbility getNamingAbility() {
        return namingAbility;
    }

定义了一个初始化的initialize方法:
定义了一下nacos的注入注解:

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NacosInjected {
    
    /**
     * The {@link NacosProperties} attribute, If not specified, it will use global Nacos Properties.
     *
     * @return the default value is {@link NacosProperties}
     */
    NacosProperties properties() default @NacosProperties;
    
}

定义这个:

@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NacosProperties {
    
    /**
     * The prefix of property name of Nacos.
     */
    String PREFIX = "nacos.";
    
    /**
     * The property name of "endpoint".
     */
    String ENDPOINT = "endpoint";
    
    /**
     * The property name of "namespace".
     */
    String NAMESPACE = "namespace";
    
    /**
     * The property name of "access-key".
     */
    String ACCESS_KEY = "access-key";
    
    /**
     * The property name of "secret-key".
     */
    String SECRET_KEY = "secret-key";
    
    /**
     * The property name of "server-addr".
     */
    String SERVER_ADDR = "server-addr";
    
    /**
     * The property name of "context-path".
     */
    String CONTEXT_PATH = "context-path";

在cmdb 中定义了一些事件:

   
    private String type;
    
    private String name;
    

Entity,EntityEvent,Label 的方法。

这里很重要的是:SPI机制:调用了CmdbService。

对于Configuration 来说定义的也是:
首先会在这里插入代码片

public class ClientConfigAbility implements Serializable {

    private static final long serialVersionUID = 2442741206510725737L;

    /**
     * support remote metrics get.
     */
    private boolean supportRemoteMetrics;
    
    public boolean isSupportRemoteMetrics() {
        return supportRemoteMetrics;
    }
    
    public void setSupportRemoteMetrics(boolean supportRemoteMetrics) {
        this.supportRemoteMetrics = supportRemoteMetrics;
    }
}

ServerConfigAbility:

public class ServerConfigAbility implements Serializable {

    private static final long serialVersionUID = -4976152499731684230L;

    /**
     * support remote metrics get.
     */
    private boolean supportRemoteMetrics;
    
    public boolean isSupportRemoteMetrics() {
        return supportRemoteMetrics;
    }
    
    public void setSupportRemoteMetrics(boolean supportRemoteMetrics) {
        this.supportRemoteMetrics = supportRemoteMetrics;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        ServerConfigAbility that = (ServerConfigAbility) o;
        return supportRemoteMetrics == that.supportRemoteMetrics;
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(supportRemoteMetrics);
    }
}

定义了很多annotation:

public @interface NacosConfigListener {
    
    /**
     * Nacos Group ID.
     *
     * @return default value {@link Constants#DEFAULT_GROUP};
     */
    String groupId() default DEFAULT_GROUP;
    
    /**
     * Nacos Data ID.
     *
     * @return required value.
     */
    String dataId();
    
    /**
     * Nacos Config type.
     *
     * @return default value is {@link ConfigType#UNSET}
     */
    ConfigType type() default ConfigType.UNSET;
    
    /**
     * Specify {@link NacosConfigConverter Nacos configuraion convertor} class to convert target type instance.
     *
     * @return The implementation class of {@link NacosConfigConverter}
     */
    Class<? extends NacosConfigConverter> converter() default NacosConfigConverter.class;
    
    /**
     * The {@link NacosProperties} attribute, If not specified, it will use global Nacos Properties.
     *
     * @return the default value is {@link NacosProperties}
     */
    NacosProperties properties() default @NacosProperties;
    
    /**
     * Maximum timeout value of execution in milliseconds, which is used to prevent long-time blocking execution
     * impacting others.
     *
     * @return default value is 1000
     */
    long timeout() default 1000L;
    

nacos 属性配置:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NacosProperty {
    
    /**
     * The property name of Nacos Configuration to bind a field.
     *
     * @return property name
     */
    String value();
    
}

当程序启动时很重要的就是启动额对应的fiter:
fiter 如下:

 */
public interface IConfigFilter {
    
    /**
     * Init.
     *
     * @param filterConfig Filter Config
     */
    @Deprecated
    void init(IFilterConfig filterConfig);
    
    /**
     * Init.
     *
     * @param properties Filter Config
     */
    void init(Properties properties);
    
    /**
     * do filter.
     *
     * @param request     request
     * @param response    response
     * @param filterChain filter Chain
     * @throws NacosException exception
     */
    void doFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain)
            throws NacosException;
    
    /**
     * Get order.
     *
     * @return order number
     */
    int getOrder();
    
    /**
     * Get filterName.
     *
     * @return filter name
     */
    String getFilterName();
    
}

 */
public interface IConfigFilterChain {
    
    /**
     * Filter action.
     *
     * @param request  request
     * @param response response
     * @throws NacosException NacosException
     */
    void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException;
    
}

这里 在这里插入代码片

public interface IConfigRequest {
    
    /**
     * put param.
     *
     * @param key   key
     * @param value value
     */
    void putParameter(String key, Object value);
    
    /**
     * get param.
     *
     * @param key key
     * @return value
     */
    Object getParameter(String key);
    
    /**
     * get config context.
     *
     * @return {@link IConfigContext}
     */
    IConfigContext getConfigContext();
    
}

当事件完成一个abstracListnener:

public abstract class AbstractListener implements Listener {
    
    /**
     * Use default executor.
     */
    @Override
    public Executor getExecutor() {
        return null;
    }
    
}

那么共享事件呢?

public abstract class AbstractSharedListener implements Listener {
    
    private volatile String dataId;
    
    private volatile String group;
    
    public final void fillContext(String dataId, String group) {
        this.dataId = dataId;
        this.group = group;
    }
    
    @Override
    public final void receiveConfigInfo(String configInfo) {
        innerReceive(dataId, group, configInfo);
    }
    
    @Override
    public Executor getExecutor() {
        return null;
    }
    
    /**
     * receive.
     *
     * @param dataId     data ID
     * @param group      group
     * @param configInfo content
     */
    public abstract void innerReceive(String dataId, String group, String configInfo);
}

配置文件解析:

public interface ConfigChangeParser {
    
    /**
     * Judge type.
     *
     * @param type data type
     * @return true if is responsible type, otherwise false
     */
    boolean isResponsibleFor(String type);
    
    /**
     * Compare old and new data.
     *
     * @param oldContent old content
     * @param newContent new content
     * @param type       data type
     * @return key and change item map
     * @throws IOException io exception
     */
    Map<String, ConfigChangeItem> doParse(String oldContent, String newContent, String type) throws IOException;
}

Listener 接受执行者的Exector:

public interface Listener {
    
    /**
     * Get executor for execute this receive.
     *
     * @return Executor
     */
    Executor getExecutor();
    
    /**
     * Receive config info.
     *
     * @param configInfo config info
     */
    void receiveConfigInfo(final String configInfo);
}

对于远程集群来说:
请求和响应的触发的事件来说,

相关工具如下:

分析:

小结:

主要讲述了Spring相关的分析,请大家指正~

参考资料和推荐阅读

1.链接: link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

迅捷的软件产品制作专家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值