feign动态服务名、路径(亲测可用)
业务:同一个服务,需要部署在两台服务器上,连的是同一个nacos,现需要根据配置,将数据存储在各自服务器上,所以我们需要将其中一个服务改个服务名和路径部署,需要在业务上就判断他是存在属于哪个服务上的,才能去调用那个服务的feign接口。重新再放个feign接口也不动态,万一后面又加了很多个服务,又要改代码,所以我们的解决办法就是动态服务名和路径。我们都知道feign调用的时候路径是http://服
·
业务:同一个服务,需要部署在两台服务器上,连的是同一个nacos,现需要根据配置,将数据存储在各自服务器上,所以我们需要将其中一个服务改个服务名和路径部署,需要在业务上就判断他是存在属于哪个服务上的,才能去调用那个服务的feign接口。重新再放个feign接口也不动态,万一后面又加了很多个服务,又要改代码,所以我们的解决办法就是动态服务名和路径。
我们都知道feign调用的时候路径是
http://服务名/路径
/
所以我们如果要动态的调用,就需要替换服务名和路径。
1、新增替换url的配置
就是把有//
替换成我们自己替换成http://
package org.jeecg.config;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import feign.Target;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.*;
import java.util.stream.Collectors;
@Configuration
public class DynamicRoutingConfig {
@Bean
public RequestInterceptor cloudContextInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
String url = template.url();
if (url.startsWith("//")) {
url = "http:" + url;
/**
* ---------------------------------解释,解释可能不是很清楚,自己断点看下路径是怎么变化的---------------------------------------------
* 有带问号的url时, 这里需要截取url参数,
* 不然调用了template.target方法,已经给了参数了, 如 get http://test?param=1
* 再调用template.uri("")又给了一次,会变成传一个参数,接收成两个的问题 变成 http://test?param=1¶m=1
* 不调用template.uri(""),uri会变成 http://test//test?param=1,所以我们需要把uri置空, 变成http://?param=1,最终变成我们正常的url http://test?param=1
*/
if (url.contains("?")) {
url = subUrl(url);
}
template.target(url); // 将拼好的路径作为我们的url,(要截取?号后面的,因为下面方法已经给了)
template.uri(""); // 这里需要把uri置空,不置空会变成两个, http://test//test?param=1
}
}
};
}
public static String subUrl(String url) {
// String url = "http://traffic-police-illegal-data-non/illegal-data-non/electronicPoliceIllegalPark/queryByhphmAndhpzlAndsbbhAndWfsj?hphm=%E9%97%BDE20&hpzl=02&sbbh=350622220&wfsjDate=2022-03-27";
return url.substring(0,url.indexOf("?"));
}
}
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、测试
传入服务名和路径
调用,此时的路径就是我们自己传的了
更多推荐
已为社区贡献8条内容
所有评论(0)