spring cloud微服务不定期会出现网络请求失败的错误。于是看了下后台日志,发现有几个请求会报如下的异常:

Caused by: feign.RetryableException: Connection refused (Connection refused) executing POST http://oauth/oauth/token******
at feign.FeignException.errorExecuting(FeignException.java:)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:)
at feign.hystrix.HystrixInvocationHandler$.run(HystrixInvocationHandler.java:)
at com.netflix.hystrix.HystrixCommand$.call(HystrixCommand.java:)
at com.netflix.hystrix.HystrixCommand$.call(HystrixCommand.java:)
at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:)
... more

(调用流程是user服务调用oauth服务)
一开始很奇怪,为什么有的请求可以成功,有的不可以。因为服务编排用的是Docker Compose,所以第一反应是编排服务的时候,oauth的hosts忘加了(后来才想起来请求用的是Feign,根本不需要管hosts,RestTemplate才需要,mdzz)。在docker-compose.yml里加上以后,并没有卵用。
然后到Consul上看了一下,oauth服务确实是在线的。(不过后面的passing数量不是2,是6,这里因为已经移除了失效的,所以只剩下2个)

然后就开始怀疑人生了,为什么服务在线却访问不到呢,用Eureka的时候才出现过这个问题,难道Consul也有?那我辛辛苦苦切换过来还有什么意义!然后我就盯着那个数字6看,产生了一个疑问:哪里来的6个oauth实例?这个时候才想到,可能是Feign负载均衡拿到了“假”的oauth实例,所以才请求失败。点开Consul的Node列表看了一下,发现有6个oauth躺在那里,然而只有2个是可用的。

不应该啊,Consul不应该把无效的服务注销掉吗?

这是因为:当在Spring Cloud应用中使用Consul来实现服务治理时,由于Consul不会自动将不可用的服务实例注销掉(deregister),这使得在实际使用过程中,可能因为一些操作失误、环境变更等原因让Consul中存在一些无效实例信息,而这些实例在Consul中会长期存在,并处于断开状态。它们虽然不会影响到正常的服务消费过程,但是它们会干扰我们的监控,所以我们可以实现一个清理接口,在确认故障实例可以清理的时候进行调用来将这些无效信息清理掉。

在consul的官网上:https://www.consul.io/api/agent/service.html (果然遇到问题就应该先去找官方文档啊!)

解决办法:调用deregister接口

用PUT请求Consul 的这个deregister接口,附上实例的id就可以成功注销掉实例了(注意是实例的id,不是服务名,即服务名+一段唯一字符串。有ACL认证的Consul需要在Header上加token,否则会报permission denied)如下图:

示例:put方式访问http://1XX.XX.xx.250:8500/v1/agent/service/deregister/trade-1xx-xx-206-101-18090

接着看到这个服务的实例数量……难道要一个一个请求吗?

当然不是,配合下面这个实例列表接口,批量删除吧!

示例:查看list service如下:http://1XX.XX.XX.250:8500/v1/agent/services

上面是列出所有的service。
 
可以用下面的
http://172.29.206.250:8500/v1/health/state/critical,返回的json中都是失败的service,再删除它。

服务注册发现consul之五:Consul移除失效服务的正确姿势的更多相关文章

  1. 服务注册发现Eureka之二:高可用服务注册中心

    前言 在Spring Cloud系列文章的开始,我们就介绍了服务注册与发现,其中,主要演示了如何构建和启动服务注册中心Eureka Server,以及如何将服务注册到Eureka Server中,但是 ...

  2. 服务注册发现、配置中心集一体的 Spring Cloud Consul

    前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...

  3. 服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比

    服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比 注册中心简介 流程和原理 基础流程 核心功能 1.Eureka.Consul.Zookeeper三者异同点 ...

  4. 服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现

    首先安装consul环境,参照之前的文章:<服务注册发现consul之一:consul介绍及安装>中的第一节介绍. Spring Cloud使用Consul的服务与发现 1.导入依赖pri ...

  5. python与consul 实现gRPC服务注册-发现

    背景 通过对gRPC的介绍我们知道,当正常启动服务后,我们只需要知道ip,port就可以进行gRPC的连接.可以想到,这种方式并不适合用于线上环境,因为这样直连的话就失去了扩展性,当需要多机部署的时候 ...

  6. Consul 多数据中心下的服务注册发现与配置共享

    1. Consul简介   Consul是HashiCorp公司推出的开源软件,它提供了一套分布式高可用可横向扩展的解决方案,能为微服务提供服务治理.健康检查.配置共享等能力.   Eurake2.x ...

  7. 基于docker,consul,consul-template, registrator, nginx服务注册发现集群

      介绍 该工程主要实现服务的自动注册发现,从而达到提高运维效率,做到服务的自动发现和动态扩展. 服务注册发现 服务启动后自动被发现 动态变更负载均衡 自动伸缩 工具 1.Registrator 这是 ...

  8. spring-cloud-consul 服务注册发现与配置

    下面是 Spring Cloud 支持的服务发现软件以及特性对比(Eureka 已停止更新,取而代之的是 Consul): Feature euerka Consul zookeeper etcd 服 ...

  9. spring cloud微服务快速教程之(七) Spring Cloud Alibaba--nacos(一)、服务注册发现

    0.前言 什么是Spring Cloud Alibaba? Spring Cloud Alibaba 是阿里开源的,致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便 ...

  10. CoSky 高性能 服务注册/发现 & 配置中心

    CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...

随机推荐

  1. 去除 DBGridEh SelectedRows里无效的书签

    数据集处于过滤状态,然后选中几个记录,再修改了这些记录中的某个字段(和过滤条件有关),导致那几个记录不符合过滤条件,不显示了.但是SelectedRows里 还保存着.如果不删除SelectedRow ...

  2. 指针和const一些注意事项

    1.常量指针(底层const) 指向常量的指针,指针所指向的对象的值无法被修改,若想存放常量对象的地址,只能使用指向常量的指针. 2.指针常量(顶层const) 指针本身是常量,指针本身的值不可修改. ...

  3. CUDA ---- Dynamic Parallelism

    Dynamic Parallelism 到目前为止,所有kernel都是在host端调用,GPU的工作完全在CPU的控制下.CUDA Dynamic Parallelism允许GPU kernel在d ...

  4. SWIFT 之CoreData初试

    SWIFT中使用CoreData来保存本地数据,在建立项目的时候把 "Use Core Data"选项选上 项目建立完成后点击后缀为 .xcdatamodeld的那个文件,点击右下 ...

  5. 升级 macOS Mojave 后部分软件 (如 VS Code) 字体变虚的解决方法

    目前有些朋友的设备可能还是“非 Retina” 显示器,那这样如果升级到 Mojave 后你会发现文字不清晰了,这是因为 Mojave 默认关闭了文字次像素渲染字体,你需要在终端里执行: defaul ...

  6. Android manifest 获取源代码

    /********************************************************************************* * Android manifes ...

  7. ODBC 安装/使用/编程

    前言: 主要讲解ODBC API, 以mysql为例, 从配置到安装, 再到具体的编程, 以期对ODBC有个初步的认识. *) 下载mysql, 选择社区版mysql, 并安装 http://dev. ...

  8. cloneNode

  9. hdu 1203 dp(关于概率的```背包?)

    题意:一个人手里有一笔钱 n ,有 m 所大学,分别知道这些大学的投简历花费和被录取概率,因为钱数有限,只能投一部分学校,问被录取的概率最大有多大. 这题除去计算概率以外就是一个 0 1 背包问题,所 ...

  10. 【vue】vue-cli 脚手架项目简介(一) - package.json

    vue-cli是用来生成 vue项目的命令行工具,它的使用方法是这样的: vue init <template-name> <project-name>第二个参数 templa ...