Ribbon整合Consul,出现No instances available for XXX 异常
先贴代码:
@RestController
public class CallHelloController {
@Autowired
private LoadBalancerClient loadBalancerClient; @Autowired
private RestTemplate restTemplate;
@RequestMapping("/call")
public String call(){
ServiceInstance serviceInstance = loadBalancerClient.choose("service-producer");
System.out.println("服务地址:" + serviceInstance.getUri());
System.out.println("服务名称:" + serviceInstance.getServiceId()); String callServiceResult = restTemplate.getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
System.out.println(callServiceResult);
return callServiceResult;
}
@SpringBootApplication
@EnableDiscoveryClient //单纯的消费(不对外提供服务)可以不注册
@RibbonClient(name = "service-producer", configuration = RibbonConfig.class)
@ComponentScan(excludeFilters =
{@ComponentScan.Filter(type= FilterType.ANNOTATION, value=ExcludeFromComponentScan.class)}
)
public class SpringCloudConsulConsumerApplication { public static void main(String[] args) {
SpringApplication.run(SpringCloudConsulConsumerApplication.class, args);
} @Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
application.properties
spring.application.name=spring-cloud-consul-producer
server.port=8802
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
#注册到consul的服务名称
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()这儿出现了问题。
即:
LoadBalancerClient进行手动的http请求;Ribbon集成了Apache HttpClient 、 OkHttp请求客户端使用;
我们不使用ribbon的时候,使用serviceInstance.getUri()访问是没问题的。
但是,当我们集成Ribbon后,就不行了。 辅助信息:
打印的信息:
服务地址: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}}
/**
* Creates a URI from the given ServiceInstance's host:port.
* @param instance the ServiceInstance.
* @return URI of the form (secure)?https:http + "host:port".
*/
public static URI getUri(ServiceInstance instance) {
String scheme = (instance.isSecure()) ? "https" : "http"; //http
String uri = String.format("%s://%s:%s", scheme, instance.getHost(), //host:maq.xxxx.com
instance.getPort());
return URI.create(uri);
}
我们访问的:http://maq.xxxx.com:8802
主要原因:LoadBalancerClient进行手动的http请求;Ribbon集成了Apache HttpClient 、 OkHttp请求客户端使用;
解决办法1:
在application.properties文件中加如下配置:
ribbon.okhttp.enabled= true
ribbon.restclient.enabled= true
解决办法二:
指定访问的http://serviceId/path (多个服务配置相同的spring.application.name=serviceId)
@RequestMapping("/getPathParam1/{user}")
public String getPathParam2(@PathVariable("user") String username){
ServiceInstance serviceInstance = loadBalancerClient.choose("service-producer");
System.out.println("服务地址:" + serviceInstance.getUri());
System.out.println("服务名称:" + serviceInstance.getServiceId()); String paramServiceResult = restTemplate.getForObject("http://" + serviceInstance.getServiceId().toString() + "/hello1/{user}", String.class,username);
//String paramServiceResult = restTemplate.getForObject("http://spring-cloud-consul-producer/hello1/{user}", String.class,username);
System.out.println(paramServiceResult);
return paramServiceResult;
}
参考链接:https://www.cnblogs.com/XingXiaoMeng/p/10958644.html
Ribbon整合Consul,出现No instances available for XXX 异常的更多相关文章
- Ribbon整合Eureka,出现 No instances available for XXX 异常
请观察这里的片段有没有问题? @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } ...
- springcloud报错-Ribbon整合Eureka,出现 No instances available for XXX 异常
RestTemplate注入有问题 新版的需要这样注入: @Bean @LoadBalanced RestOperations restTemplate(RestTemplateBuilder bui ...
- spring boot2X整合Consul一使用RestTemplate实现服务调用
Consul可以用于实现分布式系统的服务发现与配置 服务调用有两种方式: A.使用RestTemplate 进行服务调用 负载均衡——通过Ribbon注解RestTemplate B.使用Feign ...
- 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)
AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...
- Spring Cloud2.0之整合Consul作为注册中心
使用Consul来替换Eureka Consul简介 Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发. 它具有很多优点.包括: 基于 raft ...
- 基于WPF系统框架设计(4)-Ribbon整合Avalondock 2.0实现多文档界面设计(一)
前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多. MVVM模式和 ...
- spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?
Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...
- spring boot2X整合Consul一服务注册与发现
Consul 是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 关键特性: 服务注册/发现 数据强一致性保证 多数据中心 健康检查 key/value存储 1.下载 htt ...
- Spring Cloud Ribbon 整合 Hystrix
在前面随笔 Spring Cloud 之 Ribbon 的ribbon工程基础上进行改造 1.pom.xml 加入依赖 <dependency> <groupId>org.sp ...
随机推荐
- 使用Minikube运行一个本地单节点Kubernetes集群(阿里云)
使用Minikube运行一个本地单节点Kubernetes集群中使用谷歌官方镜像由于某些原因导致镜像拉取失败以及很多人并没有代理无法开展相关实验. 因此本文使用阿里云提供的修改版Minikube创建一 ...
- redis 命令 setbit、bitcount、getbit、bitop
1.SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit). 在redis中,存储的字符串都是以二级制的进行存在的. 举例: 设置一个 ke ...
- Spring 的 Bean 管理(XML 方式)
Spring 的 Bean 管理(XML 方式) 1. 三种实例化 Bean 的方式 使用类构造器实例化(默认无参数) 使用静态工厂方法实例化(简单工厂模式) 使用实例工厂方法实例化(工厂方法模式) ...
- C#求1-100的质数,100-1000的水仙花数,1-100所有的平方和平方平方根
//你们的鼓励是我最大的动力 大家可以多留言评论 在接下来很长一段时间我会从初级到高级每天更新 大家有想学习的内容也可以留言哦 //现在是我做C#老师的第28天,希望和大家一起努力 加油 using ...
- 09 Python之IO多路复用
四种常见IO模型 阻塞IO(blocking IO).非阻塞IO(nonblocking IO).IO多路复用(IOmultiplexing).异步IO(asynchronous IO) IO发生时涉 ...
- javascript的特点这些
javascript的特点(1)用于解释性执行的脚本语言.与其他脚本语言一样,JavaScript也是一种解释性语言,它提供了非常方便的开发过程.JavaScript的基本语法结构与C.C++.Jav ...
- vscode快捷操作
Ctrl + ` 打开或关闭终端 Ctrl + Shift + n 打开或关闭新窗口 Ctrl + Shift + f 打开视图,显示编辑器左侧 ...
- es6函数扩展(+ ...扩展运算符)
1.参数默认值 function foo(param = 'nihao'){ console.log(param); } foo('hello kitty'); 2.参数解构赋值 function f ...
- Scrapy - 第一个爬虫和我的博客
第一个爬虫 这里我用官方文档的第一个例子:爬取http://quotes.toscrape.com来作为我的首个scrapy爬虫,我没有找到scrapy 1.5的中文文档,后续内容有部分是我按照官方文 ...
- vue+ckEditor5
1.安装依赖 "@ckeditor/ckeditor5-build-balloon": "^10.1.0", "@ckeditor/ckeditor5 ...