SpringCloud - OpenFeign使用

一、Java项目中如何实现接口调用?

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

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

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

4)RestTemplate RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。 上面介绍的是最常见的几种调用接口的方法,我们下面要介绍的方法比上面的更简单、方便,它就是 Feign。

二、什么是Feign

Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。 Feign可帮助我们更加便捷、优雅地调用HTTP API。 Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。Spring Cloud openfeign对Feign进行了 增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便

1.1 优势

Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方 法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不 需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法 一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

Feign设计架构

SpringCloud - OpenFeign使用_第1张图片

三、OpenFeign使用

1、OpenFeign配置使用

OpenFeign的使用首先肯定得依赖Spring Cloud,作为Alibaba微服务架构,以下依赖必不可少。
SpringCloud - OpenFeign使用_第2张图片

1、引入pom依赖

<!-- openfeign服务调用 -->
>
    >org.springframework.cloud>
    >spring-cloud-starter-openfeign>
>

openFeign底层内置了Ribbon框架,从依赖关系就可以看出
SpringCloud - OpenFeign使用_第3张图片

2、消费端开启Feign服务调用

在订单服务(dt-order-service)启动器上开启Feign的服务调用,以此来调用库存服务端的接口方法。
@EnableFeignClients :开启服务调用
SpringCloud - OpenFeign使用_第4张图片

3、消费端动态代理Service接口

@FeignClient(name = "dt-stock-service",path = "/stock")
public interface StockFeignService {
    
    @GetMapping(value = "/getPort")
    String getPort();
}
@FeignClient(name = "dt-stock-service",path = "/stock")
dt-stock-service:服务提供者的服务名称,
path:服务提供者的统一前缀(即Controller的前缀路径,如果没有就不填)


SpringCloud - OpenFeign使用_第5张图片
提示:Feign的集成特性可以让服务的接口定义单独抽出来,作为公共的依赖,以方便使用。在实际的项目开发中都会将需要对外提供的服务统一放到一个API服务里面。

四、OpenFeign日志配置

在默认情况下,OpenFeign默认的日志是关闭的,在我们开发过程中,需要调试接口,或者看看调用性能,就需要配置OpenFeign的日志,把OpenFeign的调用日志清晰的打印出来,方便我们开发。
Feign日志级别:

NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。 
BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。 
HEADERS:记录BASIC级别的基础上,记录请求和响应的header。 
FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据

2.1 全局配置日志

OpenFeignConfig.class

/**
 * 全局配置:OpenFeign的全局日志配置
 * 局部配置:不加@Configuration注释
 * @author DT
 * @date 2021/8/9 22:00
 */
 // 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
@Configuration
public class OpenFeignConfig {

    @Bean
    public Logger.Level feignLoggerLevel(){
        // 输出日志级别FULL
        return Logger.Level.FULL;
    }
}

SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置:

#SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置
logging:
  level:
    com.dt.springcloud.openfeign: debug

SpringCloud - OpenFeign使用_第6张图片
输出打印:

2.2 针对单个服务配置日志

SpringCloud - OpenFeign使用_第7张图片
使用configuration = OpenFeignConfig.class
SpringCloud - OpenFeign使用_第8张图片
当然我们也可以通过配置文件的方式来配置.

3、通过配置文件配置日志

3.1 全局配置

针对所有服务配置:

# SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置
logging:
  level:
    com.dt.springcloud.openfeign: debug
# feign日志全局配置
feign:
  client:
    config:
      default:
        loggerLevel: BASIC

在这里插入图片描述

3.2 针对某个服务单独配置

当然你也可以针对某个服务进行配置单独的日志,将调用的微服务名称改成default就配置成全局的了:

# feign针对某个服务配置日志
feign:
  client:
    config:
      #想要调用的微服务名称
      dt-stock-service:
        loggerLevel: BASIC

在这里插入图片描述

五、OpenFeign自定义拦截器

OpenFeign拦截器,无非就是和我们SpringMVC中的拦截器一样,每次feign发起http调用之前,会去执行拦截器中的逻辑,比如统一添加header头信息,对body体中的信息做修改或替换。feign提供了 feign.RequestInterceptor 接口,只需实现该接口,实现对应方法,并将实现类通过 @Configuration交给spring容器管理,即可加上我们自己的通用处理逻辑。

通常我们调用的接口都是有权限控制的,很多时候可能认证的值是通过参数去传递的,还有就是通过请求头 去传递认证信息,比如 Basic 认证方式。

1、自定义拦截器

public class FeignAuthRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        String uuid = UUID.randomUUID().toString();
        requestTemplate.header("Authorization",uuid);
    }
}

2、配置

(1)使用配置文件

@Configuration
public class FeignConfig {

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

    @Bean
    public FeignAuthRequestInterceptor feignAuthRequestInterceptor(){
        return new FeignAuthRequestInterceptor();
    }
}

控制台打印结果:
SpringCloud - OpenFeign使用_第9张图片

(2)在yml中配置
除了上面的第一种全局配置方式以外,我们也可以在配置文件中,单独针对某个被调用的服务进行配置,和我们上面的日志配置方式一样。

# feign针对某个服务配置
feign:
  client:
    config:
      #想要调用的微服务名称
      gulimall-ware:
        connectTimeout: 5000  # 连接超时时间
        readTimeout: 5000     # 读取超时时间
        loggerLevel: BASIC
        request-interceptors: # 配置拦截器,相当于代码配置方式中的RequestInterceptor
          com.atguigu.gulimall.product.Interceptor.FeignAuthRequestInterceptor

3、通过@RequestHeader注解获取请求头里面设置的信息

上文中在客服端拦截器中设置的toekn信息,来到服务提供方里面可以获取到对应的值。

@GetMapping("/testOpenFeign")
    public R testOpenFeign(@RequestParam String str,@RequestHeader("Authorization") String token){
        log.info("获取请求头中的token:{}",token);
        String str1 = "hello";
        if("zhangsan".equals(str)){
            return R.ok().setData(str1);
        }
        return R.ok().setData(null);
    }

六、超时时间配置

通过 Options 可以配置连接超时时间和读取超时时间,Options 的第一个参数是连接的超时时间(ms), 默认值是 2s;第二个是请求处理的超时时间(ms),默认值是 5s。
(1)全局配置

	@Bean
    public Request.Options options(){
        return new Request.Options(5000,10000);
    }

(2)yml配置

feign:
  client:
    config:
      gulimall-ware:
        logger-level: FULL
        # 连接超时时间,默认2s
        connectTimeout: 5000
        # 请求处理超时时间,默认5s
        readTimeout: 10000
        request-interceptors: com.atguigu.gulimall.product.Interceptor.FeignAuthRequestInterceptor

说明:Feign的底层使用的是Ribbon,但是超时时间以Feign配置为准。

七、客户端组件配置

Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求,我们可以集成别的组件来替换掉 URLConnection,比如 Apache HttpClient,OkHttp。

Feign发起调用真正执行逻辑:feign.Client#execute(扩展点)

5.1、配置Apache HttpClient

引入依赖

<!‐‐ Apache HttpClient ‐‐>
<dependency>
	<groupId>org.apache.httpcomponentsgroupId>
	<artifactId>httpclientartifactId>
	<version>4.5.7version>
dependency>

<dependency>
	<groupId>io.github.openfeigngroupId>
	<artifactId>feign‐httpclientartifactId>
	<version>10.1.0version> 
dependency>

再修改yml配置文件,将 Feign 的 Apache HttpClient启用 :

feign:
  #feign 使用 Apache HttpClient 可以忽略,默认开启
  httpclient:
    enabled: true

测试:调用会进入feign.httpclient.ApacheHttpClient#execute

5.2 配置 OkHttp

引入依赖

<dependency>
	<groupId>io.github.openfeigngroupId>
	<artifactId>feign‐okhttpartifactId>
dependency>

然后修改yml配置,将 Feign 的 HttpClient 禁用,启用 OkHttp,配置如下:

feign:
  #feign 使用 okhttp
  httpclient:
    enabled: false
  okhttp:
    enabled: true

八、OpenFeign与Getway关系

OpenFeign和GetWay之间的关系,当一个接口请求过来的时候首先会经过网关getway,通过getway网关权限检验后,再真正去调用服务A,此时A服务的这个接口同时也远程调用了服务B,此时服务A会直接通过OpenFeign去直接调用服务B,此时不会再调整到Getway网关里面进行权限检验。
SpringCloud - OpenFeign使用_第10张图片

你可能感兴趣的:(SpringCloud,spring,cloud,java,微服务)