专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

重写Nacos服务发现多个服务器如何跨命名空间,访问公共服务

  一、问题背景
  在开发某个公共应用时,笔者发现该公共应用的数据是所有测试环境(假设存在devdev2dev3)通用的。
  这就意味着只需部署一个应用,就能满足所有测试环境的需求;也意味着所有测试环境都需要调用该公共应用,而不同测试环境的应用注册在不同的Nacos命名空间。
  二、两种解决方案
  如果所有测试环境都需要调用该公共应用,有两种可行的方案。第一种,将该公共服务同时注册到不同的测试环境所对应的命名空间中。
  第二种,将公共应用注册到单独的命名空间,不同的测试环境能够跨命名空间访问该应用。
  三、详细的问题解决过程
  先行交代笔者的版本号配置。Nacos客户端版本号为NACOS1。4。1;Java项目的Nacos版本号如下。
  最初想法是将该公共应用同时注册到多个命名空间下。在查找资料的过程中,团队成员在GitHub上发现了一篇类似问题的博客分享:RegistrationCenter:Canservicesindifferentnamespacesbecalledfromeachother?1176。
  01注册多个命名空间
  从该博客中,我们看到其他程序员朋友也遇到了类似的公共服务的需求。在本篇文章中,笔者将进一步分享实现思路以及示例代码。
  说明:以下代码内容来自用户chuntaojun的分享。shareNamespace{namespaceId〔:group〕},{namespaceId〔:group〕}RunWith(SpringRunner。class)SpringBootTest(classesNamingApp。class,properties{server。servlet。contextpathnacos},webEnvironmentSpringBootTest。WebEnvironment。RANDOMPORT)publicclassSelectServiceInShareNamespaceITCase{privateNamingServicenaming1;privateNamingServicenaming2;LocalServerPortprivateintport;Beforepublicvoidinit()throwsException{NamingBase。prepareServer(port);if(naming1null){PropertiespropertiesnewProperties();properties。setProperty(PropertyKeyConst。SERVERADDR,127。0。0。1:port);properties。setProperty(PropertyKeyConst。SHARENAMESPACE,57425802305845079a733229b9f00a36);naming1NamingFactory。createNamingService(properties);Propertiesproperties2newProperties();properties2。setProperty(PropertyKeyConst。SERVERADDR,127。0。0。1:port);properties2。setProperty(PropertyKeyConst。NAMESPACE,57425802305845079a733229b9f00a36);naming2NamingFactory。createNamingService(properties2);}while(true){if(!UP。equals(naming1。getServerStatus())){Thread。sleep(1000L);continue;}break;}}TestpublicvoidtestSelectInstanceInShareNamespaceNoGroup()throwsNacosException,InterruptedException{Stringservice1randomDomainName();Stringservice2randomDomainName();naming1。registerInstance(service1,127。0。0。1,90);naming2。registerInstance(service2,127。0。0。2,90);Thread。sleep(1000);ListInstanceinstancesnaming1。getAllInstances(service2);Assert。assertEquals(1,instances。size());Assert。assertEquals(service2,NamingUtils。getServiceName(instances。get(0)。getServiceName()));}TestpublicvoidtestSelectInstanceInShareNamespaceWithGroup()throwsNacosException,InterruptedException{Stringservice1randomDomainName();Stringservice2randomDomainName();naming2。registerInstance(service1,groupName,127。0。0。1,90);naming3。registerInstance(service2,127。0。0。2,90);Thread。sleep(1000);ListInstanceinstancesnaming3。getAllInstances(service1);Assert。assertEquals(1,instances。size());Assert。assertEquals(service1,NamingUtils。getServiceName(instances。get(0)。getServiceName()));Assert。assertEquals(groupName,NamingUtils。getServiceName(NamingUtils。getGroupName(instances。get(0)。getServiceName())));}}
  进一步考虑后发现该解决方案可能不太契合当前遇到的问题。公司目前的开发测试环境有很多个,并且不确定以后会不会继续增加。
  如果每增加一个环境,都需要修改一次公共服务的配置,并且重启一次公共服务,着实太麻烦了。倒不如反其道而行,让其他的服务器实现跨命名空间访问公共服务。
  02跨命名空间访问
  针对实际问题查找资料时,我们找到了类似的参考分享《重写Nacos服务发现逻辑动态修改远程服务IP地址》。
  跟着博客思路看代码,笔者了解到服务发现的主要相关类是NacosNamingService,NacosDiscoveryProperties,NacosDiscoveryAutoConfiguration。
  然后,笔者将博客的示例代码复制过来,试着进行如下调试:Slf4jConfigurationConditionalOnNacosDiscoveryEnabledConditionalOnProperty(name{spring。profiles。active},havingValuedev)AutoConfigureBefore({NacosDiscoveryClientAutoConfiguration。class})publicclassDevEnvironmentNacosDiscoveryClient{BeanConditionalOnMissingBeanpublicNacosDiscoveryPropertiesnacosProperties(){returnnewDevEnvironmentNacosDiscoveryProperties();}staticclassDevEnvironmentNacosDiscoveryPropertiesextendsNacosDiscoveryProperties{privateNamingServicenamingService;OverridepublicNamingServicenamingServiceInstance(){if(null!this。namingService){returnthis。namingService;}else{PropertiespropertiesnewProperties();properties。put(serverAddr,super。getServerAddr());properties。put(namespace,super。getNamespace());properties。put(com。alibaba。nacos。naming。log。filename,super。getLogName());if(super。getEndpoint()。contains(:)){intindexsuper。getEndpoint()。indexOf(:);properties。put(endpoint,super。getEndpoint()。substring(0,index));properties。put(endpointPort,super。getEndpoint()。substring(index1));}else{properties。put(endpoint,super。getEndpoint());}properties。put(accessKey,super。getAccessKey());properties。put(secretKey,super。getSecretKey());properties。put(clusterName,super。getClusterName());properties。put(namingLoadCacheAtStart,super。getNamingLoadCacheAtStart());try{this。namingServicenewDevEnvironmentNacosNamingService(properties);}catch(Exceptionvar3){log。error(createnamingserviceerror!properties{},e,,this,var3);returnnull;}returnthis。namingService;}}}staticclassDevEnvironmentNacosNamingServiceextendsNacosNamingService{publicDevEnvironmentNacosNamingService(Propertiesproperties){super(properties);}OverridepublicListInstanceselectInstances(StringserviceName,ListStringclusters,booleanhealthy)throwsNacosException{ListInstanceinstancessuper。selectInstances(serviceName,clusters,healthy);instances。stream()。forEach(instanceinstance。setIp(10。101。232。24));returninstances;}}}
  调试后发现博客提供的代码并不能满足笔者的需求,还得进一步深入探索。
  但幸运的是,调试过程发现Nacos服务发现的关键类是com。alibaba。cloud。nacos。discovery。NacosServiceDiscovery,其中的关键方法是getInstances()和getServices(),即返回指定服务ID的所有服务实例和获取所有服务的名称。
  也就是说,对getInstances()方法进行重写肯定能实现本次目标跨命名空间访问公共服务。Returnallinstancesforthegivenservice。paramserviceIdidofservicereturnlistofinstancesthrowsNacosExceptionnacosExceptionpublicListServiceInstancegetInstances(StringserviceId)throwsNacosException{StringgroupdiscoveryProperties。getGroup();ListInstanceinstancesdiscoveryProperties。namingServiceInstance()。selectInstances(serviceId,group,true);returnhostToServiceInstanceList(instances,serviceId);}Returnthenamesofallservices。returnlistofservicenamesthrowsNacosExceptionnacosExceptionpublicListStringgetServices()throwsNacosException{StringgroupdiscoveryProperties。getGroup();ListViewStringservicesdiscoveryProperties。namingServiceInstance()。getServicesOfServer(1,Integer。MAXVALUE,group);returnservices。getData();}
  03最终解决思路及代码示例
  具体的解决方案思路大致如下:生成一个共享配置类NacosShareProperties,用来配置共享公共服务的namespace和group;重写配置类NacosDiscoveryProperties(新:NacosDiscoveryPropertiesV2),将新增的共享配置类作为属性放进该配置类,后续会用到;重写服务发现类NacosServiceDiscovery(新:NacosServiceDiscoveryV2),这是最关键的逻辑;重写自动配置类NacosDiscoveryAutoConfiguration,将自定义相关类比Nacos原生类更早的注入容器。
  最终代码中用到了一些工具类,可以自行补充完整。predescription:共享nacos属性author:rookie0pengdate:202282915:22preConfigurationConfigurationProperties(prefixnacos。share)publicclassNacosShareProperties{privatefinalMapString,SetStringNAMESPACETOGROUPNAMEMAPnewConcurrentHashMap();共享nacos实体列表privateListNacosShareEntityentities;publicListNacosShareEntitygetEntities(){returnentities;}publicvoidsetEntities(ListNacosShareEntityentities){this。entitiesentities;}publicMapString,SetStringgetNamespaceGroupMap(){safeStream(entities)。filter(entitynonNull(entity)nonNull(entity。getNamespace()))。forEach(entity{SetStringgroupNamesNAMESPACETOGROUPNAMEMAP。computeIfAbsent(entity。getNamespace(),knewHashSet());if(nonNull(entity。getGroupNames()))groupNames。addAll(entity。getGroupNames());});returnnewHashMap(NAMESPACETOGROUPNAMEMAP);}OverridepublicStringtoString(){returnNacosShareProperties{entitiesentities};}共享nacos实体publicstaticfinalclassNacosShareEntity{命名空间privateStringnamespace;分组privateListStringgroupNames;publicStringgetNamespace(){returnnamespace;}publicvoidsetNamespace(Stringnamespace){this。namespacenamespace;}publicListStringgetGroupNames(){returngroupNames;}publicvoidsetGroupNames(ListStringgroupNames){this。groupNamesgroupNames;}OverridepublicStringtoString(){returnNacosShareEntity{namespacenamespace,groupNamesgroupNames};}}}description:naocs服务发现属性重写author:rookie0pengdate:20228301:19publicclassNacosDiscoveryPropertiesV2extendsNacosDiscoveryProperties{privatestaticfinalLoggerlogLoggerFactory。getLogger(NacosDiscoveryPropertiesV2。class);privatefinalNacosSharePropertiesnacosShareProperties;privatestaticfinalMapString,NamingServiceNAMESPACETONAMINGSERVICEMAPnewConcurrentHashMap();publicNacosDiscoveryPropertiesV2(NacosSharePropertiesnacosShareProperties){super();this。nacosSharePropertiesnacosShareProperties;}publicMapString,NamingServiceshareNamingServiceInstances(){if(!NAMESPACETONAMINGSERVICEMAP。isEmpty()){returnnewHashMap(NAMESPACETONAMINGSERVICEMAP);}ListNacosShareProperties。NacosShareEntityentitiesOptional。ofNullable(nacosShareProperties)。map(NacosShareProperties::getEntities)。orElse(Collections。emptyList());entities。stream()。filter(entitynonNull(entity)nonNull(entity。getNamespace()))。filter(PredicateUtil。distinctByKey(NacosShareProperties。NacosShareEntity::getNamespace))。forEach(entity{try{NamingServicenamingServiceNacosFactory。createNamingService(getNacosProperties(entity。getNamespace()));if(namingService!null){NAMESPACETONAMINGSERVICEMAP。put(entity。getNamespace(),namingService);}}catch(Exceptione){log。error(createnamingserviceerror!properties{},e,this,e);}});returnnewHashMap(NAMESPACETONAMINGSERVICEMAP);}privatePropertiesgetNacosProperties(Stringnamespace){PropertiespropertiesnewProperties();properties。put(SERVERADDR,getServerAddr());properties。put(USERNAME,Objects。toString(getUsername(),));properties。put(PASSWORD,Objects。toString(getPassword(),));properties。put(NAMESPACE,namespace);properties。put(UtilAndComs。NACOSNAMINGLOGNAME,getLogName());StringendpointgetEndpoint();if(endpoint。contains(:)){intindexendpoint。indexOf(:);properties。put(ENDPOINT,endpoint。substring(0,index));properties。put(ENDPOINTPORT,endpoint。substring(index1));}else{properties。put(ENDPOINT,endpoint);}properties。put(ACCESSKEY,getAccessKey());properties。put(SECRETKEY,getSecretKey());properties。put(CLUSTERNAME,getClusterName());properties。put(NAMINGLOADCACHEATSTART,getNamingLoadCacheAtStart());enrichNacosDiscoveryProperties(properties);returnproperties;}}description:naocs服务发现重写author:rookie0pengdate:20228301:10publicclassNacosServiceDiscoveryV2extendsNacosServiceDiscovery{privatefinalNacosDiscoveryPropertiesV2discoveryProperties;privatefinalNacosSharePropertiesnacosShareProperties;privatefinalNacosServiceManagernacosServiceManager;publicNacosServiceDiscoveryV2(NacosDiscoveryPropertiesV2discoveryProperties,NacosSharePropertiesnacosShareProperties,NacosServiceManagernacosServiceManager){super(discoveryProperties,nacosServiceManager);this。discoveryPropertiesdiscoveryProperties;this。nacosSharePropertiesnacosShareProperties;this。nacosServiceManagernacosServiceManager;}Returnallinstancesforthegivenservice。paramserviceIdidofservicereturnlistofinstancesthrowsNacosExceptionnacosExceptionpublicListServiceInstancegetInstances(StringserviceId)throwsNacosException{StringgroupdiscoveryProperties。getGroup();ListInstanceinstancesdiscoveryProperties。namingServiceInstance()。selectInstances(serviceId,group,true);if(isEmpty(instances)){MapString,SetStringnamespaceGroupMapnacosShareProperties。getNamespaceGroupMap();MapString,NamingServicenamespace2NamingServiceMapdiscoveryProperties。shareNamingServiceInstances();for(Map。EntryString,NamingServiceentry:namespace2NamingServiceMap。entrySet()){Stringnamespace;NamingServicenamingService;if(isNull(namespaceentry。getKey())isNull(namingServiceentry。getValue()))continue;SetStringgroupNamesnamespaceGroupMap。get(namespace);ListInstanceshareInstances;if(isEmpty(groupNames)){shareInstancesnamingService。selectInstances(serviceId,group,true);if(nonEmpty(shareInstances))break;}else{shareInstancesnewArrayList();for(StringgroupName:groupNames){ListInstancesubShareInstancesnamingService。selectInstances(serviceId,groupName,true);if(nonEmpty(subShareInstances)){shareInstances。addAll(subShareInstances);}}}if(nonEmpty(shareInstances)){instancesshareInstances;break;}}}returnhostToServiceInstanceList(instances,serviceId);}Returnthenamesofallservices。returnlistofservicenamesthrowsNacosExceptionnacosExceptionpublicListStringgetServices()throwsNacosException{StringgroupdiscoveryProperties。getGroup();ListViewStringservicesdiscoveryProperties。namingServiceInstance()。getServicesOfServer(1,Integer。MAXVALUE,group);returnservices。getData();}publicstaticListServiceInstancehostToServiceInstanceList(ListInstanceinstances,StringserviceId){ListServiceInstanceresultnewArrayList(instances。size());for(Instanceinstance:instances){ServiceInstanceserviceInstancehostToServiceInstance(instance,serviceId);if(serviceInstance!null){result。add(serviceInstance);}}returnresult;}publicstaticServiceInstancehostToServiceInstance(Instanceinstance,StringserviceId){if(instancenull!instance。isEnabled()!instance。isHealthy()){returnnull;}NacosServiceInstancenacosServiceInstancenewNacosServiceInstance();nacosServiceInstance。setHost(instance。getIp());nacosServiceInstance。setPort(instance。getPort());nacosServiceInstance。setServiceId(serviceId);MapString,StringmetadatanewHashMap();metadata。put(nacos。instanceId,instance。getInstanceId());metadata。put(nacos。weight,instance。getWeight());metadata。put(nacos。healthy,instance。isHealthy());metadata。put(nacos。cluster,instance。getClusterName());metadata。putAll(instance。getMetadata());nacosServiceInstance。setMetadata(metadata);if(metadata。containsKey(secure)){booleansecureBoolean。parseBoolean(metadata。get(secure));nacosServiceInstance。setSecure(secure);}returnnacosServiceInstance;}privateNamingServicenamingService(){returnnacosServiceManager。getNamingService(discoveryProperties。getNacosProperties());}}description:重写nacos服务发现的自动配置author:rookie0pengdate:20228301:08Configuration(proxyBeanMethodsfalse)ConditionalOnDiscoveryEnabledConditionalOnNacosDiscoveryEnabledAutoConfigureBefore({NacosDiscoveryAutoConfiguration。class})publicclassNacosDiscoveryAutoConfigurationV2{BeanConditionalOnMissingBeanpublicNacosDiscoveryPropertiesV2nacosProperties(NacosSharePropertiesnacosShareProperties){returnnewNacosDiscoveryPropertiesV2(nacosShareProperties);}BeanConditionalOnMissingBeanpublicNacosServiceDiscoverynacosServiceDiscovery(NacosDiscoveryPropertiesV2discoveryPropertiesV2,NacosSharePropertiesnacosShareProperties,NacosServiceManagernacosServiceManager){returnnewNacosServiceDiscoveryV2(discoveryPropertiesV2,nacosShareProperties,nacosServiceManager);}}
  本以为问题到这就结束了,但最后自测时发现程序根本不走Nacos的服务发现逻辑,而是执行Ribbon的负载均衡逻辑com。netflix。loadbalancer。AbstractLoadBalancerRule。
  不过实现类是com。alibaba。cloud。nacos。ribbon。NacosRule,继续基于NacosRule重写负载均衡。description:共享nacos命名空间规则author:rookie0pengdate:20228312:04publicclassShareNacosNamespaceRuleextendsAbstractLoadBalancerRule{privatestaticfinalLoggerLOGGERLoggerFactory。getLogger(ShareNacosNamespaceRule。class);AutowiredprivateNacosDiscoveryPropertiesV2nacosDiscoveryPropertiesV2;AutowiredprivateNacosSharePropertiesnacosShareProperties;重写choose方法paramkeyreturnSneakyThrowsOverridepublicServerchoose(Objectkey){try{StringclusterNamethis。nacosDiscoveryPropertiesV2。getClusterName();DynamicServerListLoadBalancerloadBalancer(DynamicServerListLoadBalancer)getLoadBalancer();StringnameloadBalancer。getName();NamingServicenamingServicenacosDiscoveryPropertiesV2。namingServiceInstance();ListInstanceinstancesnamingService。selectInstances(name,true);if(CollectionUtils。isEmpty(instances)){LOGGER。warn(noinstanceinservice{},thentogetshareservicesinstance,name);ListInstanceshareNamingServicethis。getShareNamingService(name);if(nonEmpty(shareNamingService))instancesshareNamingService;elsereturnnull;}ListInstanceinstancesToChooseinstances;if(org。apache。commons。lang3。StringUtils。isNotBlank(clusterName)){ListInstancesameClusterInstancesinstances。stream()。filter(instanceObjects。equals(clusterName,instance。getClusterName()))。collect(Collectors。toList());if(!CollectionUtils。isEmpty(sameClusterInstances)){instancesToChoosesameClusterInstances;}else{LOGGER。warn(Acrossclustercalloccurs,name{},clusterName{},instance{},name,clusterName,instances);}}InstanceinstanceExtendBalancer。getHostByRandomWeight2(instancesToChoose);returnnewNacosServer(instance);}catch(Exceptione){LOGGER。warn(NacosRuleerror,e);returnnull;}}OverridepublicvoidinitWithNiwsConfig(IClientConfigiClientConfig){}privateListInstancegetShareNamingService(StringserviceId)throwsNacosException{ListInstanceinstancesCollections。emptyList();MapString,SetStringnamespaceGroupMapnacosShareProperties。getNamespaceGroupMap();MapString,NamingServicenamespace2NamingServiceMapnacosDiscoveryPropertiesV2。shareNamingServiceInstances();for(Map。EntryString,NamingServiceentry:namespace2NamingServiceMap。entrySet()){Stringnamespace;NamingServicenamingService;if(isNull(namespaceentry。getKey())isNull(namingServiceentry。getValue()))continue;SetStringgroupNamesnamespaceGroupMap。get(namespace);ListInstanceshareInstances;if(isEmpty(groupNames)){shareInstancesnamingService。selectInstances(serviceId,true);if(nonEmpty(shareInstances))break;}else{shareInstancesnewArrayList();for(StringgroupName:groupNames){ListInstancesubShareInstancesnamingService。selectInstances(serviceId,groupName,true);if(nonEmpty(subShareInstances)){shareInstances。addAll(subShareInstances);}}}if(nonEmpty(shareInstances)){instancesshareInstances;break;}}returninstances;}}
  至此问题得以解决。
  在Nacos上配置好共享namespace和group后,就能够进行跨命名空间访问了。nacos共享命名空间配置示例nacos。share。entities〔0〕。namespacee6ed20173ed64d9b824adb626424fc7bnacos。share。entities〔0〕。groupNames〔0〕DEFAULTGROUP指定服务使用共享的负载均衡规则,serviceid是注册到nacos上的服务id,ShareNacosNamespaceRule需要写全限定名serviceid。ribbon。NFLoadBalancerRuleClassName。。。ShareNacosNamespaceRule
  注意:如果Java项目的nacosdiscovery版本用的是2021。1,则不需要重写Ribbon的负载均衡类,因为该版本的Nacos不依赖Ribbon。
  2。2。1。RELEASE版本的nacosdiscovery依赖Ribbon。
  2021。1版本的nacosdiscovery不依赖Ribbon。
  四、总结
  为了达到共享命名空间的预期,构思、查找资料、实现逻辑、调试,前后一共花费4天时间。成就感满满的同时,笔者也发现该功能仍存在共享服务缓存等可优化空间,留待后续实现。

1月8日起实施!有序恢复内地居民赴香港澳门旅游国务院港澳事务办公室微信公众号1月5日消息,国务院联防联控机制综合组发布关于优化内地与港澳人员往来措施的通知(下文简称通知)决定优化内地与港澳人员往来措施,自2023年1月8日起实视点他们的2022,这样走过!文周乃军雷志成王文杰图王磊肖圣贤侯晓峰刚申超2022年第71集团军某合成旅在强军目标指引下紧锣密鼓开展练兵备战实战水平不断得到检验和提升今天,我们走进该旅回顾他们的20221这一年福兔呈祥福满乾坤海报来啦!2022年各位福建人的关键字里一定有福福兔呈祥,福满乾坤2023年福气继续!01福建福文化标识认识一下02福兔呈祥福满乾坤海报来啦03福抱兔福乐兔,你们好!大家注意到海报上的福抱兔他一年就赚万把块,十四年捐了8万块!在江苏淮安市淮安区有一个简朴的修鞋屋屋里有一位77岁的老大爷今年,是他修鞋的第45个年头大爷小时候得了病在轮椅上坐了一辈子如今,和老伴一起互相照顾从早上8点到下午5点他几乎天天都在福建省十大最佳旅游景点福建省的旅游资源丰富,类型多样。福建的自然旅游资源特色是玉山蓝海温泉众多,生态环境优越。福建的人文旅游资源特色是宗教多元建筑奇特民俗奇异。本文为你盘点福建省十大最佳旅游景点,你打卡我们的人口将何去何从此图为北京历年的出生人口统计表,其中橘色为死亡率,蓝色为出生率,这是截止到2021年的数据,虽然2022年数据尚未出来,但是可想而知并不乐观,应该会比20021年的数据还要再低。这教育的真相教什么和如何教的区分大家好,今天正式和大家分享教练父母这本书的第一章教育的真相,今天分享第一节教什么如何教的区分。下面来看详细内容。曾经有位父亲问我三字经中讲述子不教,父之过。可在今天我们做父母的似乎当孕妇妈妈生气时,宝宝是第一个感知到的,母子连心是真的最近看到一则新闻中说到一位怀孕23周的孕妇去医院检查身体时对医生说自己前两天和老公吵了一架,吵完以后发现肚子里的小宝宝两三天都没有胎动,这位准妈妈担心孩子的健康状态,于是医生给做了如何做到双赢的分配?我们先来看一个场景酷热的夏天,妈妈给两孩子带了一个大西瓜。清洗过后,妈妈把大西瓜切成两半,一半放冰箱,另一半再切两块,分别给到两个孩子。意外出现了,其中拿到相对西瓜比较小一点的弟弟阳康后什么时候可以备孕?怎样科学备孕,有远见的父母都不着急大家好,我是仔仔妈卿晨。很多新婚夫妻很着急三年新冠管控,婚礼都延期了。最近放开了,刚好自己也阳过了,是不是就能马上要小孩了呢?看到这样一组对比夫妻两人在感染了新冠后,精子在显微镜下小朋友的重疾险,哪些更值得买?附全网产品测评父母,是孩子最坚硬的后盾。因为想给孩子全面的保障,很多朋友都会尽早给孩子配置保险。这既是对孩子的一份责任,也能让自己安心。为了帮助大家挑选到合适的高性价比产品,我们对比了44款少儿
俄乌战争进入第三阶段俄罗斯与乌克兰重点争夺乌南地区木叔这篇国际评论,来分析俄乌战争。8月6日英国情报界对外公布一个评估俄军正在把大军从顿巴斯转移到乌南地区。这个动向意味着什么?估计2月底俄罗斯发动俄乌战争之后,恐怕当时没有人会想到DNF曾经的天价装备有多贵,一套装备等于一辆车?在60版本在85版本期间,佩戴的装备以拍卖行购买获得,在当时版本属性强的装备都可以卖到几百上千万,没有最贵只有更贵。以前版本由于还没有普及史诗,所以大部分装备只能从拍卖行获取。在你旋风少女之神俄罗斯的元武道世青赛比赛现场,本次比赛双方是来自中国岸阳松柏道馆的李长生对阵卫冕冠军韩国昌海道馆的闵胜浩,胜利者将获得本次大赛的冠军,这对于许久未夺冠的岸阳来说是一个极大的荣誉,毕凤凰卫视美女沈星,45岁了依然少女感十足,青春已逝,但容颜犹在沈星至今45岁,还是孤身一人!45岁沈星近照曝光,少女感十足。近些年来,沈星在节目中出镜率并不高,但一直会在网络平台给喜欢自己的粉丝分享一些日常的生活点滴。刚刚剪了短发的沈星虽然已这些男星是来剧中服兵役的吗?吴京朱亚文军人角色深入人心如有战,召必回这是张译在八一建军节当天发出的信息,作为一个在部队里面呆了10年的老兵,他在荧幕前贡献了一个个军人的光辉角色,让观众们看到了他身上散发的军人气魄。当然,娱乐圈有这样几天才少女何碧玉14岁考750分上清华,留学后改国籍,不愿回国2000年,河南一个14岁的女孩,满分750分,创下了河南高考史上的最高纪录。她成为当年河南高考理科状元,最终被清华大学录取。毕业后,我出国留学。如今22年过去了,曾经的美国神童现网上被普信男撩骚如何回怼?哈哈哈哈哈真的会栓Q网络上的撩骚刺客真的是层出不穷明明上一秒还在正常聊天下一秒就被带上开车的路来看下网络正义战士是如何整治他们的感受下今日份的沙雕鉴赏往下翻阅收获快乐第二碑半价对啊说明人在绝境时潜能是陈思诚祝前妻佟丽娅生日快乐,丫丫身穿睡衣现酒店,两人疑似复合2021年5月20日,著名导演陈思诚与佟丽娅宣布和平离婚,即便外界猜测不断,但两人仍真心感谢曾拥有对方的守护。逾9年感情又岂是说断便能斩断,两人婚内育有一子,仍是两人沟通的桥梁。8油价调整信息今天8月8日,国内加油站调整后9295号汽油价格今天是2022年8月8日,在明晚的晚间,国内成品油价格调整窗口将会正式开启,而按照目前三地原油品种变化率来看,油价调整幅度并未达到调整标准,换句话说,很有可能此次油价调整将会搁浅。重大问题不表态,三位艺人成为众矢之的,网友喊话封杀海客谈瀛洲,烟涛微茫信难求越人语天姥,云霞明灭或可睹。瀛洲是先秦时候的称谓,宋朝时叫流求,元朝叫琉球。最近,这地界发生了一件大事,一件事关尊严与完整的大事。许多艺人站出来表态,跟1名爵全系MG7泄露,C级外观,B级尺寸,A级价格,你心动了吗?最近,全系MG7车型曝光,如果用一句话总结这台车的话,我认为他拥有C级车的外观,B级车的尺寸以及A级车的价格。不知道看到之后大家会不会有点心动。首先我们说外观,新车的造型设计非常的
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网