nacos php服务注册,Nacos 服务注册

一、注册中心对比

Spring Cloud Eureka:

优点:

1)Spring Cloud 官方推荐

2)AP模型,数据最终一致性

3)开箱即用,具有控制台管理

缺点:

1)客户端注册服务上报所有信息,节点多的情况下,网络,服务端压力过大,且浪费内存

2)客户端更新服务信息通过简单的轮询机制,当服务数量巨大时,服务器压力过大。

3)集群伸缩性不强,服务端集群通过广播式的复制,增加服务器压力

4)Eureka2.0 闭源(Spring Cloud最新版本还是使用的1.X版本的Eureka)

Spring Cloud Zookeeper:

优点:

1)比较成熟的协调系统,dubbo,Spring cloud均可适配

2)CP模型,ZAB算法,数据强一致性

缺点:

1)维护成本较高,客户端,session状态,网络故障等问题,会导致服务异常

2)集群伸缩性限制,内存,GC和连接

3)无控制台管理

Spring cloud Consul:

优点:

1)适用于Service Mesh架构,使用于JAVA生态

2)AP模型,Raft+Gossip算法,数据最终一致性

缺点:

1)未经大规模市场验证,无法保证可靠性

2)Go语言编写,内部异常排查困难

Spring Cloud Nacos:

优点:

1)开箱即用,适用于dubbo,spring cloud

2)AP模型,数据最终一致性

3)注册中心,配置中心二合一,提供控制台管理

4)纯国产,久经双十一考验

缺点:

1)刚刚开源不久,社区热度不够,依然存在bug

2)0.5.0 注册服务无鉴权认证机制,存在风险

二、Nacos 服务注册

通过源码跟踪的形式,解析服务注册的过程及原理。

源码准备:

Nacos:

Spring Cloud Alibab:

分析Spring Cloud服务发现其实不分注册中心是eureka还是Nacos,因为,两者都是Spring Cloud的实现,SpringCloud已经将接口定义好,唯一的区别就是实现不一样。Spring Cloud将这些内容全部抽象到了spring-cloud-common包中。如果不了解,可以参考一下https://blog.csdn.net/hbuzhuhaoju/article/details/78915339。

在spring-cloud-common包中有一个类org.springframework.client.serviceregistry.ServiceRegistry;这个类是Spring Cloud服务注册的总入口,开下它的方法

114f7a2e9d23

image.png

register就是注册入口,deregister就是注销入口 close的关闭 getStatus获取服务的状态

register方法调用:

org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration类实现了ServiceRegistryfang接口,

114f7a2e9d23

image.png

方法中有个事件监听 @EventListener(WebServerInitializedEvent.class) ,说明服务注册,是在项目启动产生WebServerInitializedEvent 时,向注册中心进行注册

114f7a2e9d23

image.png

start方法调用了注册的方法

114f7a2e9d23

image.png

那现在我们回到ServiceRegistry接口,查看它的实现, org.springframework.cloud.alibaba.nacos.registry.NacosServiceRegistry 就是Nacos对这个接口的实现,所以,Nacos注册逻辑也从此处开始。

NacosServiceRegistry

NacosServiceRegistry类中主要实现了register方法和deregister方法。

114f7a2e9d23

image.png

register

114f7a2e9d23

image.png

首先通过registration.getNacosNamingService()方法获取都NamingService实例

114f7a2e9d23

image.png

114f7a2e9d23

image.png

NacosDiscoveryProperties.namingServiceInstance()方法调用namingServiceInstance()方法创建NamingService类,在通过namingService.registerInstance注册到nacos的服务端

NamingFactory 创建namingService方法

114f7a2e9d23

image.png

以下为注册犯法方法实现

114f7a2e9d23

image.png

第一,创建了心跳信息,且加载到了心跳执行器BeatReactor中,BeatReactor 已经在NacosNamingService创建是就已经new 出来了,查看BeatReactor 的源码,可知,BeatReactor在创建时就启动了一个定时任务ScheduledExecutorService,这个定时任务,主要工作就是不停的通过http请求发送心跳数据到Nacos服务端:

添加心跳。心跳请求地址为:/v1/ns/api/clientBeat 请求方式PUT

114f7a2e9d23

image.png

注册服务最终的实现,调用noacos的服务端接口为/v1/ns/instance

114f7a2e9d23

image.png

deregister

114f7a2e9d23

image.png

调用了beatReactor.removeBeatInfo(移除心跳)和serverProxy.deregisterService(注销)

114f7a2e9d23

image.png

beatReactor.removeBeatInfo(移除心跳)

114f7a2e9d23

image.png

serverProxy.deregisterService(注销)调用noacos的服务端接口为/v1/ns/instance 请求方式delete

114f7a2e9d23

image.png

namingService创建的方式和register方法一样,调用namingService.deregisterInstance注销

以上为nacos客户端注册和注销的实现。

NacosDiscoveryProperties

这个是nacos客户端配置

114f7a2e9d23

image.png

以下为NacosDiscoveryProperties中的不符代码

ConfigurationProperties("spring.cloud.nacos.discovery")

public class NacosDiscoveryProperties {

private static final Logger LOGGER = LoggerFactory

.getLogger(NacosDiscoveryProperties.class);

//NACOS发现服务器地址

private String serverAddr;

//服务的域名,通过该域名可以动态获取服务器地址。

private String endpoint;

//名称空间,不同环境的分离注册表。

private String namespace;

//nacos命名日志文件名

private String logName;

//注册表的服务名称

@Value("${spring.cloud.nacos.discovery.service:${spring.application.name:}}")

private String service;

//例如服务权重,值越大,权重越大。

private float weight = 1;

//nacos服务器的群集名称。

private String clusterName = "DEFAULT";

//应用程序启动时从本地缓存加载命名。真是负载

private String namingLoadCacheAtStart = "false";

//如果您只想订阅,但不想注册您的服务,请将其设置为false。

private boolean registerEnabled = true;

//要为服务实例注册的IP地址,如果自动检测IP工作正常,则无需设置它。

private String ip;

//您要注册哪个网络接口的IP

private String networkInterface = "";

//要为服务实例注册的端口,如果自动检测端口工作正常,则无需设置该端口。

private int port = -1;

//您的服务是否为HTTPS服务

private boolean secure = false;

//命名空间的访问键。

private String accessKey;

//名字空间的秘密钥匙

private String secretKey;

@Autowired

private InetUtils inetUtils;

@Autowired

private Environment environment;

private NamingService namingService;

····

}

nacos服务端

Nacos服务端源码分析

在前面我知道服务端的注册的地址,我们可以知道服务端处理的类为com.alibaba.nacos.naming.controllers.InstanceController,

因为注册使用请求PUT的方式,

114f7a2e9d23

image.png

114f7a2e9d23

image.png

114f7a2e9d23

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值