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设计架构

在这里插入图片描述

三、OpenFeign使用

1、OpenFeign配置使用

OpenFeign的使用首先肯定得依赖Spring Cloud,作为Alibaba微服务架构,以下依赖必不可少。
在这里插入图片描述

1、引入pom依赖

<!-- openfeign服务调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

openFeign底层内置了Ribbon框架,从依赖关系就可以看出
在这里插入图片描述

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

在订单服务(dt-order-service)启动器上开启Feign的服务调用,以此来调用库存服务端的接口方法。
@EnableFeignClients :开启服务调用
在这里插入图片描述

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的前缀路径,如果没有就不填)

在这里插入图片描述
在这里插入图片描述
提示: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

在这里插入图片描述
输出打印:
在这里插入图片描述

2.2 针对单个服务配置日志

在这里插入图片描述
使用configuration = OpenFeignConfig.class
在这里插入图片描述
当然我们也可以通过配置文件的方式来配置.

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();
    }
}

控制台打印结果:
在这里插入图片描述

(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.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.5.7</version>
</dependency>

<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign‐httpclient</artifactId>
	<version>10.1.0</version> 
</dependency>

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

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

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

5.2 配置 OkHttp

引入依赖

<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign‐okhttp</artifactId>
</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网关里面进行权限检验。
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【2021年,将Spring全家桶系列课程进行Review,修复顺序等错误。进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并新增高级的Spring Security等内容,通过手把手一步步教你从零开始学会应用Spring,课件将逐步进行上传,敬请期待】 本课程是Spring案例精讲课程的第四部分Spring Cloud,Spring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Spring Cloud的核心知识点:注册中心、服务提供者与消费者、服务的调用OpenFeign、Hystrix监控、服务网关gateway、消息驱动的微服务Spring Cloud Stream、分布式集群、分布式配置中心的案例介绍, 快速掌握Spring Cloud的核心知识,快速上手,为学习及工作做好充足的准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVC、Spring Boot、Spring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验  【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值