知识点扫盲——SpringCloud feign是什么?

news2024/12/28 17:43:10

文章目录

      • 0 前言
      • 1 引言
      • 2 Feign简介
      • 3 Feign的核心特性
        • 3-1.声明式REST客户端
        • 3-2.编码器和解码器
        • 3-3.错误处理
      • 4 Feign的配置和使用
        • 4-1. 配置Feign
        • 4-2. 使用Feign进行服务调用
      • 5 Feign的高级特性
        • 5-1. 服务降级
        • 5-2 .负载均衡
        • 5-3. 日志记录
      • 6 Feign与Hystrix的集成
        • 6-1. Hystrix及其作用
        • 6-2. Feign与Hystrix集成
      • 7 总结


0 前言

今天在概要设计评审过程中,领导问了一个问题,为什么要使用feign调用,而不是直接走http接口调用?我草草回答了 使用http接口调用走公网,涉及接口签名和验签,会引入额外的工作量,糊弄了过去,会后开始补课,学习一下什么是feign。

1 引言

微服务架构中,服务间通信是构建可扩展、灵活系统的核心。

随着服务数量的增加,传统的单体应用中的直接方法调用不再适用,取而代之的是远程过程调用(RPC)。Feign,作为Spring Cloud生态中的一个声明式Web服务客户端,提供了一种简洁的方式来实现服务间的HTTP调用,简化了远程服务调用的复杂性,还使得服务间的通信更加直观和易于管理。

2 Feign简介

Feign是Spring Cloud中一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加简单。Feign的声明式特性意味着开发者只需要通过创建一个接口并使用注解的方式来定义服务调用,Feign会自动生成代理实现类。这种方式与Spring的RestTemplate相比,减少了模板代码的编写,使得代码更加简洁和易于维护。

Feign与其他服务调用方式,如Java原生的HttpClient,有着明显的区别。

  • HttpClient需要手动编写请求和响应的处理逻辑,而Feign则通过注解和模板方法自动完成这些工作。
  • Feign整合了Spring MVC的注解,使得开发者可以使用@RequestMapping等注解来定义服务接口,Feign接口的编写与Spring MVC控制器非常相似,学习成本低。
  • Feign支持可插拔的编码器和解码器,开发者可以自定义数据的序列化和反序列化方式,以适应不同的数据传输需求。

3 Feign的核心特性

3-1.声明式REST客户端

Feign作为声明式REST客户端,极大地简化了HTTP客户端代码的编写。开发者只需定义一个接口,并使用注解来指定服务的URL和HTTP操作类型,Feign会自动生成实现类。例如,使用@FeignClient注解指定服务名,@GetMapping@PostMapping等注解声明具体的HTTP请求。这种声明方式不仅减少了模板代码,还使得服务调用的代码更加清晰和易于理解。

3-2.编码器和解码器

Feign通过编码器(Encoder)和解码器(Decoder)处理请求和响应的序列化与反序列化。Feign默认使用Spring的HttpMessageConverters,支持JSON、XML等多种格式的数据交换。开发者可以根据需要自定义编码器和解码器,以支持特定的序列化库,如Gson、Jackson等,或者处理特殊的数据格式。这种灵活性使得Feign能够适应不同的数据传输需求。

3-3.错误处理

Feign提供了强大的错误处理机制。当服务调用失败时,Feign允许开发者定义错误处理策略,例如重试逻辑、熔断机制等。通过集成Hystrix等容错工具,Feign可以在服务调用失败时提供备选方案,从而提高系统的可用性和稳定性。此外,Feign还支持自定义异常处理,开发者可以定义全局的错误处理逻辑,或者为特定的服务调用配置错误处理策略。

4 Feign的配置和使用

Feign的配置和使用是理解其如何简化微服务间通信的关键。以下是如何在Spring Cloud应用中配置Feign客户端以及如何使用Feign进行服务调用的步骤。

4-1. 配置Feign

在Spring Cloud应用中配置Feign客户端非常简单。首先,确保你的项目中已经包含了Spring Cloud的依赖,并且启用了Feign客户端。这通常通过在启动类上添加@EnableFeignClients注解来实现。

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

接下来,定义一个Feign客户端接口,并使用@FeignClient注解来指定目标服务。例如,如果你有一个名为user-service的服务,你可以这样配置Feign客户端:

@FeignClient(name = "user-service")
public interface UserServiceClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

在这个例子中,@FeignClient(name = "user-service")指定了要调用的服务名,而@GetMapping("/users/{id}")定义了一个GET请求,用于获取指定ID的用户信息。

4-2. 使用Feign进行服务调用

一旦Feign客户端接口被定义,使用它就像调用本地方法一样简单。Spring容器会自动为你的接口生成一个代理实现,你可以直接注入这个接口并使用它。

@RestController
public class UserController {

    @Autowired
    private UserServiceClient userServiceClient;

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable("id") Long id) {
        return userServiceClient.getUserById(id);
    }
}

在上面的代码中,我们注入了UserServiceClient,并在一个REST控制器中使用它来获取用户信息。当/user/{id}路径被访问时,Feign客户端会自动向user-service服务发起GET请求,获取并返回用户数据。

Feign还支持多种配置项,如连接超时、重试策略等,可以通过application.yml或application.properties文件进行配置:

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full

这段配置设置了Feign客户端的默认连接超时和读取超时时间,并开启了详细日志记录,这对于调试和监控服务调用非常有用。

5 Feign的高级特性

Feign不仅提供了基本的服务调用功能,还集成了一些高级特性,以增强微服务架构的健壮性和可维护性。

5-1. 服务降级

服务降级是一种提高系统可用性的策略,当某个服务不可用时,系统会临时提供备选方案,以避免系统完全失败。Feign可以通过与Hystrix集成来实现服务降级。Hystrix是一个延迟和容错库,可以帮助系统在依赖服务不可用时保持响应。

@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserServiceClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

@Component
public class UserClientFallback implements UserServiceClient {
    @Override
    public User getUserById(Long id) {
        // 返回一个默认的用户信息或者错误信息
        return new User(-1L, "服务不可用", "不可用");
    }
}

在这个例子中,fallback属性指定了一个降级类UserClientFallback。当user-service服务不可用时,Feign会自动调用这个类的getUserById方法,返回一个默认的用户信息。

5-2 .负载均衡

微服务架构中,一个服务可能有多个实例。Feign可以与Ribbon配合实现客户端负载均衡,自动选择一个服务实例来处理请求。Ribbon是一个客户端负载均衡器,可以根据不同的策略(如轮询、随机、响应时间加权等)来选择服务实例。

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full

在上述配置中,Feign客户端将使用Ribbon的默认配置来实现负载均衡。开发者无需编写额外的代码,Ribbon会自动处理服务实例的选择。

5-3. 日志记录

Feign提供了日志记录功能,可以帮助开发者调试和监控服务调用。Feign的日志级别可以配置为NONEBASICFULL

feign:
  client:
    config:
      default:
        loggerLevel: full

当设置为FULL级别时,Feign会记录请求和响应的详细信息,包括请求头、请求体、响应头和响应体。这对于调试问题和监控服务调用非常有用。

6 Feign与Hystrix的集成

微服务架构中,服务间的依赖可能导致级联故障,Hystrix为此提供了解决方案。Hystrix是一个延迟和容错库,它通过熔断机制来帮助系统在依赖服务失败时保持稳定。

6-1. Hystrix及其作用

Hystrix的核心功能是熔断机制,当一个服务调用失败率超过预设阈值时,Hystrix会“熔断”该服务的调用,直接返回错误,而不是让请求继续失败,这样可以防止系统过载。Hystrix还支持服务降级,当服务不可用时,可以快速返回一个合理的默认响应。

6-2. Feign与Hystrix集成

Feign可以与Hystrix无缝集成,以实现服务调用的熔断机制。集成过程非常简单,只需在Feign客户端接口中指定一个fallback类即可。

@FeignClient(name = "account-service", fallback = AccountServiceFallback.class)
public interface AccountServiceClient {
    @GetMapping("/accounts/{id}")
    Account getAccountById(@PathVariable("id") Long id);
}

@Component
public class AccountServiceFallback implements AccountServiceClient {
    @Override
    public Account getAccountById(Long id) {
        // 返回一个默认的Account对象或者错误信息
        return new Account(id, "账户服务不可用", "N/A");
    }
}

在上面的代码中,AccountServiceClient是一个Feign客户端接口,fallback属性指定了AccountServiceFallback类作为服务降级的实现。当account-service服务不可用时,Feign会自动调用AccountServiceFallbackgetAccountById方法。

7 总结

回答一下前言里,我领导提到的问题,学起来,下次可以有理有据的回答出来了。(虽然直接说使用feign省工时,就能解决问题了~

设计服务间通信时,选择Feign调用而不是直接HTTP调用的原因主要有以下几点:

  1. 简化代码:Feign通过声明式接口简化了HTTP客户端的使用,开发者无需编写模板化的HTTP请求代码,如创建连接、设置请求头、处理响应等,这些都由Feign自动完成。
  2. 提高开发效率:使用Feign,开发者可以像调用本地方法一样调用远程服务,这减少了编写和维护HTTP客户端代码的工作量,从而提高了开发效率。
  3. 服务降级和熔断:Feign可以很容易地与Hystrix集成,实现服务降级和熔断机制,这有助于提高系统的容错能力,防止服务故障的级联效应。
  4. 负载均衡:Feign与Ribbon集成,可以自动实现客户端负载均衡,无需手动指定服务实例,简化了服务调用的复杂性。
  5. 编码器和解码器的灵活性:Feign支持自定义编码器和解码器,使得开发者可以根据需要处理请求和响应的序列化与反序列化,适应不同的数据传输需求。
  6. 日志记录和监控:Feign提供了详细的日志记录功能,有助于调试和监控服务调用,这对于维护和优化服务间通信至关重要。
  7. 错误处理:Feign允许定义全局和局部的错误处理策略,使得异常管理更加集中和一致。
  8. 声明式REST客户端:Feign的声明式特性使得服务接口的定义与实现分离,提高了代码的可读性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Compose multiplatform教程12】【组件】Box组件

查看全部组件文章浏览阅读493次,点赞17次,收藏11次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Box 功能说明:简单的布局组件,可容纳其他组件,并依据alignment属性精确指定内部组件的对…

RT-DETR学习笔记(3)

九、损失函数 整理所需参数 decoder的输出结果:6层decoderlayer的类别以及bbox预测 将500个query拆分成300(300个query)200(denoising query) 1. 最后一层的decoder的输出的300部分,单独存储到out中的"pred_logits"和“…

处理元素卡在视野边界,滚动到视野内

效果图如下: 本示例处理场景:点击底部的折叠面板,展开后移动端滚动条位置不变,导致展开内容在视图外。造成面板展开无内容的错觉。 处理核心API: IntersectionObserver 此API可绑定元素并监听元素是否在视野内。若在视野外​​​…

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署 flyfish 1. 确保 vm.max_map_count ≥ 262144 这是指要调整Linux内核参数vm.max_map_count,以确保其值至少为262144。这个参数控制着进程可以映射的最大内存区域数量。对于某些应用程序(如Ela…

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现 关于鸿蒙云捐助项目,前面的内容已使用云函数,云数据库分别实现云捐助项目首页中的项分类导航,底部导航,轮播图功能,这里继续实现云数据库加载捐赠…

Confluent Cloud Kafka 可观测性最佳实践

Confluent Cloud 介绍 Confluent Cloud 是一个完全托管的 Apache Kafka 服务,提供高可用性和可扩展性,旨在简化数据流处理和实时数据集成。用户可以轻松创建和管理 Kafka 集群,而无需担心基础设施的维护和管理。Confluent Cloud 支持多种数据…

SpringCloudAlibaba升级手册-nacos问题记录

目录 一、前言 二、升级过程 1.问题 2.原因 3.出处 4.理论解决 5.测试环境问题 6.Spring Cloud Alibaba版本对比 7. Spring Cloud Alibaba适配组件版本对比 8.降低Spring Cloud版本 9.SpringCloud与SpringBoot兼容对比表 10.naocs-client版本对比 三、最终解决 一…

15、【OS】【Nuttx】OS裁剪,运行指定程序,周期打印当前任务

背景 接之前wiki【Nsh中运行第一个程序】https://blog.csdn.net/nobigdeal00/article/details/144728771 OS还是比较庞大,且上面搭载了Nsh(Nuttx Shell),需要接入串口才能正常工作,一般调试的时候用,非调试…

C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)

有一个winform项目,需要借助一个web项目来显示,并且对web做一些操作,web页目是需要用谷歌内核,基于谷歌 Chromium项目的开源Web Browser控件来开发写了一个demo。 安装步骤 第一步:右键项目,点击 管理NuGet程序包 , 输…

通过远程控制软件实现企业高效协作

在这个信息技术迅猛发展的时代,远程办公已经成为一种趋势,而远程控制软件则是连接分散团队的重要工具。技术的革新不仅推动了远程控制软件的广泛应用,也为现代办公带来了高效的协作体验。本文将探讨远程控制软件的发展,并以RayLin…

赋能开发者 | 麒麟信安受邀参加2024开放原子开发者大会,以技术为引领,以人才创发展

12月20至21日,以“一切为了开发者”为主题的“2024开放原子开发者大会暨首届开源技术学术大会”在湖北武汉举办。本届大会由开放原子开源基金会、中国通信学会联合主办,旨在贯彻落实国家软件发展战略,加速培育壮大我国开源生态。工业和信息化…

每天40分玩转Django:Django国际化

Django国际化 一、今日学习内容概述 学习模块重要程度主要内容国际化基础⭐⭐⭐⭐⭐基本概念、配置设置字符串翻译⭐⭐⭐⭐⭐翻译标记、消息文件模板国际化⭐⭐⭐⭐模板标签、过滤器动态内容翻译⭐⭐⭐⭐模型字段、表单翻译 二、国际化基础配置 # settings.py# 启用国际化 …

Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南

一、前言 在国内数字化转型浪潮和 信创 大背景下,“替代进口”成为许多企业级应用所需要面对的重要课题,搜索领域也不例外。 Elasticsearch(简称 ES)作为一款业界领先的全文搜索和分析引擎,虽然功能强大,但…

Ubuntu 24.04.1 LTS 配置静态固定IP地址

查看网络配置信息 ip addr使用该命令查看网卡名字,一般是ens33或者ens32 修改配置文件 打开 /etc/netplan/下面的yaml配置文件 根据自己的需要配置 network:ethernets:ens33: # 配置的网卡的名称addresses: [192.168.23.140/24] # 配置的静态ip地址和掩码d…

Deep Deterministic Policy Gradient (DDPG)算法

代码 import torch import torch.nn as nn import torch.optim as optim import numpy as np import gym import random from collections import deque# 定义 Actor 网络 class Actor(nn.Module):def __init__(self, state_dim, action_dim, max_action):super(Actor, self).…

C++ OCR 文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时,遇到如下报错: 报错原因: 正则表达式的 search 或 finditer 方法没有找到任何匹配项,可能是换行符处理不当等。 解决方法如下: 在正则表达式末尾加上re.S即可,re.S是一个编译标志&#xff0c…

JVM实战—3.JVM垃圾回收的算法和全流程

大纲 1.JVM内存中的对象何时会被垃圾回收 2.JVM中的垃圾回收算法及各算法的优劣 3.新生代和老年代的垃圾回收算法 4.避免本应进入S区的对象直接升入老年代 5.Stop the World问题分析 6.JVM垃圾回收的原理核心流程 7.问题汇总 1.JVM内存中的对象何时会被垃圾回收 (1)什么…

基于SpringBoot在线音乐系统平台功能实现十八

一、前言介绍: 1.1 项目摘要 随着互联网技术的迅猛发展和普及,人们对音乐的获取和欣赏方式发生了巨大改变。传统的音乐播放方式,如CD、磁带或本地下载的音乐文件,已经不能满足用户日益增长的需求。用户更希望通过网络直接获取各…

RouYi-Vue框架,环境搭建以及使用

使用若以框架需要配置node.js,如果不了解可以去看node.js安装,uni-app的配置使用_uniapp使用nodejs类库-CSDN博客 安装若依 首先是去若以官网下载自己所需要的框架类型 RuoYi-Vue: 🎉 基于SpringBoot,Spring Security&#xff…