微服务feign.RetryableException: Load balancer does not contain an instance for the service解决方案

54 篇文章 2 订阅
13 篇文章 0 订阅

全程只有图,文字很少描述!

遇到的问题~feign.RetryableException: connect timed out executing POST http://xxx ........ Load balancer does not contain an instance for the service

依赖的版本~

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
              <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

环境配置

运行环境--win10 
Ide--->>Idea 2019
springboot 2.6.6
 jdk版本 11
 测试工具 postman,用浏览器也可以

昨天搜的解决方案~说什么可能是版本的问题,这里我也没有尝试换版本,而是坚持采用最新版本;

晚上睡觉前终于想通了,画图来阐述一下
在这里插入图片描述这里解析一下背后的逻辑在这里插入图片描述
注意的地方----hostname那里写服务提供者的地址,不写那么就要在本机里修改host,考虑到分布式又不是部署在一个机器上,所以最好还是写;

放上部分代码以供参考~
首先是 服务提供者~

package com.gavin.repository.service.impl;

import com.gavin.enity.OrderInfo;
import com.gavin.repository.pojo.wfwOrderInfo;
import com.gavin.repository.wfwOrderInfoRepository;
import com.gavin.repository.service.wfwOrderInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Description: UP up UP
 * @author: Gavin
 * @date:2022/4/5 10:31
 */

@Service
public class wfwOrderInfoServiceImpl implements wfwOrderInfoService {

    @Autowired
   private wfwOrderInfoRepository wfwOrderInfoRepository;

    /**
     *
     * @param orderInfo   从commons传来的参数
     * @return
     */
    @Override
    public int createOrder(OrderInfo orderInfo) {
//        有可能传参的时候出错
        if (orderInfo==null){
            return -1;
        }
        wfwOrderInfo wfwOrderInfo = new wfwOrderInfo();
        wfwOrderInfo save =null;
        try {
            wfwOrderInfo.setNumber(orderInfo.getNumber());
            wfwOrderInfo.setPrice(orderInfo.getPrice());
//又可能save的时候出错
           save= wfwOrderInfoRepository.save(wfwOrderInfo);
        }
        catch(Exception ex){

            System.out.println(ex.getMessage());
            return -1;
        }
        return save.getOid();
    }
}

配置文件

server:
  port: 8001
spring:
  application:
    name: gavin-order-client
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://172.23.141.26:3306/gavin
    username: gavin
    password: 955945
    druid:
      db-type: mysql
    type: com.alibaba.druid.pool.DruidDataSource
eureka:
  instance:
    hostname: 192.168.135.1  #实例名
  client:
    service-url:
      defaultZone: http://192.168.135.1:7000/eureka  #eureka 地址
    register-with-eureka: true
    fetch-registry: true

远程调用接口~

/**
 * @FeignClient(name ="gavin-order-client" )调用的哪一个服务
 * <p>
 * eureka:
 * instance:
 * hostname: gavin-order-client  #这是服务提供者中被调用的服务名
 */

@Service
@FeignClient(value="gavin-order-client" /*,url = "localhost:8001"*/)
//@LoadBalancerClient(name = "mail-service", configuration = LoadBalancerConfiguration.class)
public interface OrderFeignClient {


    /**
     * @param orderInfo
     * @return
     * @PostMapping("/order/add") 是被调用者中控制器的路径
     */
    @PostMapping("/order/add")
    String add(OrderInfo orderInfo);


//    远程调用
    @PostMapping("/order/addOrderInfo")
    OrderInfo addOrder(@RequestBody  OrderInfo orderInfo);


}

服务调用配置~
这里还配置了负载均衡

server:
  port: 8200
spring:
  application:
    name: gavin-eurake-server

eureka:
  instance:
    hostname: gavin-eurake-server  #实例名
  client:
    service-url:
      defaultZone: http://192.168.135.1:7000/eureka  #eureka 地址
    register-with-eureka: false
    fetch-registry: true
gavin-order-client:
  ribbon:

    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置规则 随机
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
    #    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
    #    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
   # NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
    ConnectTimeout: 500 #请求连接超时时间
    ReadTimeout: 1000 #请求处理的超时时间
    OkToRetryOnAllOperations: true #对所有请求都进行重试
    MaxAutoRetriesNextServer: 2 #切换实例的重试次数
    MaxAutoRetries: 1 #对当前实例的重试次数

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这个错误通常是由于 Feign 客户端无法找到可用的服务实例导致的。下面是一些可能的解决方案: 1. 检查服务实例是否可用:确保 `account-voucher` 服务实例正在运行,并且已经成功注册到服务注册中心(如 Eureka、Consul 等)。可以通过访问服务实例的健康检查端点或者直接访问服务接口来验证服务是否可用。 2. 检查服务名称是否正确:确保 Feign 客户端中指定的服务名称与注册中心中的名称一致。如果服务名称不正确,Feign 客户端将无法找到对应的服务实例。 3. 检查负载均衡配置:如果使用了负载均衡器(如 Ribbon),请确保配置正确,并且已经指定了要负载均衡的服务。可以检查 Ribbon 的配置文件或者相关的注解配置。 4. 检查网络连接:确保应用程序能够与 `account-voucher` 服务进行正常的网络通信。可以尝试使用 `ping` 命令或者其他网络诊断工具检查网络连接是否正常。 5. 检查 Feign 客户端配置:检查 Feign 客户端的配置文件,确保没有配置错误。可以检查 Feign 的超时时间、重试次数等配置。 如果以上步骤都没有解决问题,可以尝试以下调试步骤: 1. 查看服务注册中心:检查服务注册中心中是否有 `account-voucher` 的实例注册成功。 2. 查看 Feign 客户端的日志:启用 Feign 客户端的详细日志输出,查看是否有其他错误信息或异常栈轨迹。 3. 使用其他方式进行调用:尝试直接使用 RestTemplate 或其他方式调用 `account-voucher` 服务,看是否能够成功连接。 希望这些解决方案能够帮助你解决问题!如果还有其他疑问,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeMartain

祝:生活蒸蒸日上!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值