SpringCloud Alibaba 微服务(三):OpenFeign

news2024/12/24 20:19:28

目录

前言

一、什么是OpenFeign?

Feign 的实现

Feign 和 OpenFeign 的区别

二、OpenFeign的优点

三、基本用法

新建子工程

配置文件

服务注册

​编辑

新建Controller

引入依赖

创建接口

启动类开启Feign注解

访问测试

四、@FeignClient 标签的常用属性

1、name

2、url

3、configuration

4、fallback

5、fallbackFactory

6、path

7、decode404

8、primary

9、contextId

五、添加请求头信息

1、在方法参数上添加请求头信息

2、使用 Feign 配置类定义请求拦截器

定义请求拦截器

应用配置类

3、动态添加请求头信息

总结


前言

在微服务架构中,服务之间的通信是一个非常重要的环节。为了简化和高效地进行服务间通信,Spring Cloud 提供了 OpenFeign 这个强大的工具。本文将介绍 OpenFeign 的概念、优点、基本用法以及在实际项目中的应用。也希望通过本文,能够帮助你们在 Spring Cloud 项目中轻松地集成和使用 OpenFeign。


一、什么是OpenFeign?

OpenFeign 是一个声明式的 HTTP 客户端,用于简化微服务间的 HTTP 调用。它集成了 Ribbon 以实现负载均衡,并且与 Eureka、Consul 等服务发现组件无缝对接。通过使用 OpenFeign,开发者只需要定义接口并使用注解来配置 HTTP 请求,而无需编写大量的模板代码。

Feign 的实现

Feign 在 Ribbon + RestTemplate 基础上做了进一步封装, 它来帮助我们定义和实现依赖服务接口的定义。在 Feign 的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是在 Dao 接口上面标注 Mapper 注解,现在是一个 Service 接口上面标注 Feign 注解),即可完成对服务提供方的接口绑定,简化了使用 Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。

Feign 和 OpenFeign 的区别

依赖

作用

Feign

org.springframework.cloud   spring-cloud-starter-feign

Feign 是 Spring Cloud 组件中的一个轻量级 RESTful 的 HTTP 服务客户端。Feign 内置了 Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign 的使用方式是:使用 Feign 的注解定义接口,调用这个接口就可以调用服务注册中心的服务。

OpenFeign

org.springframework.cloud spring-cloud-starter-openfeign

OpenFeign 是 Spring Cloud 在Feign 的基础上支持了 SpringMVC的注解如 @RequesMapping 等等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

二、OpenFeign的优点

声明式调用:通过注解定义 HTTP 请求,代码更简洁。

集成 Ribbon:支持客户端负载均衡。

支持服务发现:与 Eureka、Consul 等服务发现组件无缝集成。

支持熔断:与 Hystrix、Sentinel 等熔断器集成,提升系统稳定性。

可扩展:支持自定义拦截器、编码器和解码器,便于扩展和定制化。

三、基本用法

新建子工程

配置文件

server:
  port: 9091

spring:
  application:
    name: demo-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.85:8848
        namespace: demo
      config:
        server-addr: 192.168.1.85:8848
        prefix: ${spring.application.name}
        file-extension: yml
        namespace: demo
<dependencies>
    <!-- Nacos 服务发现 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

服务注册

新建Controller

引入依赖

user模块引入OpenFeign依赖

创建接口

启动类开启Feign注解

在用户模块的启动类,加上 @EnableFeignClients 注解。

访问测试

如图所示,证明已经访问成功了。

四、@FeignClient 标签的常用属性

@FeignClient 注解是 Spring Cloud OpenFeign 中用于声明一个 Feign 客户端的核心注解。它可以用来指定服务的名称、配置类、负载均衡策略等。下面是 @FeignClient 注解的一些常用属性及其用途:

1、name

name 属性用于指定 Feign 客户端调用的服务名称。这是一个必填属性,通常是注册在服务发现(如 Nacos)中的服务名。

@FeignClient(name = "demo-user")
public interface UserClient {
    // ...
}

2、url

url 属性用于指定服务的 URL,通常用于调试或服务未注册到服务发现时。url 属性会覆盖 name 属性。

@FeignClient(name = "demo-user", url = "http://localhost:8080")
public interface UserClient {
    // ...
}

3、configuration

configuration 属性用于指定自定义配置类,配置类可以用来定制 Feign 客户端的行为,如请求拦截器、编码器和解码器等。

@FeignClient(name = "demo-user", configuration = FeignConfig.class)
public interface UserClient {
    // ...
}

配置类示例

@Configuration
public class FeignConfig {
    @Bean
    public RequestInterceptor requestInterceptor() {
        return template -> template.header("Custom-Header", "CustomHeaderValue");
    }
}

4、fallback

fallback 属性用于指定服务降级的实现类。当 Feign 客户端调用失败时,会调用 fallback 指定的类中的方法。

@FeignClient(name = "demo-user", fallback = UserClientFallback.class)
public interface UserClient {
    // ...
}

@Component
public class UserClientFallback implements UserClient {
    @Override
    public User getUserById(Long id) {
        return new User(); // 返回一个默认的用户对象
    }
}

5、fallbackFactory

fallbackFactory 属性用于指定服务降级的工厂类,该工厂类可以提供更多的上下文信息,例如异常信息。

@FeignClient(name = "demo-user", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {
    // ...
}

@Component
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable cause) {
        return new UserClient() {
            @Override
            public User getUserById(Long id) {
                // 返回一个默认的用户对象,并打印异常信息
                System.out.println("Fallback cause: " + cause);
                return new User();
            }
        };
    }
}

6、path

path 属性用于指定服务的统一前缀路径,在定义 Feign 接口的方法时可以省略该路径。

@FeignClient(name = "demo-user", path = "/api/users")
public interface UserClient {
    @GetMapping("/{id}")
    User getUserById(@PathVariable("id") Long id);
}

7、decode404

decode404属性用于指定是否将 HTTP 404 响应解码为 Feign 客户端的 fallback,默认值为 false。

@FeignClient(name = "demo-user", decode404 = true)
public interface UserClient {
    // ...
}

8、primary

primary属性用于指定该 Feign 客户端是否为主要的 @Primary Bean,这对某些场景下的自动装配很有用,默认值为 true。

@FeignClient(name = "demo-user", primary = false)
public interface UserClient {
    // ...
}

9、contextId

contextId 属性用于在多 Feign 客户端实例中区分不同的上下文 ID。特别适用于多个 Feign 客户端指向同一服务时的配置。

@FeignClient(name = "demo-user", contextId = "userClient1")
public interface UserClient1 {
    // ...
}

@FeignClient(name = "demo-user", contextId = "userClient2")
public interface UserClient2 {
    // ...
}

@FeignClient 注解通过丰富的属性配置,提供了强大的功能来满足不同场景下的微服务调用需求。通过合理使用这些属性,可以定制化 Feign 客户端的行为,提升微服务间的通信效率和容错能力。

五、添加请求头信息

1、在方法参数上添加请求头信息

示例:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;

@FeignClient(name = "demo-user")
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id, @RequestHeader("Authorization") String token);
}

在调用接口时,传递请求头参数:

@RestController
public class UserController {
    
    @Autowired
    private UserClient userClient;

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable("id") Long id) {
        String token = "xxxxxxxxxxxxxxxxxxxx";
        return userClient.getUserById(id, token);
    }
}

2、使用 Feign 配置类定义请求拦截器

如果需要在所有请求中添加相同的请求头,可以通过定义一个 Feign 请求拦截器来实现。

定义请求拦截器

创建一个 Feign 配置类,并定义请求拦截器:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {

    @Bean
    public RequestInterceptor requestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                template.header("Authorization", "xxxxxxxxxxxxxxxxx");
            }
        };
    }
}

应用配置类

在 Feign 客户端接口上指定配置类:

@FeignClient(name = "demo-user", configuration = FeignConfig.class)
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

这样,每次调用 UserClient 的方法时,请求头中都会自动包含 Authorization:xxxxxxxxxxxxx

3、动态添加请求头信息

如果需要根据某些条件动态添加请求头信息,可以在拦截器中编写逻辑:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

@Configuration
public class FeignConfig {

    @Bean
    public RequestInterceptor requestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                if (attributes != null) {
                    HttpServletRequest request = attributes.getRequest();
                    String token = request.getHeader("Authorization");
                    if (token != null) {
                        template.header("Authorization", token);
                    }
                }
            }
        };
    }
}

这种方式可以将来自原始 HTTP 请求的请求头信息传递给 Feign 客户端的请求。


总结

本文介绍了 OpenFeign 的基本概念、优点以及在 Spring Boot 项目中的基本用法。OpenFeign 作为声明式的 HTTP 客户端,大大简化了微服务间的通信,使代码更加简洁和易于维护。在实际项目中,OpenFeign 还提供了许多高级特性,如超时设置、自定义拦截器和熔断器集成等,可以根据具体需求进行灵活配置。

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

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

相关文章

solidity抽象(abstract)合约(很常用)

当合约中至少有一个函数没有被实现&#xff0c; 或者合约没有为其所有的基本合约构造函数提供参数时&#xff0c; 合约必须被标记为 abstract。 即使不是这种情况&#xff0c;合约仍然可以被标记为 abstract&#xff0c; 例如&#xff0c;当您不打算直接创建合约时。 抽象&a…

Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo

Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo 1. 前提是咱们的Chatchat服务一起部署好了&#xff0c;可以参考 Langchain-Chatchat3.1版本docker部署流程——知识库问答 2. 搜索引擎 DuckDuckGo&#xff1a;该搜索引擎不需要key&#xff0c;但是需要全球上网服务&…

MongoDB change stream 详解

文章目录 什么是 Chang Streams实现原理故障恢复使用场景Spring Boot整合Chang Stream 什么是 Chang Streams Change Stream指数据的变化事件流&#xff0c;MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案&#xff0c;类…

MySQL基础练习题16-电影评分

题目 准备数据 分析数据 总结 题目 查找评论电影数量最多的用户名。如果出现平局&#xff0c;返回字典序较小的用户名。 查找在 February 2020 平均评分最高 的电影名称。如果出现平局&#xff0c;返回字典序较小的电影名称。 准备数据 ## 创建库 create database db; u…

微信小程序电商直播功能如何开通?

作者&#xff1a;阿龙 目前&#xff0c;公域直播电商平台&#xff08;抖音、快手、视频号等&#xff09;的获客流量成本越来越高&#xff0c;同时监管规则越来越严&#xff0c;扣点越来越高&#xff0c;并且没有用户分销机制&#xff0c;这些都在迫使商家尽快建立自己的私域直…

苹果Vision Pro在中国市场遇冷?连黄牛都炒不动了

随着科技巨头苹果公司推出的首款混合现实头戴设备Vision Pro正式登陆中国市场&#xff0c;这款备受瞩目的产品引发了广泛关注。 然而&#xff0c;短短一周之后&#xff0c;许多早期尝鲜的用户却开始陆续退场。究竟是什么原因导致大量用户选择退场呢&#xff1f;本文将从多个维…

绝密!OceanBase OBCP备考模拟题讲解(3)

「源de爸讲数据库」每天更新OceanBase OBCP题库及全网独家超详细题目解析&#xff0c;祝您早日持证上岸&#xff01; 现如今&#xff0c;一大批国产数据库随着国产化浪潮&#xff0c;已经逐步被越来越多的人认可。OceanBase便是其中一个优秀代表。 做这个日更专题&#xff0c…

ESP32-C2 烧录

自动下载电路 dtr rts &#xff1b;WCH 提供了相应的芯片&#xff0c;实现自动下载 CH340X &#xff08;*不要使用天问的下载器&#xff0c;电压为5V&#xff0c;下载前会重启电源&#xff0c;导致无法识别ESP芯片&#xff0c;修改&#xff0c;将电源线重引出 使用IDF编辑完成…

实测体验:劣质宠物空气净化器有啥危害?值得买的养宠空气净化器

作为一名猫咖店老板&#xff0c;换季时节&#xff0c;家中不仅要面对恼人的异味&#xff0c;还要忍受满天飞舞的猫毛&#xff0c;真是让人头疼。虽然和毛孩子在一起充满了乐趣&#xff0c;但随之而来的毛发和异味问题却令人苦不堪言。普通的空气净化器虽然能净化空气&#xff0…

写一个图片裁剪的js,JavaScript图片裁剪插件PlusCropper

在前端开发中&#xff0c;图片裁剪是一个常见的需求。本文将深入解析一个功能完善的JavaScript图片裁剪插件——PlusCropper&#xff0c;带你一步步了解其实现原理和使用方法。 一、插件概述 PlusCropper是一个轻量级的JavaScript插件&#xff0c;它允许用户在网页上交互式地…

CTFHUB-文件上传-双写绕过

开启题目 1.php内容&#xff1a; <?php eval($_POST[cmd]);?> 上传一句话木马 1.php&#xff0c;抓包&#xff0c;双写 php 然后放包&#xff0c;上传成功 蚁剑连接 在“/var/www/html/flag_484225427.php”找到了 flag

How Can I display Reference/Citation using Streamlit Application?

题意&#xff1a;怎样在Streamlit应用程序中显示参考文献或引用&#xff1f; 问题背景&#xff1a; I have created an Azure AI Search Service, created index using Azure Blob Storage and Deployed a web application and made a chat Playground using AzureOpenAI. 我…

CSS使用渐变实现Chrome标签栏效果

这次来看一个带特殊圆角导航栏布局&#xff0c;如下谷歌浏览器的标签栏&#xff1a; 这样一个布局如何实现呢&#xff1f; CSS 渐变几乎是无所不能的&#xff0c;什么的图形都能绘制&#xff0c;这里可以拆分一下&#xff0c;两个矩形&#xff0c;两个圆形&#xff0c;还有两个…

计算机毕业设计选题推荐-二手闲置交易系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

目标检测 | yolov2/yolo9000 原理和介绍

前言&#xff1a;目标检测 | yolov1 原理和介绍 简介 论文链接&#xff1a;https://arxiv.org/abs/1612.08242 时间&#xff1a;2016年 作者&#xff1a;Joseph Redmon  作者首先在YOLOv1的基础上提出了改进的YOLOv2&#xff0c;然后提出了一种检测与分类联合训练方法&#…

【Linux网络编程】套接字Socket(UDP)

网络编程基础概念&#xff1a; ip地址和端口号 ip地址是网络协议地址&#xff08;4字节32位&#xff0c;形式&#xff1a;xxx.xxx.xxx.xxx xxx在范围[0, 255]内&#xff09;&#xff0c;是IP协议提供的一种统一的地址格式&#xff0c;每台主机的ip地址不同&#xff0c;一个…

五个优秀的免费 Ollama WebUI 客户端推荐

认识 Ollama 本地模型框架&#xff0c;并简单了解它的优势和不足&#xff0c;以及推荐了 5 款开源免费的 Ollama WebUI 客户端&#xff0c;以提高使用体验。 什么是 Ollama&#xff1f; Ollama 是一款强大的本地运行大型语言模型&#xff08;LLM&#xff09;的框架&#xff0c…

一键操作!Win11用户将排除项添加到安全中心的方法

在Win11电脑操作中&#xff0c;Windows安全中心提供了添加排除项的功能&#xff0c;让用户可以自定义哪些文件、文件夹或进程免于Microsoft Defender的扫描&#xff0c;从而防止误报正常程序为安全威胁。但许多新手不知道具体如何操作才能成功添加排除项&#xff1f;那么就来看…

【PGCCC】pg_show_plans:显示所有正在运行的语句的查询计划

PostgreSQL 扩展可显示所有当前正在运行的 SQL 语句的查询计划。查询计划可以以多种格式显示&#xff0c;例如JSON或YAML。 此扩展在共享内存中创建哈希表。哈希表不可调整大小&#xff0c;因此一旦填满&#xff0c;就无法添加新计划。 安装 支持 PostgreSQL 版本 12 及更新…

学Python可少不了项目练手,这8个小项目有趣又实用,小白也能做出来_python练手项目,python教程

学习之路比较科学的学习方法是理解了之后把知识点进行运用&#xff0c;找一些开源的小项目做是最好的&#xff0c;站在岸上是学不会游泳的&#xff0c;光看健身视频是减不了肥的&#xff0c;不自己动手敲代码是学不会编程的。 我在找了8个比较有趣的小项目&#xff0c;技术水平…