SpringCloud-04-Feign

news2024/12/23 20:34:51

一、Feign介绍

  1. Feign是一个声明式web服务客户机。
  2. 它使编写web服务客户机更容易。
  3. 要使用Feign创建一个接口并对其进行注释。
  4. 它具有可插入注释支持,包括Feign注释和JAX-RS注释。
  5. Feign还支持可插式编码器和解码器。
  6. Spring Cloud增加了对Spring MVC注释的支持,并支持使用Spring Web中默认使用的HttpMessageConverters。
  7. Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker以及Spring Cloud LoadBalancer,在使用Feign时提供一个负载平衡的http客户端。
  8. 内部集成了ribbon负载均衡

二、Feign常用注解

使用 Fegin 进行远程服务调用时,常用注解如下表。 

注解说明
@FeignClient 该注解用于通知 OpenFeign 组件对 @RequestMapping 注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡和服务调用。
@EnableFeignClients该注解用于开启 OpenFeign 功能,当 Spring Cloud 应用启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口,生成代理并注册到 Spring 容器中。
@RequestMappingSpring MVC 注解,在 Spring MVC 中使用该注解映射请求,通过它来指定控制器(Controller)可以处理哪些 URL 请求,相当于 Servlet 中 web.xml 的配置。
@GetMappingSpring MVC 注解,用来映射 GET 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。
@PostMappingSpring MVC 注解,用来映射 POST 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.POST) 。

三、快速使用Feign

1、引入Feign依赖

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

2、在启动类上添加注解 @EnableFeignClients

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {

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

3、定义和使用Feign客户端

  • 在@FeignClient注释中,String值(上面的“stores”)是一个任意的客户端名称,用于创建Spring Cloud LoadBalancer客户端。
@FeignClient("userService")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

4、使用FeignClient中定义的方法替代RestTemplate

@Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private UserClient userClient;
    //    public Order queryOrderById(Long orderId) {
//        // 1.查询订单
//        Order order = orderMapper.findById(orderId);        // 2.利用RestTemplate发起http请求,查询用户
//        // 2.1 url路径
//        String url="http://userservice/user/"+order.getUserId();
//        // 2.2 发送http请求,实现远程调用
//        User user = restTemplate.getForObject(url, User.class);
//        // 3.封装user到Order
//        order.setUser(user );
//        // 4.返回
//        return order;
//    }
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);        // 2.利用RestTemplate发起http请求,查询用户
        // 2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

 四、自定义Feign的配置

Feign运行自定义配置来覆盖默认配置,可修改的配置如下:

类型  作用说明
feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便与通过http请求发送
feign.Contract支持的注解形式默认是SpringMVC的注解
feign.Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

 配置Feign日志有两种方式:

方式一:配置文件方式

①全局生效

feign:
  client:
    config:
      default:  # 这里default就是全局配置,如果写服务名称就是针对某个微服务的配置
      loggerLevel: BASIC     # 日志级别

②局部生效

feign:
  client:
    config:
      userservice:  # 这里用default就是全局配置,如果写服务名称就是针对某个微服务的配置
      loggerLevel: BASIC  # 日志级别

 方式二:java代码方式,需要先声明一个Bean

public class DefaultFeignConfig {
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}

①如果是全局配置,则把它放在@EnableFeignClients这个注解中

@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)

②如果是局部配置,则把它放到@FeignClient这个注解中

@FeignClient(value = "userService",configuration = DefaultFeignConfig.class)

 五、Feign性能优化

 Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

因此优化Feign的性能主要包括:

        ①使用连接池代替默认的 URLConnection

        ②日志级别,最好用BASIC或者NONE

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

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

相关文章

10个全球最佳免费土地覆被/土地利用数据资源

不知道大家有没有想过&#xff0c;在我们来到地球的一生时间中&#xff0c;地球会有多大的变化呢? 是在空旷的草地新建了公园&#xff0c;还是低矮的平房变成了一座座大厦? 这些林林总总的变化&#xff0c;总是令人应接不暇。然而&#xff0c;在漫长的人类历史历程中&#xf…

2022亚太数学杯数学建模竞赛A题(思路分析......)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Java数据类型:基本数据类型和引用数据类型

Java 语言是强类型语言&#xff0c;编译器存储在变量中的数值具有适当的数据类型。学习任何一种编程语言都要了解其数据类型&#xff0c;下面将详细介绍 Java 中的数据类型。 Java 语言支持的数据类型分为两种&#xff1a;基本数据类型&#xff08;Primitive Type&#xff09;…

NET CORE Configuraion 使用详解

相关配置 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp3.1</TargetFramework></PropertyGroup><ItemGroup><!--读取配置的核心包--><Packa…

谷歌浏览器自定义标签页 newtab

创建一个文件夹, 里面放置信息: 其中&#xff0c; manifest.json 不能变&#xff0c; home.html 是新的标签页信息 manifest.json 内容: {"chrome_url_overrides": {"newtab": "home.html"},"manifest_version": 2,"name"…

新知实验室TRTC 初体验

引言 随着短视频行业的不断发展&#xff0c;人们对实时音视频的需求越来越多。在线直播&#xff08;秀场直播、电商直播、赛事直播、新品发布会、路演、在线拍卖&#xff09;的相关产品不断涌现&#xff0c;百花齐放。对于业务来说&#xff0c;自研开发一个实时音视频服务&…

spring boot 过滤器拦截器与aop

目录 一、过滤器 (Filter) 1.1 什么是过滤器 1.2 springboot配置过滤器 方式一&#xff1a;使用WebFilter 二、拦截器(Interceptor) 2.1 什么是拦截器 2.2 使用拦截器方法 三、拦截器&过滤器与spring aop的区别 3.1 区别 3.2添加aop 适用场景&#xff1a; 拦截…

Vue3中jsx父子传值、provide和inject、v-memo指令、Teleport内置组件、KeepAlive缓存组件、transition过渡组件

文章目录1. jsx父子传值2. provide和inject3. v-memo指令4. Teleport内置组件5. KeepAlive缓存组件6. transition过渡组件1. jsx父子传值 父组件&#xff1a; <template><div><child :title"title" :setTitle"setTitle" /></div>…

GitHub下载量过百万,阿里P8秘密分享的「亿级并发系统设计」真香

随着互联网的不断发展&#xff0c;CPU硬件的核心数也在不断进步&#xff0c;并发编程越来越普及&#xff0c;但是并发编程并不像其他业务那样直接了当。在编写并发程序时&#xff0c;我们常常都会出现各种漏洞&#xff0c;这些问题往往都突然出现&#xff0c;然后又迅速消失&am…

Java编码与解码

首先区分加密与编码并不是一回事&#xff0c; 本节主要讲述常见的三种编解码方式&#xff0c;分别为&#xff1a;Unicode、URL、Base64。 常见编码算法&#xff1a; Unicode编码&#xff1a;每一字符都可变成以 \u 开头&#xff0c;长度为6的字符串。URL编码&#xff1a;以百分…

Java并发编程--多线程间的同步控制和通信

使用多线程并发处理&#xff0c;目的是为了让程序更充分地利用CPU &#xff0c;好能加快程序的处理速度和用户体验。如果每个线程各自处理的部分互不相干&#xff0c;那真是极好的&#xff0c;我们在程序主线程要做的同步控制最多也就是等待几个工作线程的执行完毕&#xff0c;…

JS表达式完全攻略

在语法概念中&#xff0c;运算符属于词&#xff0c;表达式属于短语。表达式由一个或多个运算符、操作数组成的运算式。表达式的功能是执行计算&#xff0c;并返回一个值。 表达式的形式 表达式是一个比较富有弹性的运算单元。简单的表达式就是一个直接量、常量或变量。例如&a…

【优化调度】粒子群算法求解水火电调度优化问题【含Matlab源码 1181期】

⛄一、粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型&#xff0c;在他的仿真中&#xff0c;每一个个体都遵循&#xff1a;避免与邻域个体相撞&#xff1a;匹配邻域个体…

Java面向对象之——封装

文章目录前言一、封装的概念二、何为封装&#xff1f;三、封装拓展——包&#x1f351;1、包的概念&#x1f351;2、导入包中的类&#x1f351;3、自定义包&#x1f351;4、常见的包四、访问限定符&#x1f351;1、public修饰符&#x1f351;2、private修饰符&#x1f351;3、默…

软件产品确认测试包括哪些方面

1.技术方面 确认测试又称有效性测试&#xff0c;是在模拟的环境下&#xff0c;运用黑盒测试的方法&#xff0c;验证被测软件是否满足需求规格说明书列出的需求。 确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后&#xff0c;已经按照设计把所有的模…

Docker 下 jitsi-meet 视频服务器 安装部署

一、参考网站 官网文档地址&#xff1a;Self-Hosting Guide - Docker | Jitsi Meet 二、Docker 版本 三、安装部署 3.1、下载并解压缩安装包 地址&#xff1a;Release stable-8044: release jitsi/docker-jitsi-meet GitHub CSDN地址&#xff1a;docker-jitsi-meet-stab…

visdom安装及使用

目录1. 安装visdom的流程2. 使用流程1. 安装visdom的流程 重点参考链接&#xff1a;visdom安装出现Downloading scripts, this may take a little while然后就不动了 先去到github直接下载了visdom的压缩包&#xff1a;https://github.com/fossasia/visdom然后将visdom-maste…

第七章 数学 6 AcWing 1593. 整数分解

第七章 数学 6 AcWing 1593. 整数分解 原题链接 AcWing 1593. 整数分解 算法标签 数学 数论 DP 背包问题 思路 类似AcWing 12. 背包问题求具体方案 把n看成背包的容积N 因为n最多不超过400&#xff0c;然而p进制最少为2 所以物品的价值最大可以取到20(因为20^2 400) 所以…

Python读取CSV文件,数值精度丢失

Excel保存为csv以后&#xff0c;大数值的列&#xff0c;会把转换为科学计数法&#xff0c;而且后边几位都会被转为0. 搞了很多方法,最后直接安装 openpyxl 组件 和 pandas&#xff0c; 读取Excel文件就行了。 data pd.read_excel("C:/work/20221111AI/cleaned_data_noTi…