zrlw
zrlw
nacos到nacos的全量同步或许可以借鉴一下ZookeeperSyncToNacosServiceImpl,zk到nacos首次同步是支持全量同步的,只需要同步任务名配成ALL。
> 目前Nacos-sync里面还没有高版本(2.x)批量注册的适配,nacos-client2.1.1临时实例批量注册(com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy#batchRegisterService)的功能是beta功能,临时实例批量注册的功能在2.2.0发布了正式稳定版,所以现在2.x的版本之间同步会有问题。会抽空适配这个特性,不过,也欢迎大家提pr 近期有时间让nacos-sync适配这个特性么?或者提供一下nacos-sync修订的思路?让大家看看pr要怎么搞
如果只考虑nacos集群之间同步,是不是只修改NacosSyncToNacosServiceImpl这个类就行了
提交了两个PR ( 忘了应该要改哪个分支了,如果不是master就是develop): https://github.com/nacos-group/nacos-sync/pull/335 (for master branch) https://github.com/nacos-group/nacos-sync/pull/336 (for develop branch) 修改了NacosSyncToNacosServiceImpl和TaskAddAllProcessor两个类,用的nacos-client是当前最新的2.3.0Beta。 初步测试可同步dubbo3应用级别注册的服务名(临时实例),只是nacos2服务端ParamCheckRule.java定义了serviceName的检查规则: ``` public String serviceNamePatternString = "^(?!@).((?!@@)[^\\u4E00-\\u9FA5\\s])*$"; ``` 不允许出现@字符、汉字、空白字符,但nacos2服务端应答的查询服务实例结果里的各个instance对象的serviceName是“组名@@服务名”的形式,nacos-sync需要清掉组名@@前缀或者将serviceName属性重置为null再用做同步注册到目标集群的参数,否则目标集群serviceName参数检查就会失败: Param 'serviceName' is illegal 另外比较坑的是(很重要!): nacos2新增的批量注册接口是全量更新,也就是每次更新需要构建出直接注册到源集群的全量实例(不含来自其他集群的同步实例),否则目标集群就会丢实例。批量反注册或解除注册接口最终也是调用的批量注册,就是把剩下的实例再批量注册一下。 !!注意!! 这个PR我只测试了临时实例(ephemeral=true),我没有持久实例测试环境,这个PR能否满足持久实例同步还需要进一步确认。
找到一下nacos相关issue:https://github.com/alibaba/nacos/issues/9261 里面有持久实例的相关讨论: > > NacosNamingService#registerInstance allows the same client to register multiple persistent instances, i 如果持久实例也有批量接口就方便了
https://github.com/nacos-group/nacos-sync/pull/336 (for develop branch) 支持dubbo3应用级别服务实例同步了,无论元数据保存在注册中心(provider端的dubbo3需要配置dubbo.application.metadata-type=remote)还是默认的本地(dubbo.application.metadata-type=local)都能同步。
> nacosSync会一直维持着grpc连接 你说是nacos源注册中心集群已经挂了,NacosSync依然维持着nacos目标注册中心集群的grpc连接么(同步自源集群的实例)?
nacos已正式发布2.3.0,完善了批量接口,#336 做了同步更新,可以试试看。 如果及时感知服务端宕机或网络断开,建议将部署nacossync的linux的内核参数net.ipv4.tcp_retries2调成5,windows默认的就是5,这样当网络中断或服务端因故(比如断电)宕机时,nacosSync13秒左右就能感知到了,否则无效连接通常持续15分钟才会断开。 如果网络环境好,也可以参照redhat的建议调成3,那样3秒就能感知到了。