一、Feign
1.1、Java中如何实现跨接口调用
(1) Httpclient
Httpclient是Apache Jakarta Comon下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议的最新版本和建议。HttpClient相比特统JDK自带的URL Connection,提升了易用性和灵活性,使客户端发送HTTP请求变得容易,提高了开发的效率;
(2)OKhttp
OKHttp一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient。OkHttp拥有简洁的API、高效的性能,并支持多种协议(HTTP/2和SPDY);(3) HttpURLConnection
HttpURLConnection是Java的标准类,继承自URLConmecdion,可用于向指定网站发送GET/POST请求。HttpURLConnection使用比较复杂,不像HttpClien那样容易使用;
(4) RestTemplate / Webclient
RestTemplate是 Spring提供的用于访问Rest服务的客户端,它提供了多种便捷访问远程HTTP服务的方法,能够大大提高客户端的编写效率。上面介绍的是最常见的几种调用接口的方法,下面要介绍的方法比上面的更简单、方便,它就是Feign。
1.2、概述
Feign是Neflix开发的声明式、模板化的HTTP客户端,其灵感来自Rerofit、JAXRS-2.0以及WebSocket。Feign可以帮助程序员更加便捷、优雅地调用HTTP API,Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。Spring Cloud OpenFeign对Felign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便!
1.3、官网
https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud-openfeign
https://github.com/spring-cloud/spring-cloud-openfeign
1.4、优势
Feign可以做到使用HTTP请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感加不到这是个HTTP请求。它像Dubbo一样,consumer直接通过接口方调用provider,而不需要通过常现的HttpClient构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
1.5、功能
Feign旨在使编写Java HTTP的客户端变得更容易。前面在使用Ribbon+RestTemplate时,利用RestTemplate对HTTP请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon,利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
1.6、Feign vs OpenFeign
1.7、Feign日志配置
1.7.1、概述
Feign日志配置是指消费者端通过Feign调用远程服务时,如何查看具体的调用细节。Feign的日志配置分为两种,即:全局配置和局部配置;
1.7.2、全局配置
@Configuration
public class MyFeignConfig {
@Bean
public Logger.Level feignLogLevel() {
return Logger.Level.FULL;
}
}
1.7.3、局部配置
public class MyFeignConfig {
@Bean
public Logger.Level feignLogLevel() {
return Logger.Level.FULL;
}
}
@FeignClient(name = "product-service-nacos",path = "/product",configuration = MyFeignConfig.class)
public interface ProductFeignService {
/**
* 根据商品id查询商品
* @param id
* @return
*/
@GetMapping("/getProductById/{id}")
public String getProductById(@PathVariable("id") Integer id);
}
1.7.4、注意事项
不管全局配置还是局部配置,都需要在yml中调整Feign的日志级别,因为Spring Boot默认的日志级别是INFO,DEBUG级别的日志不会打出来。
1.8、Feign超时时间配置
1.8.1、概述
Feign超时时间配置是指,消费者端在调用服务端业务时,针对连接时间和请求处理时间的一些设置,连接时间主要用于处理因网络请求出现的超时情况,请求处理时间用于处理调用对方业务的等待时间,例如我现在调用商品服务的A接口,正常情况下能够很快返回,如果某一时刻A接口挂了,那我不可能永远的等待下去,可以设置一个超时时间,如果在指定的时间内没有返回结果给我,那就会抛出异常,不会拖垮消费者端。
1.8.2、两种方式配置
(1)代码方式
/** * Feign超时时间配置 * 连接超时时间,默认2秒 * 请求处理超时时间,默认5秒 * @return */ @Bean public Request.Options options() { return new Request.Options(2000,3000); }(2)配置文件方式