nacos---架构

4 篇文章 0 订阅
2 篇文章 0 订阅

nacos支持两种架构:一种是 CP模式,一种式AP模式

CP模式(类似于zookeeper):

CP模式其

特点:

           1、利用raft协议保证,集群节点间的数据一致性,类似zookeeper的ZAB协议,保存节点之 

                 间的选举和数据同步

           2、数据会持久化到本地,可以防止数据丢失

AP模式(类似于eureka):

 特点:

         1、集群节点之间的数据同步是异步同步的

         2、服务列表信息不会持久化到本地,只会存在内存中

我们一般开发中,追求可用性,一般都会采用AP模式进行部署,

优缺点对比:

CP模式缺点:1、当其中一台机器宕机了,集群会进行选举,选举过程,服务对外不可用

                       2、节点如果宕机半数以上,所有的服务都不可用,因为选举不了新的master

                       3、如果机器数是偶数台,还要防止脑裂,导致整个服务不可用

                      

           优点:1、节点之间的数据是一致的,客户端获取的数据都是一样的,不会出现有些客户端

                           调用某个服务成功,另外一个客户端调用这个服务失败的情况

AP模式优点:

                    1、就算其中一台机器宕机了,其他几台机器照样可以接收请求

            缺点:

                    1、如果一台机器正好有服务注册进去了,还没来得及同步到其他节点,突然宕机了,

                         其新注册的服务,客户端还是调用不了

在我们开发中,针对服务发现这块,还是追求可用性比较高,一般选择使用AP模式

服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址,端口,服务名称等信息。
Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。

双层map格式是 Map<nameSpaceId,Map<group::serverName,serviceInstance>>
服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认
5s发送一次心跳。
服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性

cp模式:一般采用raft协议进行同步

ap模式:进行异步批量同步,有两个条件,当实例数达到1000条或者当前时间跟上一次同步的时间大于200ms时,进行同步
服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清
单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的
healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送
心跳则会重新注册)

服务心跳和服务健康检查是共同发挥作用的:

nacosClient方会对每个实例,生成一个向nacosServer发送beat心跳的任务,放到一个定时线程池里面去,主要是更新nacosServer 中 服务实例的一个时间属性为当前时间

nacosServer方也会对每个实例,生成一个检查实例的时间属性跟当前时间对比,如果跟当前时间相差15s,把这个实例的健康状态改为false,如果跟当前时间相差30s,直接把这个实例给删除的作业,放到 一个定时线程池

服务注册表:

Nacos服务注册表结构:Map<namespaceId, Map<group::serviceName, Service>>

 这里的serviceName 是 spring.  application. name

            service是 ip:port

如:

@SpringBootApplication
@ComponentScan("nacos.stu")
public class NacosStuApplication {

	public static void main(String[] args) throws NacosException {
		ApplicationContext ap = SpringApplication.run(NacosStuApplication.class, args);
		//NamingService namingService = (NamingService)ap.getBean("namingService");
	 	NamingService namingService = NamingFactory.createNamingService("localhost:8851");
		System.out.println(namingService.getAllInstances("naocs-service"));
	}
}
[
    {
        "clusterName":"DEFAULT",
        "enabled":true,
        "ephemeral":true,
        "healthy":true,
        "instanceHeartBeatInterval":5000,
        "instanceHeartBeatTimeOut":15000,
        "instanceId":"172.30.47.182#8080#DEFAULT#DEFAULT_GROUP@@naocs-service",
        "ip":"172.30.47.182",
        "ipDeleteTimeout":30000,
        "metadata":{
            "preserved.register.source":"SPRING_CLOUD"
        },
        "port":8080,
        "serviceName":"DEFAULT_GROUP@@naocs-service",
        "weight":1
    }
]
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值