今天有同事问在浏览器输入http://gateway_host:gateway_port/serviceId/** 格式的url能访问到具体服务,且进入到自定义的gateway过滤器
但是通过feign访问注册到eureka server上的服务时却没有通过自定义的过滤器,是否说明没经过gateway网关?如何做能使feign通过gateway来访问注册到eureka的服务呢?
归结起来就是:consumer调用provider是如何通过feign经过网关调用的。

其实很简单:
只要在provider端提供的feign接口暴露的接口@FeignClient指定value,值为eureka中网关的Application应用名microservice-gateway,此时consumer请求不会直接到provider,而会经过gateway网关。

provider端feign接口相关代码:

@FeignClient(value = "microservice-gateway", fallback = WxtServiceHystrix.class)
public interface IWxtService {
    
    @PostMapping("/wxt/v1/queryStaffStatus")
	BaseRespVo<StaffStatusResqVo> queryStaffStatus(@RequestBody @Valid BaseReqVo<StaffStatusReqVo> parame);
}

consumer端调用相关代码:

@RestController
public class ConfigAction {


	@Autowired
	IWxtService wxtService;

	@GetMapping("/querywxt")
	public BaseRespVo<StaffStatusResqVo> querywxt() {
		BaseReqVo<StaffStatusReqVo> baseReqVo = new BaseReqVo<>();
		.......
		baseReqVo.setData(data);
		return wxtService.queryStaffStatus(baseReqVo);
	}

注意启动类,需要添加注解:@EnableFeignClients(basePackages = "com.uaf.k3.feign")
必须指定@EnbaleFeignClients的basePackages属性才行。否则可能会出现找不到类问题。

Field xxx in xxx required a bean of type 'com.wxt.feign.IWxtService' that could not be found.

欢迎关注公众号: 编码是个技术活

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐