工作纪实_13-SpringCloud本地调试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.关于这一块的解释,我后续需要翻阅资料才能给出,抱歉啦!
上一篇: Java反编译工具jd-gui的eclipse插件安装和使用
下一篇: ajoo JRC