微服务架构 | 4.2 基于 Feign 与 OpenFeign 的服务接口调用

简介: Feign 是一个声明式的Web服务客户端,让编写 Web 服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可;

前言

参考资料
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》

Feign 是一个声明式的Web服务客户端,让编写 Web 服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可;


1. OpenFeign 基本知识

1.1 Feign 是什么

  • Feign 是一个声明式的 Web 服务客户端,让编写 Web 服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可;
  • Feign 旨在使编写 Java HTTP 客户端变得更容易;

1.2 Feign 的出现解决了什么问题

  • 上篇《微服务架构 | 4.1 基于 Ribbon 的负载均衡详解》在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,有一套模版化的调用方法;
  • 但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用;
  • 所以,Feign 在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义;
  • 在 Feign 的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是 Dao 接口上面标注 Mapper 注解,现在是一个微服务接口上面标注一个 Feign 注解),即可完成对服务提供方的接口绑定;
  • 简化了使用 Spring cloud Ribbon 时,自动封装服务调用客户端的开发量;

1.3 Feign 与 OpenFeign 的区别与对比

Feign OpenFeign
Feign 是 Spring Cloud 组件中的一个轻量级 RESTful 的 HTTP 服务客户端。Feign 内置了 Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign 的使用方式是:使用 Feign 的注解定义接口,调用这个接口,就可以调用服务注册中心的服务; OpenFeign 是 Spring Cloud 在 Feign 的基础上支持了 SpringMVC 的注解,如 @RequesMapping 等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务;
2018年以前的项目在使用feign springcloud F 及 F 版本以上基本上使用 openfeign,openfeign 从框架结构上可以看做是2019年 feign 停更后出现版本,可以说大多数新项目在用 openfeign
spring-cloud-starter-feign spring-cloud-starter-openfeign
  • Feign 与 OpenFeign 最大的区别是:前者不支持对 SpringMVC 的注解,而后者支持;
  • Feign 默认支持 Ribbon 负载均衡,而 OpenFeign 又是在 Feign 的基础上发展而来的;
  • 详情可以参考下面:《2.3 在业务接口上添加注解》与《3.3 在业务接口上添加注解》;


2. 在服务消费者端开启 Feign 支持

消费者对 Feign 客户端的支持示例同 《微服务架构 | 4.1 基于 Ribbon 的负载均衡详解》一篇中:2.4 使用 Netflix Feign 客户端调用服务部分;

2.1 引入 pom.xml 依赖

<!--feign-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

2.2 在主程序类上添加注解

@EnableFeignClients:表示开启并使用 Feign 客户端;

2.3 在业务接口上添加注解

@FeignClient("provider-instance-name") //标识服务为 feign 的客户端
public interface ProviderFeignClient {
    //定义端点的路径和动作
    @RequestMapping( 
            method= RequestMethod.GET,
            value="/providers/{providerId}",
            consumes="application/json")
    //定义传入端点的参数,该方法可以由客户端调用以触发组织服务        
    Provider getProvider(@PathVariable("providerId") String providerId);
}
  • 注意:Feign 不支持对 SpringMVC 注解的支持(与 OpenFeign 的最大区别);
  • 接下来完成对业务接口的实现,将接口自动注入 Controller 层并调用接口方法即可;

2.4 在 controller 层调用接口

@RestController
public class ConsumerFeignController{
    @Resource
    private ProviderFeignClient providerFeignClient;

    @GetMapping(value = "/provider/get/{id}")
    public Provider getProviderById(@PathVariable("id") Long id){
        return providerFeignClient.getProviderById(id);
    }
}


3. 在服务消费者端开启 OpenFeign 支持

3.1 引入 pom.xml 依赖

<!--openfeign-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3.2 在主程序类上添加注解

@EnableFeignClients:表示开启并使用 Feign 客户端(同 Feign);

3.3 在业务接口上添加注解

@FeignClient:表示开启并使用 Feign 客户端;

@Component
@FeignClient(value = "provider-instance-name")
public interface ProviderFeignClient {
    @GetMapping(value = "/providers/{providerId}")
    Provider getProvider(@PathVariable("providerId") String providerId);
}
  • 注意:可以从这里看到 OpenFeign 对 SpringMVC 注解的支持(与 Feign 的最大区别);
  • 接下来的步骤同 Feign,也是:完成对业务接口的实现,将接口自动注入 Controller 层并调用接口方法即可;
  • 同《2.4 在 controller 层调用接口》;


4. OpenFeign 的超时控制

  • 当客户端请求超过 1s 是,会报如下错误:

Feign 超时报错

  • 这是因为 Feign 客户端默认只等待一秒钟,当请求时间超过 1s 时,Feign 会给我们返回请求超时页面;
  • 只需修改 yml 文件即可修改默认超时控制;
#设置 feign/openFeign 客户端超时时间
ribbon:
  #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
  #指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000


5. OpenFeign 的日志打印功能

5.1 日志与日志级别

  • Feign 提供了日志打印功能,可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节;
  • 也即:对 Feign 接口的调用情况进行监控和输出;
级别 说明
NONE 默认的,不显示任何日志
BASIC 仅记录请求方法、URL、响应状态码及执行时间
HEADERS 除了 BASIC 中定义的信息之外,还有请求和响应的头信息
FULL 除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

5.2 编写配置类设置日志级别

在 config 包下;
@Configuration
public class FeignConfig{
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

5.3 在 yml 文件里配置需要开启日志功能的提供者 Feign 客户端

logging:
  level:
    #feign日志以什么级别监控哪个接口
    com.xxx.springcloud.service.ProviderFeignService: debug

5.4 在控制台上查看日志信息

后台查看 OpenFeign 日志输出信息



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
8月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
936 0
|
5月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
8月前
|
文字识别 运维 监控
架构解密|一步步打造高可用的 JOCR OCR 识别服务
本文深入解析了JOCR OCR识别服务的高可用架构设计,涵盖从用户上传、智能调度、核心识别到容错监控的完整链路,助力打造高性能、低成本的工业级OCR服务。
369 0
架构解密|一步步打造高可用的 JOCR OCR 识别服务
|
8月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
884 0
|
消息中间件 人工智能 监控
文生图架构设计原来如此简单之分布式服务
想象一下,当成千上万的用户同时要求AI画图,如何公平高效地处理这些请求?文生图/图生图大模型的架构设计看似复杂,实则遵循简单而有效的原则:合理排队、分工明确、防患未然。
461 14
文生图架构设计原来如此简单之分布式服务
|
11月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
599 12
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
3560 37
微服务架构解析:跨越传统架构的技术革命
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
685 1