首页 > 其他分享 >Feign动态定义调用serverName与path

Feign动态定义调用serverName与path

时间:2024-02-19 15:44:05浏览次数:27  
标签:Feign url serverName result template test path TestClient public

Feign动态定义调用serverName与path 查看原文

方案一(DynamicProcessFeign)

1. 定义FeignClient工厂

@Component
public class DynamicProcessFeign<T> {
    /**
     * 缓存feignClient,提高客户端性能
     */
    private static Map<String, Object> processMap = new HashMap<>();

    private final FeignClientBuilder feignClientBuilder;

    public DynamicProcessFeign(@Autowired ApplicationContext appContext) {
        this.feignClientBuilder = new FeignClientBuilder(appContext);
    }

    public T getFeignClient(final Class<T> type, String serviceName, String path) {
        String key = serviceName + path;
        Object api = processMap.get(key);
        if (api != null) {
            return (T) api;
        }
        synchronized (DynamicProcessFeign.class) {
            api = processMap.get(key);
            if (api != null) {
                return (T) api;
            }
            api = this.feignClientBuilder.forType(type, serviceName).path(path).build();
            processMap.put(key, api);
        }
        return (T) api;
    }
}

2. 定义测试接口

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @PostMapping(value = "/test")
    public AjaxResult test(@RequestBody JSONObject object) {
        return AjaxResult.success(object);
    }
}

3. 提供业务feignClient,并定义服务声明接口

@FeignClient(name = "TestClient", contextId = "TestClient")
public interface TestClient {
    @PostMapping(value = "")
    AjaxResult test01(@RequestBody JSONObject object);
}

4. 动态调用

@Slf4j
@RestController
@RequestMapping("/test")
public class TestFeignController {

    @Autowired
    private DynamicProcessFeign dynamicProcessFeign;

    @PostMapping(value = "/test01")
    public AjaxResult test01(@RequestBody JSONObject object) {
        //微服务名称:shine-test-feign,请求路径/test/test
        TestClient testClient = dynamicProcessFeign.getFeignClient(TestClient.class, "shine-test-feign", "/test/test");
        AjaxResult result = testClient.test(object);
        log.info("result:{}", result);
        return result;
    }
}

方案二(FeignInterceptorConfig)

1. 对feignClient中API的URL中定义一个特殊的变量标记

@FeignClient(name = "TestClient", contextId = "TestClient")
public interface TestClient {
    @GetMapping("//$SERVER-NAME//test/test")
    public String test();
}

2. 定义FeignInterceptorConfig

@Data
@Configuration
@ConfigurationProperties(prefix = "feign-interceptor-config")
public class FeignInterceptorConfig {
    
    private Map<String, String> serverMap = new HashMap<>();

    @Bean
    public RequestInterceptor cloudContextInterceptor() {
        return template -> {
            replaceKey(template);
            replaceSlash(template);
        };
    }

    private void replaceKey(RequestTemplate template) {
        String url = template.url();
        for (Map.Entry<String, String> entry : serverMap.entrySet()) {
            String key = entry.getKey();
            if (url.contains(key)) {
                url = url.replace(key, entry.getValue());
                template.uri(url);
            }
        }
    }

    private void replaceSlash(RequestTemplate template) {
        String url = template.url();
        if (url.startsWith("//")) {
            url = "http:" + url;
            //去除地址后面的参数,防止下面重新设置target的时候出现参数重复
            int index = url.indexOf("?");
            if (index > 0) {
                url = url.substring(0, index);
            }
            template.target(url);
            template.uri("");
        }
    }
}

3. 配置文件配置动态映射替换

feign-interceptor-config:
  server-map:
    "[$SERVER-NAME]" : shine-test-feign

4. 动态调用

@Slf4j
@RestController
@RequestMapping("/test")
public class TestFeignController {

    @PostMapping(value = "/test02")
    public AjaxResult test02(@RequestBody JSONObject object) {
        AjaxResult result = testClient.test02(object);
        log.info("result:{}", result);
        return result;
    }
}

方案三(@PathVariable)

1. 在对feignClient中API定义

@FeignClient(name = "TestClient", contextId = "TestClient")
public interface TestClient {
    
    @PostMapping(value = "//{serviceName}/{contextPath}")
    AjaxResult test(@PathVariable(name = "serviceName") String serviceName, @PathVariable(name = "contextPath") String contextPath, @RequestBody JSONObject object);
}

2. 定义FeignInterceptorConfig

同方案二

3.动态调用

@Slf4j
@RestController
@RequestMapping("/test")
public class TestFeignController {

    @PostMapping(value = "/test03")
    public AjaxResult test03(@RequestBody JSONObject object) {
        AjaxResult result = testClient.test03("shine-test-feign", "/test/test", object);
        log.info("result:{}", result);
        return result;
    }
}

标签:Feign,url,serverName,result,template,test,path,TestClient,public
From: https://www.cnblogs.com/My-Sun-Shine/p/18021267

相关文章

  • Blazor WebApp配置应用基路径PathBase
    BlazorWebApp配置应用基路径PathBase在一个设备数据管理软件系统中,根据生命周期和应用场景不同,可能会划分几个独立的软件子项目。在部署到的时候,可以采用不同的端口号来访问不同的软件子项目,也可以采用统一的端口号和不同的应用基路径来访问不同的软件子项目。基本实现方案:1,......
  • SHGetSpecialFolderPath(NULL, path, CSIDL_PROGRAM_FILES_COMMONX86, 0)
    CStringstr;TCHARpath[MAX_PATH];BOOLb=SHGetSpecialFolderPath(NULL,path,CSIDL_PROGRAM_FILES_COMMONX86,0);//获取指定的系统路径/*参数1:HWNDhwndOwner窗口所有者的句柄。可以NULL参数2:LPTSTRlpszPath返回路径的缓冲区,该缓冲区的大......
  • LD_LIBRARY_PATH和LIBRARY_PATH的区别
    LD_LIBRARY_PATH和LIBRARY_PATH在Linux系统中都是与动态链接库查找路径相关的环境变量,它们的主要区别在于使用阶段和作用:LIBRARY_PATH:作用于程序编译阶段,告诉编译器(如gcc)在编译时寻找动态链接库(.so文件)的附加搜索路径。当编译一个程序,并且该程序依赖于某些非标准路径下......
  • POJ--3764 The xor-longest Path(Trie)
    记录13:562024-2-10找到俩个点,获得最大的边权异或值。利用异或的性质,一个值被异或俩次相当于没有异或即axorbxorb=a所以先从顶点出发,获得每个点路径上的异或值,然后对这俩个值进行异或就获得了他们之间路径的异或值。获取从顶点到每个点路径上的异或值后,可以利用trie来......
  • OpenFeign框架相关
    OpenFeign是什么?OpenFeign是一个声明式的WebService客户端。使用OpenFeign能让编写WebService客户端更加简单。使用时只需定义服务接口,然后在上面添加注解。OpenFeign也支持可拔插式的编码和解码器。springcloud对feign进行了封装,使其支持MVC注解和HttpMessageConverts。和eur......
  • 微信小程序 Path2D 不支持 svg 路径的解决办法
    问题开发一个微信小程序项目的时候需要用到Path2D这个对象,但是发现小程序的Path2D对象不支持实例化的时候直接传入'svgpath',导致下面的代码运行的时候报错(浏览器中可运行)#其它代码(省略)...//核心代码letp=newPath2D("M1010h80v80h-80Z");//微信小程序中会......
  • SpringCloud工程添加openfeign使用服务之间调用
    SpringCloud服务之间的调用可以采用openfeign,今天这里就简单记录下需要做的步骤。前置条件就是微服务都建好了,并且两个服务都注册到nacos上,这里用两个微服务模块。简单描述:请求A模块,然后去调用B模块数据,最后从A模块接口返回。需要在A模块添加openfeign的依赖和service写好接口,B......
  • 四、SpringCloud alibaba 之 OpenFeign
    4.1、调用过程的演化JAVA项目中如何实现接口调用?远程调用工具描述HttpClientHttpClient是ApacheJakartaCommon下的子项目,用来提供高效的、最新的、功能丰富的支持Http协议的客户端编程工具包,并且它支持HTTP协议最新版本和建议。HttpClient相比传统JDK自......
  • 【JAVA】Java 使用 XPath表达式定位节点读取自定义XML方法
    *加载配置文件节点*@paramattributeValue节点属性值*@paramareaCode节点属性值*/publicstaticMap<String,String>getConfigXml(StringattributeValue,StringareaCode){StringfilePath="config.xml";Map<St......
  • Xpath的基本使用
    XPath(全称:XMLPathLanguage)即XML路径语言,它是一门在XML文档中查找信息的语言,最初被用来搜寻XML文档,同时它也适用于搜索HTML文档,因此,自动化测试中可以使用XPath寻找目标节点操作,在爬虫过程中可以使用XPath来提取相应的数据。Xpath使用路径表达式来选取XML/HTML文档......