springcloud本地调试feign调用出现的诡异404问题及解决

 更新时间:2022年03月09日 11:59:41   作者:差不多程序员  
这篇文章主要介绍了springcloud本地调试feign调用出现的诡异404问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

本地调试feign调用出现的诡异404问题

问题产生

最近在给公司准备做分布式事务框架seata的调研,准备搭建一套demo,根据阿里云官网的案例,我准备搭建一套微服务架子,分别含有business、order、storage三个微服务组成,其中第一个微服务实现业务聚合,调用后面两个微服务,后面两个微服务只需要暴露接口,操作相关的数据库,我再利用seata来做分布式的场景演示!

技术框架

SpringCloud eureka mybatis-plus feign ribbon seata

核心代码

business调用方,在一个接口中通过feign调用其他2个服务

package com.blue.seata.business.service;
import com.blue.seata.order.api.remote.RemoteOrderService;
import com.blue.seata.storage.api.remote.RemoteStorageService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author liulei
 * @version 1.0
 */
@Service
public class BusinessService {
    private static final Logger logger = LoggerFactory.getLogger(BusinessService.class);
    @Autowired
    RemoteOrderService orderService;
    @Autowired
    RemoteStorageService storageService;
    public boolean buy(String userId, String code, Integer count) throws InterruptedException {
        logger.info("用户购买商品[{}],[{}]", code, count);
        orderService.create(userId, code, count);
        logger.info("调用订单中心服务成功");
        Thread.sleep(2000);
        storageService.minus(code, count);
        logger.info("调用库存中心服务成功");
        return true;
    }
}

Eureka客户端配置,我使用的是网上公益注册中心

eureka:
  instance:
    prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
  client:
    service-url:
      defaultZone: http://eurekdsa.springclouddsds.cn/edsdureka/
    registry-fetch-interval-seconds: 5

诡异的404

问题描述:在保证Feign接口暴露的配置没有错误的前提下【一定没问题】,我使用postman调用business的测试接口,第一次调用成功,但是再点击同样的接口,出现了以下报错,我贴一下postman

第一次:

第二次:

心态

很绝望,但是没办法,还是得埋头进去看看是哪个错误,看控制台的错误提示,发现这个地方对于服务最终解析的URL与我预期有出入

business中,第二次再调用接口的时候出现的,为什么是个问题,我解释一下,我的business端口是6000,order端口是7000,storage是8000,大家反应过来没有,这块解析出来的order接口调用怎么都不应该是8000的端口,很明显,解析出了问题,也就是说Feign解析出问题了,再往下想,Feign的组成由Ribbon+HttpClient组成,即服务路由+http访问两部分组件组成,这样,我就基本可以确定,Ribbon的配置,出了问题,很遗憾我自己没有解决,而且花费了大量时间去查询资料,但是没有一个匹配上,大多说的都是常规配置,比如context-path,和consume、produce等格式配置的问题,最后问了一个小伙伴,他就调整了我business服务一个地方的代码,看图

小结:

我到现在都不知道@RibbonClient这个注解,小伙伴解释说这是服务级别的负载均衡,而注入Bean的方式的负载是全局负载,这可能和我本地的调试环境有关系,我再描述一下我的测试环境:

1.本地三个服务,基本上代码都一样,使用同一个Eureka注册中心

2.Ribbon和Feign的代码符合日常咱们开发所见的代码

3.自己近期状态不好,过分相信百度,各种尝试,发现问题定位的太晚,找到问题也不知道如何去描述,尴尬

4.关于这一块的解释,我后续需要翻阅资料才能给出,抱歉啦!

springcloud在本地调试的踩坑记录

1、在本地调试的时候

可以专门配置一个application-local.yml。这个yml只在本地调试的时候使用。我觉得这个还是很有必要的,可以只在本地保存,不提交到Git。

2、修改配置文件中关于eureka的配置

之前自己一直没有注意到这个问题,导致在服务本地运行起来之后,一直不能再eureka的控制台看到本地的服务。后来才注意到时自己没有修改eureka中关于instance_id的配置。由于运行了两个相同id的服务,所以会冲突。解决的办法可以在eureka的instant_id的配置后面添加:{random.value},通过添加随机数使得服务可以注册两次。

3、还是关于eureka的配置

在本地服务调用其他服务的时候,我发现一直是报超时的。看了后台服务的运行情况,用postman试一试,用swagger试一试,结果都没有超时,我一度以为是我的网络有问题。后来突然想到服务的eureka配置。

我们的配置文件是这样的:

prefer-ip-address: true
ip-address: 1**.***.***.49 # 访问的路径变为IP地址

上面代码中的ip是阿里云的内网地址,外部是无法直接访问的,于是我把第二行代码注释掉,换成相应的外网地址。问题就这样解决了。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java同步器AQS架构AbstractQueuedSynchronizer原理解析下

    java同步器AQS架构AbstractQueuedSynchronizer原理解析下

    这篇文章主要为大家介绍了java同步器AQS架构AbstractQueuedSynchronizer原理解析下,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 图解JVM内存模型

    图解JVM内存模型

    这篇文章主要介绍了JVM内存模型的相关资料,帮助大家更好的理解和学习Java虚拟机,感兴趣的朋友可以了解详细
    2020-10-10
  • BlockingQueue队列处理高并发下的日志

    BlockingQueue队列处理高并发下的日志

    这篇文章主要介绍了BlockingQueue队列处理高并发下的日志示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • SpringBoot实现发送QQ邮件的示例代码

    SpringBoot实现发送QQ邮件的示例代码

    这篇文章主要介绍了SpringBoot如何实现发送QQ邮件功能,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • java  基础知识之IO总结

    java 基础知识之IO总结

    这篇文章主要介绍了java 基础知识之IO总结的相关资料,Java中的I/O分为两种类型,一种是顺序读取,一种是随机读取,需要的朋友可以参考下
    2017-03-03
  • 使用JPA双向多对多关联关系@ManyToMany

    使用JPA双向多对多关联关系@ManyToMany

    这篇文章主要介绍了使用JPA双向多对多关联关系@ManyToMany,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringBoot集成内存数据库hsqldb的实践

    SpringBoot集成内存数据库hsqldb的实践

    hsqldb只需要添加对应的依赖,然后在配置文件进行配置。不需要安装一个数据库,本文就来介绍一下具体使用,感兴趣的可以了解一下
    2021-09-09
  • 深入学习Hibernate持久化对象的三个状态

    深入学习Hibernate持久化对象的三个状态

    Hibernate中的对象有3中状态,瞬时对象(TransientObjects)、持久化对象(PersistentObjects)和离线对象(DetachedObjects也叫做脱管对象),下面通过本文给大家分享Hibernate持久化对象的三个状态,一起看看吧
    2017-09-09
  • 一文吃透消息队列RocketMQ实现消费幂等原理

    一文吃透消息队列RocketMQ实现消费幂等原理

    这篇文章主要介绍了消息队列RocketMQ实现消费幂等的全面讲解,帮助大家吃透RocketMQ消息队列消费幂等,更好的的应用与工作实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Java如何取掉json数据中值为null的属性字段

    Java如何取掉json数据中值为null的属性字段

    这篇文章主要介绍了Java如何取掉json数据中值为null的属性字段,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论