SpringCloudAliBaba之Feign介绍及使用:优雅的调用API

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SpringCloudAliBaba之Feign介绍及使用:优雅的调用API

1、什么是Feign

Feign是Netflix开发的声明式子,模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。

SpringCloud openfeign对Feign进行了增强,使其支持Spring MvC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便

优点

Feign可以做到使用HTTP请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是一个HTTP请求。

2、SpringCloudAliBaba快速整合Feign

1、引入依赖

<!--添加openfeign的依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、编写调用接口

@FeignClient(value = "stock-server",path = "/stock")
public interface StockFeignService {
    @RequestMapping("/stockList")
    public String getStock();
}

3、启动类上添加@EnableFeignClients注解

@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
}

4、发起调用,像调用本地方法一样调用远程服务

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    StockFeignService stockFeignService;
    @GetMapping("/orderList")
    public String getOrder() {
        return stockFeignService.getStock();
    }
}

3、SpringCloud Feign的自定义配置及使用

3.1、日志配置

遇到Bug,如果接口调用失败,参数没收到等问题,就需要配置Feign的日志了,以便于将请求日志进行输出

1、定义一个配置类,指定日志级别

/**
 * 注意此处如果配置@Configuration注解就会全局生效,如果想指定对应微服务,就不能配置
 */
public class FeignConfig {
    /**
     *  日志级别      
     **/
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

通过源码可以看到日志等级有四种,分别是

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

2、进行配置,让调用的微服务生效,在@FeignClient注解中指定使用的配置类

3、yml配置,由于springboot默认的日志级别是info,feign的debug日志级别不会输出

4、调用服务进行实验

先使用全局配置进行测试

编写好controller层

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    StockFeignService stockFeignService;
    @Autowired
    ProductFeignService productFeignService;
    @GetMapping("/orderList")
    public String getOrder() {
        return stockFeignService.getStock()+productFeignService.getProduct();
    }
}

结果

局部配置:对单一服务进行配置

步骤一:去掉FeignConfig上面的@Configuration注解

步骤二:在其中一个服务上添加配置

结果:

特别补充:当然,与Ribbon一样,Feign也可以在yml进行局部日志配置

#feign日志局部配置     
feign:
  client:
    config:
      product-server: #对应微服务
        logger-level: FULL

3.2、契约配置

Spring Cloud 在Feign的基础上做了扩展,使用Spring MVC的注解来完成Feign的功能,原生的Feign是不支持Spring MVC注解的,如果你想在SpringCloud中使用原生的注解方式定义客户端也是可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的是SpringMVCContract。

Spring Cloud 1早期版本就是用的原生Feign,随着netflix的停更换成了Open feign

1、修改契约配置,支持Feign原生的注解

@Bean
public Contract feignContract(){
    return new Contrat.Default();
}

2、OrderFeignService中配置使用Feign原生的注解

@FeignClient(value = "stock-server",path = "/stock")
public interface StockFeignService {
    @RequestLine("GET /stockList")
    public String getStock();
}

3、补充,也可以通过yml配置契约

feign:
  client:
    config:
      product-server: #对应微服务
        logger-level: FULL
        contract: feign.contract.Default #指定Feign原生注解契约配置

3.3、配置超时时间

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

全局配置

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

yml中配置

feign:
  client:
    config:
      product-server: #对应微服务
        # 连接超时时间(也可在配置类进行配置)
        connect-timeout: 5000
        # 请求处理超时时间
        read-timeout: 10000

3.4、自定义拦截器实现认证逻辑

在平常我们使用的拦截器,就是针对某个请求接口做出拦截,而这里的拦截器是针对服务与服务之见调用的拦截

1、自定义一个拦截器类

public class CustomerFeignInterceptor implements RequestInterceptor {
     Logger log = LoggerFactory.getLogger(this.getClass());
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 业务逻辑
        log.info("进入了拦截器");
        String token = UUID.randomUUID().toString();
        requestTemplate.header("Authorization",token);
    }
}

2、全局配置

@Bean
public CustomerFeignInterceptor customerFeignInterceptor() {
    return new CustomerFeignInterceptor();
}

3、yml方式配置(针对某一个服务做拦截)

feign:
  client:
    config:
      product-server: #对应微服务
        request-interceptors:
          - com.lili.cloud.interceptor.feign.CustomerFeignInterceptor

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
Java API Spring
【异常】Feign 调用api模块直接进入fallback的问题解决办法
【异常】Feign 调用api模块直接进入fallback的问题解决办法
456 0
|
9月前
|
Java API 时序数据库
InfluxData【付诸实践 02】SpringBoot 集成时序数据库 InfluxDB 应用分享(InfluxDB实例+Feign接口调用InfluxDB API)源码分享
InfluxData【付诸实践 02】SpringBoot 集成时序数据库 InfluxDB 应用分享(InfluxDB实例+Feign接口调用InfluxDB API)源码分享
203 0
|
JSON 前端开发 Java
Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题
Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题
553 0
Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题
|
5天前
|
API PHP 开发者
速卖通商品详情接口(速卖通API系列)
速卖通(AliExpress)是阿里巴巴旗下的跨境电商平台,提供丰富的商品数据。通过速卖通开放平台(AliExpress Open API),开发者可获取商品详情、订单管理等数据。主要功能包括商品搜索、商品详情、订单管理和数据报告。商品详情接口aliexpress.affiliate.productdetail.get用于获取商品标题、价格、图片等详细信息。开发者需注册账号并创建应用以获取App Key和App Secret,使用PHP等语言调用API。该接口支持多种请求参数和返回字段,方便集成到各类电商应用中。
|
11天前
|
JSON API 数据格式
微店商品列表接口(微店 API 系列)
微店商品列表接口是微店API系列的一部分,帮助开发者获取店铺中的商品信息。首先需注册微店开发者账号并完成实名认证,选择合适的开发工具如PyCharm或VS Code,并确保熟悉HTTP协议和JSON格式。该接口支持GET/POST请求,主要参数包括店铺ID、页码、每页数量和商品状态等。响应数据为JSON格式,包含商品详细信息及状态码。Python示例代码展示了如何调用此接口。应用场景包括商品管理系统集成、数据分析、多平台数据同步及商品展示推广。
|
3天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
24 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
2天前
|
监控 供应链 搜索推荐
亚马逊商品详情接口(亚马逊 API 系列)
亚马逊作为全球最大的电商平台之一,提供了丰富的商品资源。开发者和电商从业者可通过亚马逊商品详情接口获取商品的描述、价格、评论、排名等数据,对市场分析、竞品研究、价格监控及业务优化具有重要价值。接口基于MWS服务,支持HTTP/HTTPS协议,需注册并获得API权限。Python示例展示了如何使用mws库调用接口获取商品详情。应用场景包括价格监控、市场调研、智能选品、用户推荐和库存管理等,助力电商运营和决策。
44 23
|
3天前
|
JSON 数据挖掘 API
lazada商品详情接口 (lazada API系列)
Lazada 是东南亚知名电商平台,提供海量商品资源。通过其商品详情接口,开发者和商家可获取商品标题、价格、库存、描述、图片、用户评价等详细信息,助力市场竞争分析、商品优化及库存管理。接口采用 HTTP GET 请求,返回 JSON 格式的响应数据,支持 Python 等语言调用。应用场景包括竞品分析、价格趋势研究、用户评价分析及电商应用开发,为企业决策和用户体验提升提供有力支持。
48 21
|
4天前
|
数据采集 JSON 监控
速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)
以下是使用 Python 调用速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)的代码示例。该示例包含准备基础参数、生成签名、发送请求和处理响应等关键步骤,并附有详细注释说明。代码展示了如何通过公共参数和业务参数构建请求,使用 HMAC-SHA256 加密生成签名,确保请求的安全性。最后,解析 JSON 响应并输出商品信息。此接口适用于商品监控、数据采集与分析及商品推荐等场景。注意需通过 OAuth2.0 获取 `access_token`,并根据官方文档调整参数和频率限制。
|
5天前
|
存储 搜索推荐 API
淘宝拍立淘按图搜索API接口系列概述
淘宝拍立淘按图搜索API接口允许用户通过上传图片或拍摄实物来搜索相似或相同的商品。这一功能主要依赖于图像识别技术,系统会对上传的图片进行分析和处理,提取出商品的特征信息,并在淘宝的商品数据库中进行匹配搜索,最终返回与上传图片相似或相同的商品列表。

热门文章

最新文章