序言

在前序课中,他们传授了应用程序注册登记服务工程项目的大体上业务流程,应用程序在注册登记服务工程项目的这时候初始化的是NamingService.registerInstance 来顺利完成示例的注册登记,在最终呢他们晓得服务工程项目注册登记是透过 nacos/v1/ns/instance USB来顺利完成注册登记的,他们那时来传授服务工程项目端的注册登记,具体来说就从那个USB门牌号已经开始,上看具体内容服务工程项目端都做了什么样事

服务工程项目注册登记

自动草稿

下面是他们从官方网站中找出的Nacos洼瓣,从那个图中他们大体上能得出结论他们要找的USB假如是在NamingService那个服务工程项目中,与此同时他们在工程项目内部结构中也能看见naming那个组件,naming是与此同时实现服务工程项目注册登记的,他们都晓得允诺方向都是透过controller来展开处置的,而在当中他们能看见两个InstanceController的因此两个类,因此注册登记示例的确会和它相关。能看见InstanceController类的允诺路由器即是他们POST允诺的路由器的部份,如下表所示:

自动草稿

因此,他们就从已经开始科学研究转交允诺处置服务工程项目注册登记的源代码,他们找出透过RestFul APIUSB,允诺类别为Post,的方式,具备条件的多于InstanceController.register方式,那个方式用以转交使用者的允诺,因此把接到的重要信息展开导出,装改成示例重要信息,接着透过getInstanceOperator().registerInstance展开初始化,那个方式也是服务工程项目注册登记的核心理念

@CanDistro@PostMapping@Secured(action = ActionTypes.WRITE)publicStringregister(HttpServletRequest request)throwsException{//从 request重要信息中以获取namespaceId,假如没预设为publicfinalString namespaceId = WebUtils
.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID);//以获取服务工程项目中文名称 文件格式:group@@serviceNamefinalString serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME);
NamingUtils.checkServiceNameFormat(serviceName);//将request模块转改成instance示例finalInstance instance = HttpRequestInstanceBuilder.newBuilder()
.setDefaultInstanceEphemeral(switchDomain.isDefaultInstanceEphemeral()).setRequest(request).build();//【核心理念】注册登记服务工程项目示例getInstanceOperator().registerInstance(namespaceId, serviceName, instance);return“ok”;
}

他们先上看一下下面那个核心理念方式

getInstanceOperator().registerInstance(namespaceId, serviceName, instance);

getInstanceOperator() 那个判断是否走Grpc协议,预设走Grpc,因此他们使用的是instanceServiceV2那个示例对象

privateInstanceOperatorgetInstanceOperator(){returnupgradeJudgement.isUseGrpcFeatures() ? instanceServiceV2 : instanceServiceV1;
}

instanceServiceV2是InstanceOperatorClientImpl,方式因此他们需要进入的是下面那个示例的处置类

自动草稿

具体内容方式如下表所示所示:

@OverridepublicvoidregisterInstance(StringnamespaceId,StringserviceName, Instance instance) {//判断是否为临时应用程序booleanephemeral = instance.isEphemeral();//以获取应用程序IDStringclientId = IpPortBasedClient.getClientId(instance.toInetAddr(), ephemeral);//透过应用程序ID创建应用程序连接createIpPortClientIfAbsent(clientId);//以获取服务工程项目重要信息Service service = getService(namespaceId, serviceName, ephemeral);//注册登记服务工程项目clientOperationService.registerInstance(service, instance, clientId);
}

从Nacos2.0以后,新增了Client模型,管理与该客户机相关的数据内容,假如两个客户机发布了两个服务工程项目,因此那个客户机发布的所有服务工程项目和订阅者重要信息都会被更新到两个Client对象中,那个Client对象对应于那个客户机的链接,接着透过事件机制触发索引重要信息的更新。Client负责管理两个客户机的服务工程项目示例注册登记Publish和服务工程项目订阅Subscribe,能方便地对需要推送的服务工程项目范围展开快速聚合,与此同时两个应用程序gRPC长连接对应两个Client,每个Client有自己唯一的 clientId

packagecom.alibaba.nacos.naming.core.v2.client;publicinterfaceClient{// 应用程序idStringgetClientId();// 是否临时应用程序booleanisEphemeral();//设置应用程序更新时间voidsetLastUpdatedTime();//以获取应用程序更新时间longgetLastUpdatedTime();// 服务工程项目示例注册登记booleanaddServiceInstance(Service service, InstancePublishInfo instancePublishInfo);//服务工程项目示例移除InstancePublishInforemoveServiceInstance(Service service);//服务工程项目示例查询InstancePublishInfogetInstancePublishInfo(Service service);CollectiongetAllPublishedService();// 服务工程项目订阅booleanaddServiceSubscriber(Service service, Subscriber subscriber);///取消订阅booleanremoveServiceSubscriber(Service service);//查询订阅SubscribergetSubscriber(Service service);CollectiongetAllSubscribeService();// 生成同步给其他节点的client数据ClientSyncDatagenerateSyncData();// 是否过期booleanisExpire(longcurrentTime);// 释放资源voidrelease();

}

晓得了Client模型后,他们来接着从clientOperationService.registerInstance(service, instance, clientId);找出对应的具体内容与此同时实现

EphemeralClientOperationServiceImpl.registerInstance()

下面那个方式是具体内容来负责处置服务工程项目注册登记,他们来详细了解一下:

@OverridepublicvoidregisterInstance(Service service, Instance instance,StringclientId) {//确保Service单例存在,注意Service的equals和hasCode方式Service singleton = ServiceManager.getInstance().getSingleton(service);//假如不是临时应用程序if(!singleton.isEphemeral()) {thrownewNacosRuntimeException(NacosException.INVALID_PARAM,String.format(“Current service %s is persistent service, cant register ephemeral instance.”,
singleton.getGroupedServiceName()));
}//根据应用程序ID找出应用程序重要信息,那个关系在连接建立的这时候存储Client client = clientManager.getClient(clientId);if(!clientIsLegal(client, clientId)) {return;
}//将应用程序示例模型,装改成服务工程项目端示例模型InstancePublishInfo instanceInfo = getPublishInfo(instance);//将示例存储到client中client.addServiceInstance(singleton, instanceInfo);//设置最终更新时间client.setLastUpdatedTime();//建立服务工程项目和应用程序的关联关系NotifyCenter.publishEvent(newClientOperationEvent.ClientRegisterServiceEvent(singleton, clientId));
NotifyCenter
.publishEvent(newMetadataEvent.InstanceMetadataEvent(singleton, instanceInfo.getMetadataId(),false));
}ServiceManager.getInstance().getSingleton()当初始化getSingleton的这时候会负责管理service的单例,在这里service会重写equlas和hasCode方式作为keypublicclassServiceManager{//单例service 看service中equals和hasCode方式privatefinalConcurrentHashMap singletonRepository;//namespace下所有的serviceprivatefinalConcurrentHashMap

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!