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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 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 日志输出信息



相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5天前
|
存储 Linux KVM
Proxmox VE (PVE) 主要架构和重要服务介绍
Proxmox VE (PVE) 是一款开源的虚拟化平台,它基于 KVM (Kernel-based Virtual Machine) 和 LXC (Linux Containers) 技术,支持虚拟机和容器的运行。PVE 还提供高可用集群管理、软件定义存储、备份和恢复以及网络管理等企业级功能。
58 7
|
10天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
10天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
9天前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性
微服务架构中,如何确保服务之间的数据一致性
|
7天前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
38 2
|
10天前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
28 1
|
9天前
|
Kubernetes Go Docker
掌握微服务架构:从Go到容器化的旅程
摘要,通常简短概述文章内容,要求精炼。在本文中,我们将打破常规,采用一种故事化叙述的摘要,旨在激发读者的好奇心和探究欲: “从宁静的海滨小城出发,我们踏上了一场技术探险之旅,探索微服务架构的奥秘。我们将学习如何用Go编写微服务,以及如何通过Docker和Kubernetes将它们打包进小巧的容器中。在这场旅程中,我们将遇到挑战、收获知识,最终实现应用的快速部署与可扩展性。”
|
10天前
|
Cloud Native Java 对象存储
揭秘微服务架构之争:Spring Cloud与Netflix OSS巅峰对决,谁将称霸弹性云原生时代?
近年来,微服务架构成为企业应用的主流设计模式。本文对比了两大热门框架Spring Cloud和Netflix OSS,探讨其在构建弹性微服务方面的表现。Spring Cloud依托Spring Boot,提供全面的微服务解决方案,包括服务注册、配置管理和负载均衡等。Netflix OSS则由一系列可独立或组合使用的组件构成,如Eureka、Hystrix等。两者相比,Spring Cloud更易集成且功能完善,而Netflix OSS则需自行整合组件,但灵活性更高。实际上,两者也可结合使用以发挥各自优势。通过对两者的对比分析,希望为企业在微服务架构选型上提供参考。
30 0
|
10天前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
|
11天前
|
测试技术 微服务
微服务(八)-服务网关zuul(四)
微服务(八)-服务网关zuul(四)
下一篇
无影云桌面