当前位置: 首页 > news >正文

免费创建虚拟网站重庆市企业网站建设

免费创建虚拟网站,重庆市企业网站建设,上海网站制作费用,推广手段有哪些方式当我们在Spring Cloud应用中使用Consul来实现服务治理时#xff0c;由于Consul不会自动将不可用的服务实例注销掉#xff08;deregister#xff09;#xff0c;这使得在实际使用过程中#xff0c;可能因为一些操作失误、环境变更等原因让Consul中存在一些无效实例信息由于Consul不会自动将不可用的服务实例注销掉deregister这使得在实际使用过程中可能因为一些操作失误、环境变更等原因让Consul中存在一些无效实例信息而这些实例在Consul中会长期存在并处于断开状态。它们虽然不会影响到正常的服务消费过程但是它们会干扰我们的监控所以我们可以实现一个清理接口在确认故障实例可以清理的时候进行调用来将这些无效信息清理掉。 开始以为只要简单的调用注销接口就能轻松完成但是实际实践的发现并非如此。因此分享一下整个实现过程以及中间遇到的一些坑。 借鉴Spring Cloud Consul 在实现之初先参考了Spring Cloud Consul在关闭程序时候实现的注销方法具体如下 public class ConsulLifecycle extends AbstractDiscoveryLifecycle { ... private void deregister(String serviceId) { if (!this.properties.isRegister()) { return; } if (ttlScheduler ! null) { ttlScheduler.remove(serviceId); } log.info(Deregistering service with consul: {}, serviceId); client.agentServiceDeregister(serviceId); } ...}我们可以看到当应用关闭时候的注销操作是通过调用client.agentServiceDeregister(serviceId)来实现的。其中client是consul-api的com.ecwid.consul.v1.ConsulClient实例。而agentServiceDeregister方法则是对/v1/agent/service/deregister/serviceID 接口的实现该接口主要用来从Consul Agent中根据serviceId来注销实例。 以此实现为范例于是开始的思路是这样的 先通过consulClient.getHealthServices(serviceId, false, null)根据serviceId来获取服务实例清单遍历实例清单中有不是PASSING状态的实例就调用client.agentServiceDeregister(serviceId)来剔除 具体实现如下 RestControllerpublic class ApiController { Autowired private ConsulClient consulClient; RequestMapping(value /unregister/{id}, method RequestMethod.POST) public String unregisterServiceAll(PathVariable String id) { ListHealthService response consulClient.getHealthServices(id, false, null).getValue(); for(HealthService service : response) { service.getChecks().forEach(check - { if(!check.getStatus().name().equals(Check.CheckStatus.PASSING.name())) { logger.info(unregister : {}, check.getServiceId()); consulClient.agentServiceDeregister(check.getServiceId()); } }); } return null; }}但是在测试后发现该方法只能剔除同一个agent上的非PASSING实例。 Catalog误区 继续搜索了一下Consul的文档发现了这个接口/v1/catalog/deregister : Deregisters a node, service, or check。于是尝试了用该接口来替换之前的consulClient.agentServiceDeregister(check.getServiceId());实现。 CatalogDeregistration catalogDeregistration new CatalogDeregistration();catalogDeregistration.setDatacenter(dc1);catalogDeregistration.setNode(check.getNode());catalogDeregistration.setServiceId(check.getServiceId());catalogDeregistration.setCheckId(check.getCheckId());consulClient.catalogDeregister(catalogDeregistration);经过测试该方法可以实现短暂的剔除但是过一段时间之后这些被剔除的实例又都恢复回来了……也就是说这个接口完全没有什么卵用 那么为什么会出现这种情况呢我们可以在Github中找到这个维持了一年多的问题讨论https://github.com/hashicorp/consul/issues/1188 整个讨论过程非常曲折虽然当前该问题还依然在open状态但是一些回复也基本够我们去理解它的原因了。比如下面这条评论 You cannot deregister a service from the agent on a different node, service only exists on the agent you have registered with. It also exists in the catalog on all nodes, but that is not related to the agent itself. And to be honest I don’t understand why there is a catalog/deregister endpoint at all, in my opinion catalog should be a read-only service list. 从该评论中我们可以知道一个重要信息服务实例只能在注册的Agent上进行注销另外对于/v1/catalog/deregister接口目前还是有不少争议的因为根本没啥用。 最终实现 既然服务实例只能在注册的Agent上进行注销那么我们的实现完全可以按照该思路来实现方法很简单只需要对一开始实现的内容做一些调整依然使用client.agentServiceDeregister(serviceId)方法只是我们需要调整client连接的agent必须是serviceId注册的agent。所以最终的修改结果如下 ListHealthService response consulClient.getHealthServices(id, false, null).getValue();for(HealthService service : response) { // 创建一个用来剔除无效实例的ConsulClient连接到无效实例注册的agent ConsulClient clearClient new ConsulClient(service.getNode().getAddress(), 8500); service.getChecks().forEach(check - { if(check.getStatus() ! Check.CheckStatus.PASSING) { logger.info(unregister : {}, check.getServiceId()); clearClient.agentServiceDeregister(check.getServiceId()); } });}
http://www.zqtcl.cn/news/742029/

相关文章:

  • 大连手机网站建设做外贸无网站如何做
  • 做旅游门票网站需要什么材料人工智能培训机构哪个好
  • 免费的网站程序个人网站可以做论坛么
  • ps中网站页面做多大的wordpress cdn 阿里
  • 深圳整站创意设计方法有哪些
  • 浙江做网站多少钱江门市网站开发
  • 保定建站价格dw软件免费安装
  • 在建设部网站上的举报凡科网怎么建网站
  • wordpress做小说网站工作期间员工花钱做的网站
  • 婚介网站方案小说网站架构
  • 英文在线购物网站建设湖北建设厅举报网站
  • 漯河网络推广哪家好宁波网站seo公司
  • 网站设计ppt案例做物流用哪个网站好
  • 做网站官网需多少钱天元建设集团有限公司财务分析
  • 一般网站建设用什么语言网络规划设计师历年考点
  • 做网站卖菜刀需要什么手续江苏网站优化
  • 花生壳内网穿透网站如何做seo优化鞍山58同城网
  • 怎么为一个网站做外链跨境电商app
  • 医疗网站不备案seo技巧课程
  • 网页和网站有什么区别湖南省郴州市邮编
  • 公考在哪个网站上做试题武威做网站的公司
  • 河南如何做网站常州网站建设价位
  • 昆山网站建设培训班成都百度
  • 兰山网站建设郑州最好的网站建设
  • 手机网站后台源码枣庄市建设局网站
  • 网站建设傲鸿wordpress 获取分类下的文章
  • 网站运行速度优化wordpress国内优化
  • wordpress全站网易云音乐播放网站建设案例公司
  • 湘潭网站建设多少钱 报价表湘潭磐石网络北京百度seo点击器
  • 什么做的网站电子商务网站的建设的原理