说明:本篇文章部分内容参考了网上的文章(在下文已给出原文链接),由于本人能力有限,如果有书写错误的地方,欢迎各位大佬批评指正!我们互相交流,学习,共同进步!
该项目的地址:https://github.com/xiaoheng1/nacos_read
Nacos NamingServer 再分析
NamingServer 先从 @CanDistro 这个注解说起吧.
1.按服务名选择 nacos 节点,即一个服务的实例增删改,只由特定的 nacos 节点负责.
上面的描述如何理解了?
先看下如下的注解:
// 决定方法是否要重定向的注解.
@Retention(RetentionPolicy.RUNTIME)
public @interface CanDistro {
}
然后看下 com.alibaba.nacos.naming.web.DistroFilter#doFilter 的实现.
// 核心代码:
doFilter () {
…
// 如有必要,代理请求到其他服务器.
if (method.isAnnotationPresent(CanDistro.class) && !distroMapper.responsible(groupedServiceName)) {
...
按照 hash 取模,随机选择一台服务器,然后发送请求到那一台机器上,执行,返回结果.
} else {
...
}
}
转到 com.alibaba.nacos.naming.core.DistroMapper#responsible(java.lang.String) 看下它的实现.
public boolean responsible(String serviceName) {
final List servers = healthyList;