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