【OpenFeign】实现远程HTTP调用

编程入门 行业动态 更新时间:2024-10-15 12:31:41

【OpenFeign】<a href=https://www.elefans.com/category/jswz/34/1723735.html style=实现远程HTTP调用"/>

【OpenFeign】实现远程HTTP调用

文章目录

  • 1. 常见HTTP客户端
  • 2. Fegin
    • 2.1. 介绍
    • 2.2. 优点
    • 2.3. 架构图
  • 3. 快速开始
  • 4. Feign的组成
  • 5. 细粒度配置
    • 5.1 代码方式-指定日志级别
    • 5.2 属性方式-指定日志级别
  • 6. 全局配置自定义
    • 6.1 代码方式
    • 6.2 属性配置
  • 7. 支持的其他配置项
    • 7.1 拦截器配置
    • 7.2 Client设置
      • 7.2.1 配置Apache HttpClient
      • 7.2.2 设置OkHttp
    • 7.3 超时配置

1. 常见HTTP客户端

  • HttpClient

    HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协 议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。

  • Okhttp

    一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议 (HTTP/2 和 SPDY)。

  • HttpURLConnection

    HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、 POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。

  • RestTemplate

    RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。

2. Fegin

2.1. 介绍

是一个http请求调用的轻量级框架,是以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求。

2.2. 优点

这种请求相对而言比较直观。是一个http请求调用的轻量级框架,是以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。
【Fegin和OpenFeign的区别:Spring Cloud openfeign对Feign进行了 增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便 】

2.3. 架构图

3. 快速开始

  • 引入依赖
  		 <!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--loadbalance--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
  • 添加启动注解
  • 使用@FeignClient注解调用服务
//name 对应的是Nacos上注册的服务名字
@FeignClient(name = "msb-stock")
public interface StockFeignClient {@GetMapping("/stock/reduce/{productId}")String reduce(@PathVariable Integer productId);
}
  • 直接想调用接口一样去调用
@Slf4j
@RestController
public class OrderController {@Autowiredprivate StockFeignClient stockFeignClient;@GetMapping("/order/create")public String createOrder(Integer productId,Integer userId){String reduce = stockFeignClient.reduce(productId);log.info("减库存成功:{}",reduce);return "下单成功";}
}

OpenFeign里面是整合里Ribbon的所以默认会进行负载均衡

4. Feign的组成

接口作用默认值
Feign.BuilderFeign的入口Feign.Builder
ClientFeign底层用什么去请求和Ribbon配合时:LoadBalancerFeignClient<br />不和Ribbon配合时:Feign.Client.Default
Contract契约,注解支持SpringMVC Contract
Encoder编码器,用于将独享转换成HTTP请求消息体SpringEncoder
Decoder解码器,将相应消息体转成对象ResponseEntityDecoder
Logger日志管理器Slf4jLogger
RequestInterceptor用于为每个请求添加通用逻辑(拦截器,例子:比如想给每个请求都带上heared)

Feign.Client.Default 利用的是我们默认的HttpURLConnection,他是没有连接池的。也没有资源管理这个概念,性能不是很好,

5. 细粒度配置

5.1 代码方式-指定日志级别

feign默认是不打印任何日志的,但是我们希望打印一些日志信息。比如调用的时间。

Feign设置方式就不同的,他有四个级别如下:

级别打印日志内容
NONE(默认值)不记录任何日志
BASIC仅记录请求方法、URL、响应状态代码以及执行时间
HEADERS记录BASIC级别的基础上,记录请求和响应的header
FULL记录请求和响应的header、body和元数据
  • Feign日志是基于Spring boot的日志所以先设置SpringBoot日志:
logging:level:com.msb: debug
  • 创建配置类
//这里不能增加@Configuration,如果添加了就会变为全局配置文件。
public class StockFeignConfiguration {@Beanpublic Logger.Level level(){return Logger.Level.FULL;}
}
  • 将配置引入

    配置完成!

5.2 属性方式-指定日志级别

logging:level:com.msb: debug
feign:client:config:# 这边是你FeignClinet的name的值msb-stock:loggerLevel: full

6. 全局配置自定义

6.1 代码方式

  • 方式一:让父子上下文ComponentScan重叠(强烈不建议使用)
@Configuration
public class StockFeignConfiguration {/*** 日志级别* 通过源码可以看到日志等级有 4 种,分别是:* NONE:不输出日志。* BASIC:只输出请求方法的 URL 和响应的状态码以及接口执行的时间。* HEADERS:将 BASIC 信息和请求头信息输出。* FULL:输出完整的请求信息。*/@Beanpublic Logger.Level level(){return Logger.Level.FULL;}
}
  • 推荐方式 EnableFeignClients(defaultConfiguration=xxx.class)

6.2 属性配置

logging:level:com.nx: debug
feign:client:config:default:loggerLevel: full

7. 支持的其他配置项

OpenFeign支持契约配置、编解码配置、拦截器配置、Clinet设置、超时配置,这边举例几个常用的配置。

7.1 拦截器配置

  • 通过对RequestInterceptor的实现,可以修改header信息或者对body中的信息做修改或者替换
public class FeignAuthRequestInterceptor implements RequestInterceptor {private String tokenId;public FeignAuthRequestInterceptor(String tokenId) {this.tokenId = tokenId;}@Overridepublic void apply(RequestTemplate template) {template.header("Authorization",tokenId);}
}
  • 配置到OpenFeign配置文件
@Configuration
public class FeignConfig {@Value("${feign.tokenId}")private String tokenId;/*** 自定义拦截器* @return*/@Beanpublic FeignAuthRequestInterceptor feignAuthRequestInterceptor(){return new FeignAuthRequestInterceptor(tokenId);}
}

7.2 Client设置

7.2.1 配置Apache HttpClient

  • 引入依赖
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
</dependency>
  • 修改配置
feign:httpclient:#使用apache httpclient做请求,而不是jdk的HttpUrlConnectionenabled: true# feign最大链接数 默认200max-connections: 200#feign 单个路径的最大连接数  默认 50max-connections-per-route: 50

7.2.2 设置OkHttp

  • 引入依赖
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>
  • 添加配置
feign:okhttp:enabled: true#线程池可以使用httpclient的配置   httpclient:max-connections: 200max-connections-per-route: 50

7.3 超时配置

在OpenFeign添加配置

@Bean
public Request.Options options(){return new Request.Options(2000,50000);//连接超时时间,读取超时时间
}

更多推荐

【OpenFeign】实现远程HTTP调用

本文发布于:2024-03-23 18:32:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1741425.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:实现远程   OpenFeign   HTTP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!