SpringBoot feign动态设置数据源(https请求)

 更新时间:2021年08月26日 10:05:53   作者:此处省略一个字  
这篇文章主要介绍了SpringBoot如何在运行时feign动态添加数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、背景

在使用springboot-feign/spingcloud-feign时,需要在启动springboot的时候,注入的方式将feigncofing配置好,也就是说项目启动以后只能有一个数据源,且不能修改,在网上找了很多资料没有找到解决方案(网上应该有,只是我没有找到),后面只能是硬着头皮看源码,问题解决,在此记录一下,希望可以帮到有缘人

2、代码

其实在这里用的原生的feign,并不是springboot/springcloud封装的feign,废话不说,上代码

public <T> T getRemote(Class<T> apiType, String url, String apiCert, String certPassWord) {
    // apiCert 是p12文件读了以后的数据,可以把p12文件放在本地,我这里是伪代码了
    feign.Client.Default client = FeignClient(apiCert, certPassWord);
    Decoder decoder =
        (response, type) -> {
          final String result =
              IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8);
          if (String.class.getName() == type.getTypeName()) {
            return result;
          }
          try {
            return JSON.parseObject(result, type);
          } catch (Exception e) {
            log.error("json parse exception");
          }
          return result;
        };
    ErrorDecoder errorDecoder =
        (methodKey, response) -> {
          try {
            final String result =
                IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8);
            log.info("feign client decoder response body : {}", result);
            throw new SysStatusException(response.status(), result);
          } catch (IOException e) {
            log.info("feign client decoder response error {}", e);
          }
          throw new BizStatusException(response.status(), BizCommMessage.ERROR_MSG);
        };
    T remote =
        Feign.builder()
            .decoder(decoder)
            .errorDecoder(errorDecoder)
            .client(url)
            .target(apiType, client);
    return remote;
  }
public Client getFeignClient(String apiCert, String certPassWord) {
    final SSLSocketFactory sslSocketFactory = getSSLSocketFactory(apiCert, certPassWord);
    feign.Client.Default aDefault = new Client.Default(sslSocketFactory, new NoopHostnameVerifier());
    return aDefault;
  }
public static SSLSocketFactory getSSLSocketFactory(String apiCert, String certPassWord) {
    byte[] bytes = apiCert.getBytes();
    try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {
      KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE);
      keyStore.load(inputStream, certPassWord.toCharArray());
      SSLContext sslContext =
          SSLContexts.custom()
              // 忽略掉对服务器端证书的校验,特别重要,被这行代码坑过
              .loadTrustMaterial((TrustStrategy) (chain, authType) -> true)
              .loadKeyMaterial(keyStore, certPassWord.toCharArray())
              .build();
      return sslContext.getSocketFactory();
    } catch (IOException e) {
      log.error("=======init feign client throw IOException======={}", e);
    } catch (KeyStoreException e) {
      log.error("=======init feign client throw KeyStoreException======={}", e);
    } catch (UnrecoverableKeyException e) {
      log.error("=======init feign client throw UnrecoverableKeyException======={}", e);
    } catch (CertificateException e) {
      log.error("=======init feign client throw CertificateException======={}", e);
    } catch (NoSuchAlgorithmException e) {
      log.error("=======init feign client throw NoSuchAlgorithmException======={}", e);
    } catch (KeyManagementException e) {
      log.error("=======init feign client throw KeyManagementException======={}", e);
    }
    return null;
  }

2.2、 编写请求方法

public interface TestRemote {
  @Override
  @RequestLine("POST /apis/{test}/query")
  @Headers({"Content-Type: application/json","Accept: application/json"})
  @Body("{body}")
  String query(@Param("test") String test, @Param("body") String body);
}

2.3、发送请求

public static void main(String[] args) {
   TestRemote testRemote = getRemote(TestRemote.class,String url, String apiCert, String certPassWord);
    testRemote.query("test","{\"id\":1}");
  }

总结:

这样就可以根据前端传来的参数,切换不同的客户端

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Java8中Optional的使用方法详解

    Java8中Optional的使用方法详解

    这篇文章主要介绍了Java8中Optional的使用方法详解,传统的写代码方式经常会遇到NullPointerException,这就需要我们在代码中经常判空,而判空的写法又会显得很累赘,这里就可以用到Optional来简化代码,需要的朋友可以参考下
    2024-01-01
  • Java并发多线程编程之CountDownLatch的用法

    Java并发多线程编程之CountDownLatch的用法

    这篇文章主要介绍了Java并发多线程编程之CountDownLatch的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 基于@Autowierd(自动装配)的使用说明

    基于@Autowierd(自动装配)的使用说明

    这篇文章主要介绍了@Autowierd(自动装配)的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java实现读取resources目录下的文件路径的九种方式

    Java实现读取resources目录下的文件路径的九种方式

    本文主要介绍了Java实现读取resources目录下的文件路径的九种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Spring boot整合log4j2过程解析

    Spring boot整合log4j2过程解析

    这篇文章主要介绍了Spring boot整合log4j2过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • MybatisPlus BaseMapper 实现对数据库增删改查源码

    MybatisPlus BaseMapper 实现对数据库增删改查源码

    MybatisPlus 是一款在 Mybatis 基础上进行的增强 orm 框架,可以实现不写 sql 就完成数据库相关的操作,这篇文章主要介绍了MybatisPlus BaseMapper 实现对数据库增删改查源码解析,需要的朋友可以参考下
    2023-01-01
  • SpringBoot实现Thymeleaf验证码生成

    SpringBoot实现Thymeleaf验证码生成

    本文使用SpringBoot实现Thymeleaf验证码生成,使用后台返回验证码图片,验证码存到session中后端实现校验,前端只展示验证码图片。感兴趣的可以了解下
    2021-05-05
  • springmvc接口接收参数与请求参数格式的整理

    springmvc接口接收参数与请求参数格式的整理

    这篇文章主要介绍了springmvc接口接收参数与请求参数格式的整理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring BeanPostProcessor源码示例解析

    Spring BeanPostProcessor源码示例解析

    这篇文章主要为大家介绍了Spring BeanPostProcessor源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 分析SpringBoot的启动原理

    分析SpringBoot的启动原理

    这篇文章主要分析了SpringBoot的启动原理,帮助大家更好的理解和使用spring boot框架,感兴趣的朋友可以了解下
    2020-09-09

最新评论