• No instances available for IP


    java.lang.IllegalStateException: No instances available for 10.114.10.121
     org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient.execute(BlockingLoadBalancerClient.java:84) ~[spring-cloud-loadbalancer-3.1.1.jar:3.1.1]
     org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:56) ~[spring-cloud-commons-3.1.1.jar:3.1.1]
     org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:93) ~[spring-web-5.3.15.jar:5.3.15]
     org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:77) org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) 
    org.springframework.web.client.CheckTokenRestTemplate.doExecute(CheckTokenRestTemplate.java:776) 
    org.springframework.web.client.CheckTokenRestTemplate.exchange(CheckTokenRestTemplate.java:660) 

     (BlockingLoadBalancerClient.java:84)   

    1. // 这个http访问时进行了进一步的实现,会通过 注册中心的 服务名称寻找对应的 微服务,通过服务名称进行调用,我在这里配置IP之后,它那这个IP不能找到对应的服务实例,就报错了。
    2. @Override
    3. public ServiceInstance choose(String serviceId, Request request) {
    4. ReactiveLoadBalancer loadBalancer = loadBalancerClientFactory.getInstance(serviceId);
    5. if (loadBalancer == null) {
    6. return null;
    7. }
    8. Response loadBalancerResponse = Mono.from(loadBalancer.choose(request)).block();
    9. if (loadBalancerResponse == null) {
    10. return null;
    11. }
    12. return loadBalancerResponse.getServer();
    13. }

    处理,排除jia,这个jar对微服务的请求进行的进一步的实现,导致不可通过ip直接访问注册中心的服务接口

    1. org.springframework.cloud
    2. spring-cloud-starter-loadbalancer

    情形2:

    SpringCloud调用RestTemplate报错:No instances available for

    1. java.lang.IllegalStateException: No instances available for www.baidu.com
    2. at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:89)
    3. at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:55)
    4. at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:92)
    5. at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:76)
    6. at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
    7. at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
    8. at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:723)
    9. at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:698)
    10. at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:350)
    11. at Test.error(Test.java:26)
    12. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    13. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    14. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    15. at java.lang.reflect.Method.invoke(Method.java:497)
    16. at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    17. at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    18. at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    19. at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

    原因:

    使用了Ribbon进行负载均衡

    1. @Bean
    2. @LoadBalanced // 负载均衡 必须使用注册中心上的服务名 不能用ip或域名
    3. @ConditionalOnMissingBean({RestTemplate.class})
    4. public RestTemplate restTemplate() {
    5. return new RestTemplate();
    6. }

    原理:

    1. @Override
    2. public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {
    3. ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
    4. Server server = getServer(loadBalancer);// 这里会获取服务名 因为我们是IP或域名访问 所以找不到server 抛异常
    5. if (server == null) {
    6. throw new IllegalStateException("No instances available for " + serviceId);
    7. }
    8. RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server,
    9. serviceId), serverIntrospector(serviceId).getMetadata(server));
    10. return execute(serviceId, ribbonServer, request);
    11. }

    因为ribbon的作用是负载均衡,那么你直接使用ip地址,那么就无法起到负载均衡的作用,因为每次都是调用同一个服务,当你使用的是服务名称的时候,他会根据自己的算法去选择具有该服务名称的服务。
    链接:http://events.jianshu.io/p/2b50393de3a3

  • 相关阅读:
    【python】len()、str()、int()和float()函数
    C++手撕红黑树
    Redis 安装和启动
    Android 13 - Media框架(9)- NuPlayer::Decoder
    Ubuntu 20.04 LTS 安装Kubernetes 1.26
    【ACWing】3531. 哈夫曼树
    机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别
    网络面试一百问<待整理>
    京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!
    (17)Verilog实现二进制格雷码互转
  • 原文地址:https://blog.csdn.net/weixin_43870064/article/details/126851687