先贴代码:

  1. @RestController
  2. public class CallHelloController {
  3. @Autowired
  4. private LoadBalancerClient loadBalancerClient;
  5.  
  6. @Autowired
  7. private RestTemplate restTemplate;
  1. @RequestMapping("/call")
  2. public String call(){
  3. ServiceInstance serviceInstance = loadBalancerClient.choose("service-producer");
  4. System.out.println("服务地址:" + serviceInstance.getUri());
  5. System.out.println("服务名称:" + serviceInstance.getServiceId());
  6.  
  7. String callServiceResult = restTemplate.getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
  8. System.out.println(callServiceResult);
  9. return callServiceResult;
  10. }
  1. @SpringBootApplication
  2. @EnableDiscoveryClient //单纯的消费(不对外提供服务)可以不注册
  3. @RibbonClient(name = "service-producer", configuration = RibbonConfig.class)
  4. @ComponentScan(excludeFilters =
  5. {@ComponentScan.Filter(type= FilterType.ANNOTATION, value=ExcludeFromComponentScan.class)}
  6. )
  7. public class SpringCloudConsulConsumerApplication {
  8.  
  9. public static void main(String[] args) {
  10. SpringApplication.run(SpringCloudConsulConsumerApplication.class, args);
  11. }
  12.  
  13. @Bean
  14. @LoadBalanced
  15. public RestTemplate restTemplate() {
  16. return new RestTemplate();
  17. }
  18. }

application.properties

  1. spring.application.name=spring-cloud-consul-producer
  2. server.port=8802
  3. spring.cloud.consul.host=localhost
  4. spring.cloud.consul.port=8500
  5. #注册到consul的服务名称
  6. spring.cloud.consul.discovery.serviceName=service-producer

实际上,/call请求映射方法存在问题;

问题是 因为  LoadBalancedClient  这里的 choose 根据 Consul注册的服务名(spring.cloud.consul.discovery.serviceName=service-producer) 命中一个服务提供者;

这里就不能使用加了LoadBalanced注解的RestTemplate对象了,因为会根据 host 去Consul查找服务提供者,这样就会抛异常 :No instances available for  XXX  ,也就是找不到指定的服务ID

原因:"服务地址:" + serviceInstance.getUri()这儿出现了问题。

即:

  1. LoadBalancerClient进行手动的http请求;Ribbon集成了Apache HttpClient OkHttp请求客户端使用;
    我们不使用ribbon的时候,使用serviceInstance.getUri()访问是没问题的。
    但是,当我们集成Ribbon后,就不行了。
  2.  
  3. 辅助信息:

打印的信息:

服务地址:http://maq.xxxx.com:8802
服务名称:spring-cloud-consul-producer

serviceInstance对象信息:RibbonServer{serviceId='spring-cloud-consul-producer', server=maq.xxxx.com:8802, secure=false, metadata={secure=false}}

  1. /**
  2. * Creates a URI from the given ServiceInstance's host:port.
  3. * @param instance the ServiceInstance.
  4. * @return URI of the form (secure)?https:http + "host:port".
  5. */
  6. public static URI getUri(ServiceInstance instance) {
  7. String scheme = (instance.isSecure()) ? "https" : "http"; //http
  8. String uri = String.format("%s://%s:%s", scheme, instance.getHost(), //host:maq.xxxx.com
  9. instance.getPort());
  10. return URI.create(uri);
  11. }

我们访问的:http://maq.xxxx.com:8802

  1. 主要原因:LoadBalancerClient进行手动的http请求;Ribbon集成了Apache HttpClient OkHttp请求客户端使用;

解决办法1:

在application.properties文件中加如下配置:

  1. ribbon.okhttp.enabled= true
  2. ribbon.restclient.enabled= true

解决办法二:

指定访问的http://serviceId/path  (多个服务配置相同的spring.application.name=serviceId)

  1. @RequestMapping("/getPathParam1/{user}")
  2. public String getPathParam2(@PathVariable("user") String username){
  3. ServiceInstance serviceInstance = loadBalancerClient.choose("service-producer");
  4. System.out.println("服务地址:" + serviceInstance.getUri());
  5. System.out.println("服务名称:" + serviceInstance.getServiceId());
  6.  
  7. String paramServiceResult = restTemplate.getForObject("http://" + serviceInstance.getServiceId().toString() + "/hello1/{user}", String.class,username);
  8. //String paramServiceResult = restTemplate.getForObject("http://spring-cloud-consul-producer/hello1/{user}", String.class,username);
  9. System.out.println(paramServiceResult);
  10. return paramServiceResult;
  11. }

参考链接:https://www.cnblogs.com/XingXiaoMeng/p/10958644.html

Ribbon整合Consul,出现No instances available for XXX 异常的更多相关文章

  1. Ribbon整合Eureka,出现 No instances available for XXX 异常

    请观察这里的片段有没有问题? @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } ...

  2. springcloud报错-Ribbon整合Eureka,出现 No instances available for XXX 异常

    RestTemplate注入有问题 新版的需要这样注入: @Bean @LoadBalanced RestOperations restTemplate(RestTemplateBuilder bui ...

  3. spring boot2X整合Consul一使用RestTemplate实现服务调用

    Consul可以用于实现分布式系统的服务发现与配置 服务调用有两种方式: A.使用RestTemplate 进行服务调用 负载均衡——通过Ribbon注解RestTemplate B.使用Feign ...

  4. 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)

    AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...

  5. Spring Cloud2.0之整合Consul作为注册中心

    使用Consul来替换Eureka Consul简介 Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发. 它具有很多优点.包括: 基于 raft ...

  6. 基于WPF系统框架设计(4)-Ribbon整合Avalondock 2.0实现多文档界面设计(一)

    前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多. MVVM模式和 ...

  7. spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?

    Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...

  8. spring boot2X整合Consul一服务注册与发现

    Consul 是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 关键特性: 服务注册/发现 数据强一致性保证 多数据中心 健康检查 key/value存储 1.下载 htt ...

  9. Spring Cloud Ribbon 整合 Hystrix

    在前面随笔 Spring Cloud 之 Ribbon 的ribbon工程基础上进行改造 1.pom.xml 加入依赖 <dependency> <groupId>org.sp ...

随机推荐

  1. 13.sqoop的安装

      上传sqoop压缩包,并解压 给sqoop一个软链接 给sqoop配置环境变量 #sqoop export SQOOP_HOME=/opt/modules/sqoop export PATH=$P ...

  2. FZU2275 Game(kmp

    暑假wa的题了,,,看见vj的attempt痕迹打算挨个补了,简单kmp题,判断bob的串是不是全为0或者是alice的字串就好了 #include<algorithm> #include ...

  3. X-UA-Compatibles

    今天在看京东网页代码的时候,发现了X-UA-Compatibles 这个元信息属性,不是很清楚,百度了一下,做下记录 X-UA-Compatible 属性是 IE 浏览器在 IE8 版本开始提供的一个 ...

  4. 老贾的幸福生活day6 整型和布尔值的转换 字符串讲解 for 循环简介

    整型和布尔值的转换: 整型: python 2 整型 int long(长整型) /获取的是整型 python 3 整型 int 获取的是浮点数(小数) 十进制转二进制: print(bin(36)) ...

  5. 拨开Python迷雾

    Python方向及能力要求   web就业方向:Python基础.Python高级.前端开发. web开发爬虫方向:Python基础.Python高级.前端开发.web开发. 爬虫开发数据挖掘/分析方 ...

  6. java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行. 2 ...

  7. C语言中signed和unsigned理解

    一直在学java,今天开始研究ACM的算法题,需要用到C语言,发现好多知识点都不清楚了,看来以后要多多总结~ signed意思为有符号的,也就是第一个位代表正负,剩余的代表大小,例如:signed i ...

  8. 【原创】大叔经验分享(57)hue启动coordinator时报错

    hue启动coordinator时报错,页面返回undefinied错误框: 后台日志报错: runcpserver.log [13/May/2019 04:34:55 -0700] middlewa ...

  9. B-Tree和 B+Tree的数据存储结构

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  10. Java并发编程——线程的基本概念和创建

    一.线程的基本概念: 1.什么是进程.什么是是线程.多线程? 进程:一个正在运行的程序(程序进入内存运行就变成了一个进程).比如QQ程序就是一个进程. 线程:线程是进程中的一个执行单元,负责当前进程中 ...