feign动态调用服务、路径
业务:同一个服务,需要部署在两台服务器上,连的是同一个nacos,现需要根据配置,将数据存储在各自服务器上,所以我们需要将其中一个服务改个服务名和路径部署,需要在业务上就判断他是存在属于哪个服务上的,才能去调用那个服务的feign接口。重新再放个feign接口也不动态,万一后面又加了很多个服务,又要改代码,所以我们的解决办法就是动态服务名和路径。
我们都知道feign调用的时候路径是
http://服务名/路径
/
所以我们如果要动态的调用,就需要替换服务名和路径。
1、新增替换url的配置
就是把有//
替换成我们自己替换成http://
@Configurationpublic class DynamicRoutingConfig {@Beanpublic RequestInterceptor cloudContextInterceptor() {return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate template) {String url = template.url();if (url.startsWith("//")) {url = "http:" + url;template.target(url);template.uri("");}}};}}
2、feign接口修改
使用@PathVariable
注解把我们的参数传到路径上,
这个注解是双向的,直接路径上拼接,我们的参数可以获取到路径上的值
我们参数上给值,他也能拼接到路径上。
@PostMapping(value = "//{serviceName}/{contextPath}/electronicPoliceIllegalPark/saveOrUpdateByPath")void save(@PathVariable(name = "serviceName")String serviceName, @PathVariable(name = "contextPath") String contextPath, @RequestBody ElectronicPoliceIllegalParkDTO illegalParkDTO);
这样再配合我们配置,就可以把带有 // 的替换成http://我们自己传的服务名/路径
3、测试
传入服务名和路径
调用,此时的路径就是我们自己传的了