互联网大厂技术-HTTP请求-Springboot整合Feign更优雅地实现Http服务调用

这篇具有很好参考价值的文章主要介绍了互联网大厂技术-HTTP请求-Springboot整合Feign更优雅地实现Http服务调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@feignclient http请求,http,java,网络协议

目录

一、SpringBoot快速整合Feign

1.添加Pom依赖

2.启动类添加注解

3.引用Feign服务

二、为请求添加Header的3种方式

1.添加固定header

2.通过接口签名添加header

3.动态添加header

三、为请求添加超时配置

1.默认超时时间

3.超时异常

4.全局超时配置

5.为单个服务设置超时配置

四、为请求配置客户端负载均衡模式

五、Feign日志

1.日志级别

2.日志配置类

3.配置文件

六、高阶配置

七、Feign与Springboot版本

八、技术问题

no suitable HttpMessageConverter found for response type



本章内容讲解重点目标以及面向用户

本章目标

了解feign的原理

掌握feign的使用

学会feign多种header的设置方式

学会feign日志控制

了解feign高阶配置项

其他开发注意事项

面向用户 初、中、高阶的研发同学

很多时候,我们查看一些高阶架构同学在写Http服务调用时,调试跟踪代码时发现就只有接口签名,没有想okhttp那样写一些调用过程的代码,代码看起来风格清爽、优雅并不失逻辑严谨,读完该篇文章,您会掌握其实现方案,并提供demo协助您完成实战,有技术问题可以私信请教;

一、SpringBoot快速整合Feign

1.添加Pom依赖

 <properties>
        <spring-cloud-feign.version>3.1.3</spring-cloud-feign.version>
    </properties>

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.7.10</version>
</parent>
<dependencies>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
   <version>${spring-cloud-feign.version}</version>
</dependency>
</dependencies>

2.启动类添加注解

@EnableFeignClients

3.引用Feign服务

@RestController
@RequestMapping("/stock")
public class StockController {

    @Autowired
    private LocalFeignService service;

    @GetMapping("/get")
    public String get(){
        service.add("10");
        return "Hello world";
    }
}

二、为请求添加Header的3种方式

1.添加固定header

@RestController
public class HomeController {

    @Resource
    private FeignClientService feignClientService;

    

    @RequestMapping(value = "/add")
    public String add(@RequestBody FeignReq req) {
        return "ok";
    }

   
    @RequestMapping("/test-add")
    public Object testAdd() {
        FeignReq req = new FeignReq();
        req.setId(System.currentTimeMillis());
        return feignClientService.add(req);
    }

}

在@PostMapping注解的headers参数中添加固定的header值,也包括一些从配置文件读取的配置项作为header值

@Component
@FeignClient(name = "feignClientService", url = "http://localhost:8081")
public interface FeignClientService {

    @PostMapping(value = "/add", headers = {"Authorization=myFeignSignToken", "Content-Type=text/plain", "App=${my.name}"})
    public String add(@RequestBody FeignReq req);

}

浏览器访问:http://localhost:8081/test-add

2.通过接口签名添加header

@RestController
public class HomeController {



    @Resource
    private FeignClientService feignClientService;


    @PostMapping(value = "/query")
    public String query(@RequestParam("queryName") String queryName) {

        return queryName + "ok";
    }


    @RequestMapping("/test-query")
    public Object testQuery() {
        Map<String, String> map = new HashMap<>();
        map.put("token", "ikong_token"+System.currentTimeMillis());
        return feignClientService.query("ikong", map);
    }

}

重点是在Map类型的headers,这里通过接口签名的@RequestHeader注解将Map对象转化成请求header

@Component
@FeignClient(name = "feignClientService", url = "http://localhost:8081", configuration = TestRequestInterceptor.class)
public interface FeignClientService {

    @PostMapping(value = "/query")
    public String query(@RequestParam("queryName") String queryName, @RequestHeader Map<String, String> headers);

}

浏览器访问:http://localhost:8081/test-query

3.动态添加header

@RestController
public class HomeController {


    @Resource
    private FeignClientService feignClientService;

    @RequestMapping("/search")
    public Object search(@RequestBody FeignReq req) {
        return "ok";
    }

   
    @RequestMapping("/test-search")
    public Object testSearch() {
        FeignReq req = new FeignReq();
        req.setId(System.currentTimeMillis());
        return feignClientService.search(req);
    }


}

@Component
@FeignClient(name = "feignClientService", url = "http://localhost:8081", configuration = TestRequestInterceptor.class)
public interface FeignClientService {


    @PostMapping("/search")
    public String search(@RequestBody FeignReq req);

}

通过FeignClient注解注入configuration = TestRequestInterceptor.class,在TestRequestInterceptor实现header动态添加能力


public class TestRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        template.header(HttpHeaders.AUTHORIZATION, createApiSign());
    }

    /**
     * 创建接口签名
     *
     * @return
     */
    private String createApiSign() {
        return UUID.randomUUID().toString();
    }

}

浏览器访问:http://localhost:8081/test-search

三、为请求添加超时配置

1.默认超时时间

connectiontimeout : 10s,readtimeout : 60s

  public static class Options {
 
    private final int connectTimeoutMillis;
    private final int readTimeoutMillis;
 
    public Options(int connectTimeoutMillis, int readTimeoutMillis) {
      this.connectTimeoutMillis = connectTimeoutMillis;
      this.readTimeoutMillis = readTimeoutMillis;
    }
 
    public Options() {
      this(10 * 1000, 60 * 1000);
    }
 
    /**
     * Defaults to 10 seconds. {@code 0} implies no timeout.
     *
     * @see java.net.HttpURLConnection#getConnectTimeout()
     */
    public int connectTimeoutMillis() {
      return connectTimeoutMillis;
    }
 
    /**
     * Defaults to 60 seconds. {@code 0} implies no timeout.
     *
     * @see java.net.HttpURLConnection#getReadTimeout()
     */
    public int readTimeoutMillis() {
      return readTimeoutMillis;
    }
  }

3.超时异常

exception:feign.RetryableException: connect timed out executing POST http://xxx.ik.com/your/api

4.全局超时配置

feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=5000

5.为单个服务设置超时配置

@feignclient http请求,http,java,网络协议

 要实现不同服务配备不同的超时时间,可按如下配置进行

feign.client.config.yourService.connectTimeout=5
feign.client.config.yourService.readTimeout=5

四、为请求配置客户端负载均衡模式

OpenFeign只是一种Rest客户端,本身不具备任何的负载均衡操作。 OpenFeign底层调用的还是Netflix Ribbon负载均衡组件,那我们在使用OpenFeign实现服务调用时,如何修改负载均衡策略呢?

自定义Ribbon的负载均衡配置

@Configuration
// name为服务名
@RibbonClient(name = "my-provider", configuration = MyLoadBalanceConfiguration.class)
public class MyLoadBalanceConfiguration {

    @Bean
    public IRule ribbonRule() {
        return new RandomRule(); // 采用随机策略
    }
}

我们这里使用的是随机策略,默认为轮询策略。

Ribbon提供可选负载均衡分类

  1. 随机策略——RandomRule
  2. 轮询策略——RoundRobinRule 注:Ribbon默认策略
  3. 重试策略——RetryRule
  4. 最低并发策略——BestAvailableRule
  5. 可用过滤策略——AvailabilityFilteringRule、过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值),性能仅次于最低并发策略。
  6. 响应时间加权策略——WeightedResponseTimeRule,每隔30秒计算一次服务器响应时间,以响应时间作为权重,响应时间越短的服务器被选中的概率越大。
  7. 区域权衡策略——ZoneAvoidanceRule

Ribbon的负载均衡策略使用建议
一般情况下,推荐使用最低并发策略,这个性能比默认的轮询策略高很多。

五、Feign日志

feign的日志是建立在 debug日志模式的基础上的,不管是全局配置还是局部配置,代码配置还是属性配置,都需要先把日志模式调成debug模式:(下面与调用FeignClientService接口的日志模式为例)

1.日志级别

OpenFeign的日志级别有

  • NONE: 默认的,不显示任何日志。

  • BASIC: 仅记录请求方法、URL、响应状态码以及执行时间。

  • HEADERS:除了BASIC 中自定义的信息外,还有请求和响应的信息头。

  • FULL: 除了HEADERS中定义的信息外, 还有请求和响应的正文以及元数据。

2.日志配置类

@Configuration
public class OpenFeignLogConfig {
  @Bean
  Logger.Level feignLoggerLevel(){
    return Logger.Level.FULL;
  }
}

3.配置文件

logging:
  level:
  *[feign日志以什么级别监控哪个接口]:
  com.ik.ikong.service.FeignClientService: debug

六、高阶配置

七、Feign与Springboot版本

版本对照关系如下,详情也可以点击这里的链接在官网查看最新版本兼容关系

@feignclient http请求,http,java,网络协议

八、技术问题

在调用接口时候idea报错

no suitable HttpMessageConverter found for response type

解决过程

1.放开日志

@Configuration
public class FeignConfiguration {

    @Bean
    public feign.Logger logger() {
        return new Slf4jLogger();
    }
    @Bean
    public Logger.Level level() {
        return Logger.Level.FULL;
    }
}
logging:
  level:
    feign.Logger: debug

日志详细

@feignclient http请求,http,java,网络协议

从放开的日志来看,接口返回的head里:content-type: text/html; charset=UTF-8

虽然我在接口签名上增加了produces、consumes

@PostMapping(value = "/xxxxx/your/api", produces = "application/json;charset=utf-8", consumes = "application/json;charset=utf-8")

可以看到毫无效果,仍旧异常:no suitable HttpMessageConverter found for response type

猜想原生的http返回值只对application/json类型做了泛型的反序列化处理,是对接口返回的content-type: text/html;并不能进行json反序列化处理,遂增加该类型的json反序列化处理;

@Bean
    public HttpMessageConverters customConverters() {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML,MediaType.APPLICATION_JSON));
        return new HttpMessageConverters(false, Arrays.asList(mappingJackson2HttpMessageConverter, new StringHttpMessageConverter()));
    }

重点在mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML,MediaType.APPLICATION_JSON));

最后成功完成增加content-type: text/html的json反序列化;

参考:Spring Cloud

Feign实现服务间的Http调用。_feign http调用_半命i的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-767092.html

到了这里,关于互联网大厂技术-HTTP请求-Springboot整合Feign更优雅地实现Http服务调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合Spring Data Elasticsearch,写给互联网大厂员工的真心话

    @RunWith(SpringRunner.class) @SpringBootTest(classes = ItcastElasticsearchApplication.class) public class IndexTest { @Autowired private ElasticsearchTemplate elasticsearchTemplate; //注入ElasticsearchTemplate类 @Test public void testCreate(){ // 创建索引,会根据Item类的@Document注解信息来创建 elasticsearchTemplate.createIndex(Item.class)

    2024年04月14日
    浏览(65)
  • 互联网大厂技术-elasticsearch(es)- 在数据量很大的情况下(数十亿级别)提高查询效率

    互联网大厂技术-elasticsearch(es)- 在数据量很大的情况下(数十亿级别)提高查询效率 目录 一、问题分析 二、问题剖析 三、性能优化的杀手锏(filesystem cache) 四、数据预热 五、冷热分离 六、document 模型设计 七、分页性能优化 八、解决方案 这个问题是肯定要问的,说白了,就

    2024年02月04日
    浏览(75)
  • 盘点互联网大厂的元宇宙布局

    导读: 头部互联网公司的元宇宙布局。 作者:成生辉 来源:大数据DT(ID:hzdashuju) 图1.17用雷达图展示了目前五个头部科技巨头公司对元宇宙的布局情况。布局分成 数字金融 、 穿戴设备 (包括AR/VR及传感器等)、 Adtech (主要做内容及营销)、 去中心化平台 、 软件技术

    2023年04月22日
    浏览(50)
  • 激斗云计算:互联网大厂打响新一轮排位战

    大模型如同一辆时代列车,所有科技大厂都想上车。 自去年底ChatGPT一炮而红,国内外数十家科技大厂、创业公司、机构相继下场,一时间掀起大模型的热浪。 《中国人工智能大模型地图研究报告》显示,截至今年5月28日,中国10亿参数规模以上的大模型已发布79个,中美两国

    2024年02月16日
    浏览(43)
  • 互联网大厂职级和薪资一览表!看看WebGIS能到多少级?

    以上薪资来源网络,仅供参考。 我们再来看下这些大厂在招的webgis岗位薪资: 13-26K,经验不限 勉强能够上13级 13-35K,3-5年工作经验 范围挺大的,最高薪资水平差不多在8级以内 30-60K,3-5年经验,差不多等于P5-P7水平。 25-50K,1-3年工作经验,跨度较大,差不多在T3-T7之间。

    2024年02月20日
    浏览(51)
  • 36岁互联网高管从大厂裸辞,专门卖书快乐多了

    大家好,我是老洪。 今天分享的是一位互联网高管裸辞卖书的创业故事。 吴主任,今年37岁,来自福建莆田,大学毕业后,写过文案、卖过保险、开过网店摆过摊。 他与李诞罗永浩是多年好友,机缘巧合留在北京当起了互联网的内容编辑,12年一路打拼,成为了互联网大厂的

    2024年02月06日
    浏览(47)
  • 2023Java岗面试,进互联网大厂必备Java面试八股文真题解析

    前言 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 很多时候,面试官问的问题会和自己准备的“题库”中的问题不太一样,即使做了复盘,下次面试还是不知道该从何处下手。 为此鄙人软磨硬泡才把阿里P8专门归纳整理的 《Java进阶知识典藏

    2023年04月10日
    浏览(55)
  • 2023Java 岗面试,进互联网大厂必备 Java 面试八股文真题解析

    前言 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 很多时候,面试官问的问题会和自己准备的“题库”中的问题不太一样,即使做了复盘,下次面试还是不知道该从何处下手。 为此鄙人软磨硬泡才把阿里 P8 专门归纳整理的 《Java 进阶知识典

    2024年02月15日
    浏览(46)
  • Selenium超级详细的教程_selenium怎么运行,写给互联网大厂员工的真心话

    在这个示例中,我们使用了WebDriver的 get() 方法来打开指定的网页。您可以传递一个URL作为参数,WebDriver将会在浏览器中加载该URL对应的页面。您还可以打开本地文件,只需传递一个以 file:// 开头的文件路径作为参数。 4. 页面操作 一旦您打开了网页,您就可以使用WebDriver来模

    2024年04月16日
    浏览(50)
  • 金三银四互联网大厂秋招精选 1160 道 Java 面试题答案整理(2023 最新版)

    今年的大环境而言,面试成功的难度比往年高了很多,很明显的感受就是:对于今年的 java 开发朋友面试, 无论一面还是二面,都开始考验一个 Java 程序员的技术功底和基础。 Java 基础掌握不牢,对于一个开发人员来说无疑是非常致命的。学习任何一个技术知识无疑不是从基

    2024年02月09日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包