关于@RequestLine的使用及配置

目录
  • @RequestLine的使用及配置
  • 自定义配置feignClient并使用@RequestLine问题
    • 步骤
    • 1. 定义请求接口
    • 2. 定义配置文件,配置请求接口

@RequestLine的使用及配置

@RequestLine与其它请求不同,只需要简单写请求方式和路径就能达到请求其它服务的目的。

@FeignClient(value = "feign-server",configuration = FeignConfig.class)  //需要一个配置文件
public interface TestService {
    @RequestLine("POST /feign/test")    //对应请求方式和路径
    String feign(@RequestBody UserDO userDO);
}
@EnableFeignClients
@SpringBootConfiguration
public class FeignConfig {
    @Bean
    public Contract contract(){
        return new feign.Contract.Default();
    }
}

自定义配置feignClient并使用@RequestLine问题

之前在项目里请求三方服务时,使用的是restTemplate,其在组装参数上略显麻烦,其实我们可以使用openFeign自动的组件去请求三方服务,实现更加优雅

步骤

依赖导入这些就不说了,直接进入正题

1. 定义请求接口

其写法和@FeignClient类似,但要使用来自于openFeign的核心注解@RequestLine,而不是来自MVC的注解@PostMapping、@GetMapping。

public interface DhlApi {
   /**
    * 查询轨迹
    * @param url
    * @return
    */
   @RequestLine("GET {url}")
   @Headers({
           "Content-Type: application/json",
   })
   DhlActiveQueryResponse queryTrack(@Param("url") String url);
}

2. 定义配置文件,配置请求接口

@Configuration
public class TestFeignConfig {
	// 获取配置文件,自己用的是apollo
    @ApolloJsonValue("${test.api}")
    private TestISVInfo testIsvInfo;
    @Bean
    public TestISVInfo testIsvApi() throws Exception {
        return Feign.builder()
                .client(client())
                .encoder(new FastJsonEncoder())
                .decoder(new FastJsonDecoder())
                // 连接超时30秒,读取超时60秒
                .options(new Request.Options(30 * 1000, 60 * 1000))
                // 配置日志
                .logger(new Slf4jLogger(TestFeignConfig.class))
                // 发生IO异常重试5次,每次重试最小间隔100ms,最大间隔1s,随着重试次数递增
                .retryer(new Retryer.Default())
                .logLevel(Logger.Level.FULL)
                // 注册feign
                .target(TestIsv.class, testIsvInfo.getDomainUrl());
    }
    private Client client() throws Exception {
    	// 信任策略,设置为无条件信任
        TrustStrategy acceptingTrustStrategy = (cert, authType) -> true;
        // 设置ssl配置,由于我们采用无条件信任,所以也不需要加载证书
        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
        // 使用NoopHostnameVerifier关闭ssl的校验
        SSLConnectionSocketFactory sslScoketFactory = new SSLConnectionSocketFactory(sslContext,
                NoopHostnameVerifier.INSTANCE);

        Registry<ConnectionSocketFactory> socketFactoryRegistry =
                RegistryBuilder.<ConnectionSocketFactory>create()
                        .register("https", sslScoketFactory)
                        .register("http", new PlainConnectionSocketFactory())
                        .build();
        PoolingHttpClientConnectionManager connectionManager =
                new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        CloseableHttpClient httpClient = HttpClients
                .custom()
                .setMaxConnTotal(20)
                .setMaxConnPerRoute(20)
                .setSSLSocketFactory(sslScoketFactory)
                .evictExpiredConnections()
                .evictIdleConnections(20, TimeUnit.SECONDS)
                .setConnectionManager(connectionManager).build();
        return new ApacheHttpClient(httpClient);
    }
}

结束!就这么简单。

为什么用的是@RequestLine

这和open-feign的Contract设计有关系,Contract是一个注解解析接口,它决定了接口可以使用什么注解转换到http请求。open-feign在使用@FeignClient的情况下,使用的是SpringMvcContract,它使得被@FeignClient修饰的接口,可以使用@GetMapping,@PostMapping等Spring Mvc注解。

如果我们要使用@RequestLine,则需要替换open-Feign的MVC解析器,像这样

// 在feign上写上配置
@FeignClient(name = "test-center", configuration = TestFeignConfig .class)
// 配置类
@Configuration
public class TestFeignConfig {
	// 配置feign的注释解析器为feign默认解析器而不是mvc解析器
    @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }
}

如果我们不单独配置,则会使用FeignClientsConfiguration中默认配置的SpringMvcContract。

@Bean
@ConditionalOnMissingBean
public Contract feignContract(ConversionService feignConversionService) {
	return new SpringMvcContract(this.parameterProcessors, feignConversionService);
}

那为什么我们通过@Bean形式注册的feign客户端就能直接使用@RequestLine呢。因为@Bean形式注册的feign客户端不会使用这个配置,而是使用open-feign的默认Contract

打开这个类,我们可以看到它的描述,它的作用可以分为两个:

  • 定义哪些注解在feign接口上是有校的
  • 定义接口的动作

它的processAnnotationOnMethod(MethodMetadata,Annotation, Method)方法,作用就是解析在feign接口上的注解,并转化为发送http请求需要的数据。

方法代码:

该类的该方法,只会处理@Body、@RequestLine和@Header 3个注解,如果不是的话,会直接跳过。 针对@RequestLIne

获取RequstLine的value,使用正则表达式判断值是否是“GET xxxx”这类的形式,不是就报错。解析到之后,获得方法和uri设置进RequestTemplate中针对@Body

将@Body中的值塞到RequestTemplate的body中针对@Headers

获取@Header中的值,进行解析,并放入RequestTemplate的Header中

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringCloud Feign Jackson自定义配置方式

    目录 FeignJackson自定义配置 出现的问题 解决思路 解决方法 Feign自定义配置应用 环境 自定义Feign的配置 Feign中记录日志 测试Feign自定义的配置 查看日志 Feign Jackson自定义配置 Spring Cloud Feign 默认支持Spring MVC的注解 使用相同的HttpMessageConverters类转换 官方文档说明: Spring Cloud adds support for Spring MVC annotations and for

  • SpringBoot工程下使用OpenFeign的坑及解决

    一.前言 在SpringBoot工程(注意不是SpringCloud)下使OpenFeign的大坑.为什么不用SpringCloud中的Feign呢? 首先我的项目比较简单(目前只有login与业务模块)所以暂时不去引入分布式的架构,但两个服务之间存在一些联系因此需要接口调用接口(实现该操作方式很多我选择了OpenFeign,踩坑之路从此开始...). 二.具体的坑 使用OpenFeign我是直接参考官方的demo,官方的例子写的简洁明了直接套用到自己的工程中即可,自己也可以做相应的封装再调用但

  • spring cloud Feign使用@RequestLine遇到的坑

    Feign使用@RequestLine遇到的坑 如何在微服务项目中调用其它项目的接口试使用spring cloud feign声明式调用. /** * 客户端请去 * @author RAY * */ @FeignClient(name="store",configuration=FooConfiguration .class) public interface UserFeignClient { @RequestLine("GET /simple/{id}") p

  • 关于@RequestLine的使用及配置

    目录 @RequestLine的使用及配置 自定义配置feignClient并使用@RequestLine问题 步骤 1. 定义请求接口 2. 定义配置文件,配置请求接口 @RequestLine的使用及配置 @RequestLine与其它请求不同,只需要简单写请求方式和路径就能达到请求其它服务的目的. @FeignClient(value = "feign-server",configuration = FeignConfig.class)  //需要一个配置文件 public in

  • 详解Nginx的核心配置模块中对于请求体的接受流程

    本篇文章主要会介绍nginx中请求的接收流程,包括请求头的解析和请求体的读取流程. 首先介绍一下rfc2616中定义的http请求基本格式: Request = Request-Line *(( general-header | request-header | entity-header ) CRLF) CRLF [ message-body ] </span> 第一行是请求行(request line),用来说明请求方法,要访问的资源以及所使用的HTTP版本: Request-Line  

  • SpringCloud2020.0.x版UnderTow AccessLog相关配置简介

    目录 01.accesslog相关配置 02.日志文件rotate目前只能按照日期 03.access占位符 总结 本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 01.accesslog相关配置 server: undertow: # access log相关配置 accesslog: # 存放目录,默认为 logs dir: ./log # 是否开启 enab

  • 关于Feign的覆写默认配置和Feign的日志

    目录 Feign的覆写默认配置 Feign Logging 日志 Feign进行日志配置 Feign有四种类型的日志 列出两种在项目中配置Feign日志的方法 Feign的覆写默认配置 A central concept in Spring Cloud’s Feign support is that of the named client. Each feign client is part of an ensemble of components that work together to c

  • 详解配置spring-boot-actuator时候遇到的一些小问题

    前言 spring-boot-actuator是一个spring-boot提供的用于监控组件,只需要在代码中加入依赖就可以了 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 遇到的一些小问题 1.可以加入依赖 <dependenc

  • spring boot的maven配置依赖详解

    本文介绍了spring boot的maven配置依赖详解,分享给大家,具体如下: 我们通过引用spring-boot-starter-parent,添加spring-boot-starter-web 可以实现web项目的功能,当然不使用spring-boot-start-web,通过自己添加的依赖包也可以实现,但是需要一个个添加,费时费力,而且可能产生版本依赖冲突.我们来看下springboot的依赖配置: 利用pom的继承,一处声明,处处使用.在最顶级的spring-boot-dependen

  • 详解Spring Boot配置排序依赖技巧

    本文主要介绍了Spring Boot配置排序依赖技巧,分享给大家,具体如下: Spring Boot - 被错误使用的注解 我自己曾经在 Spring Boot 中集成通用 Mapper 时,写过下面的代码: @Configuration @AutoConfigureAfter(MyBatisConfig.class) public class MyBatisMapperScannerConfig { //其他 } 这种用法我参考的 mybatis-spring-boot-starter. 由于

  • nginx配置React静态页面的方法教程

    前言 本文主要给大家介绍了关于nginx配置React静态页面的相关内容,文中给大家详细介绍了关于nginx的安装以及一些基本操作,然后给大家分享了React 静态页面 nginx 配置简洁版的示例代码,下面话不多说了,来一起看看详细的介绍吧. 关于nginx的安装启动以及80端口被占用的解决方法,大家也可以参考这篇文章:http://www.jb51.net/article/110291.htm 第一步:安装 1.http://nginx.org/en/download.html 下载 2.t

随机推荐