五、Spring Cloud Alibaba-Feign

news2024/12/23 6:43:19

引入

基于之前的学习,我们目前调用是通过restTemplate硬编码方式调用的。

 restTemplate.getForObject("http://stock-service/stock/reduce", String.class);

还是很不方便,考虑直接用service.方法进行调用,从而引出Feign,实现接口的远程调用。

Java项目中常见的接口调用有:httpClient、okhttp、httpURLConnection、RestTemplate、webClient。
其次还有Feign的远程调用。

一、什么是Feign?

Feign是NetFlix开发的声明式、模板化的HTTP客户端。
spring Cloud OpenFeign对Feign进行了增强,使其支持spring MVC注解,另外还整合了Ribbon和nacos,从而使得Feign的使用更加方便。
所以我们都是使用openFeign。

Ribbon、Nacos、Feign三个结合使用是我们入门必学。

优势:Feign可以做到使用HTTP请求远程服务像调用本地方法一样的体验。

二、spring Cloud Alibaba整合openfeign

项目结构:
在这里插入图片描述

1、引入依赖

<!--添加openfeign依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、写一个FeignService接口—feign.StockFeignService

/**
 * name : 指定调用接口的服务名
 * path : 指定调用接口所在的controller指定的@RequestMapping
 */
@FeignClient(name = "stock-service",path = "/stock")
public interface StockFeignService {

    //声明需要调用的接口对应的方法,即对应着远程接口的方法,和本地service一样的模式。
    @RequestMapping("/reduce")
    public  String reduce();
}

//此处是对应库存的接口,和上面openfeign的service进行一个对比
//
//@RestController
//@RequestMapping("/stock")
//public class StockController {
//
//    @Value("${server.port}")
//    private  String port;
//
//    @RequestMapping("reduce")
//    public  String reduce(){
//        System.out.println("扣减库存");
//        return "扣减库存:"+port;
//    }
//}

其他说明:
远程接口项目结构如图,之前nacos篇讲过,其实就是一个sprign could服务。
在这里插入图片描述

3、使用stockFeignService调用远程的接口,注入调用接口

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private StockFeignService stockFeignService;
    @RequestMapping("/add")
    public String add(){
        System.out.println("新增订单");
        String reduce = stockFeignService.reduce();
        return "openFeign远程调用:"+reduce;
    }
    }
    
}

4、需再启动类上加上@EnableFeignClients注解。

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

}

5、测试
在这里插入图片描述

三、openFeign日志配置

Feign 提供了很多的扩展机制,让用户可以更加灵活的使用。
有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要配置 Feign 的日志了,以此让 Feign 把请求信息输出来。
日志配置有两种全局配置和局部配置

1、全局配置

(1)定义一个配置类,指定日志级别

/**
 * @Description:
 * 全局配置 当使用@Configuration 会将配置作用在所有的服务提供方
 * 局部配置 如果只想针对某个服务进行配置,就不要加 @Configuration
 * @Date: 2023/5/8 23:56
 */
@Configuration
public class FeignConfig {

    //Logger使用import feign.Logger;
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

通过源码可以看到日志等级有 4 种,分别是:

  • NONE[性能最佳,适用于生产]: 不记录任何日志 (默认值) 。
  • BASIC[适用于生产环境追踪问题]:仅记录请求方法、URL、响应状态代码以及执行时间。
  • HEADERS: 记录BASIC级别的基础上,记录请求和响应的header。
  • FULL[比较适用于开发及测试环境定位问题]: 记录请求和响应的header、 body和元数据。

(2)修改配置文件Feign中service的日志输出级别

#springboot 默认的日志级别是info ,feign 的debug日志就不会输入
#重新修改一下feign下的servicer日志级别
logging:
  level:
    com:
      tc:
        order:
          feign: debug

(3)调用接口http://localhost:8830/order/add测试。

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private StockFeignService stockFeignService;
    @Autowired
    private ProductFeignService productFeignService;
    @RequestMapping("/add")
    public String add(){
        System.out.println("新增订单");
        String reduce = stockFeignService.reduce();

        String product = productFeignService.get(1);
        return "openFeign远程调用:"+reduce + "---"+product;
    }

}

日志输出:
在这里插入图片描述

2、局部配置,让调用的微服务生效

方法一:在@FeignClient 注解中指定使用的配置类。
(1)去除上面1(1)中FeignConfig配置类中的@Configuration注解。
(2)在对应的FeignService中的@FeignClient 注解中指定使用的配置类。
例如在ProductFeignService加入configuration = FeignConfig.class指定日志级别的配置类。

@FeignClient(name = "product-service",path = "/product",configuration = FeignConfig.class)
public interface ProductFeignService {

    @RequestMapping("/{id}")
    public String get(@PathVariable("id") Integer id);
}

方法二:配置文件配置。单个服务的日志建议使用配置文件的方式。

#springboot 默认的日志级别是info ,feign 的debug日志就不会输入
#重新修改一下feign下的servicer日志级别
logging:
  level:
    com:
      tc:
        order:
          feign: debug

#Feign 日志局部配置
feign:
  client:
    config:
      stock-service: #服务名
        loggerLevel: BASIC

四、openFeign契约配置

spring cloud 在 Feign 的基础上做了扩展,使用spring mvc的注解来完成Feign的功能,原生的Feign是不支持spring MVC 注解的,如果想在spring cloud中使用原生的注解方式来定于客户端也是可以的,通过契约来改变这个配置,Spring Cloud 中默认的是SpringMvcContract。

Spring Cloud 1 早期版本就是用的原生Fegin.随着netflix的停更替换成了Open feign。
配置文件配置契约,也可以写Bean配置类(用不到,不学了);
1、配置contract

#Feign 日志局部配置
feign:
  client:
    config:
      stock-service: #服务名
        loggerLevel: BASIC
        contract: feign.Contract.Default  #设置为默认的契约,还原成原生的注解

2、修改接口注解

@FeignClient(name = "stock-service",path = "/stock")
public interface StockFeignService {

    //声明需要调用的接口对应的方法
    //@RequestMapping("/reduce")
    //Feign 的原生注解
    @RequestLine(" GET /reduce")
    public  String reduce();
}

五、openFeign超时时间配置

可以配置类配置全局配置和配置文件指定服务配置。
方法一:配置类配置
通过 Optons 可以配置连接超时时间和读超时间,Optns 的第一个参数是连接的超时时间ms),默值是 2s;第二个是求处理的超时时间ms,默认值是5s。

@Configuration
public class FeignConfig {
    @Bean
    public Request.Options  options(){
        return new Request.Options(5000,1000);
    }
}

方法二:配置文件配置

#Feign 日志局部配置
feign:
  client:
    config:
      stock-service: #服务名
        loggerLevel: BASIC
        contract: feign.Contract.Default  #设置为默认的契约,还原成原生的注解
        #连接超时时间 默认2s
        connectTimeOut: 5000
        #请求处理超时时间 默认5s
        readTimeOut: 3000

六、openFeign自定义拦截器

自定义拦截器实现认证逻辑。
调用的时候,进行拦截在请求头写入参数等。

/**
 * @Description: Feign 拦截器
 * @Date: 2023/5/9 0:58
 */
public class FeignInterceptor implements RequestInterceptor {
    
    public void apply(RequestTemplate requestTemplate) {
        //todo
        System.out.println("Feign 拦截器。自行写逻辑");
    }
}

如何让拦截器生效
方法一:配置类

@Configuration
public class FeignConfig {

    //Logger使用import feign.Logger; 自定义日志
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }


    //自定义拦截器
    @Bean
    public FeignInterceptor feignInterceptor(){
        return new FeignInterceptor();
    }
}

方法二:配置类配置。

#Feign 日志局部配置
feign:
  client:
    config:
      stock-service: #服务名
        loggerLevel: BASIC
        contract: feign.Contract.Default  #设置为默认的契约,还原成原生的注解
        #连接超时时间 默认2s
        connectTimeOut: 5000
        #请求处理超时时间 默认5s
        readTimeOut: 3000
        #自定义拦截器
        requestInterceptors[0]: com.tc.order.interceptor.FeignInterceptor

拦截日志:
在这里插入图片描述

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

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

相关文章

vue+elementui+nodejs校园高校餐厅点餐及订餐菜品推荐评价系统6927k

传统的销售模式&#xff0c;在实体店的紧跟式的销售模式&#xff0c;会给消费者一种不自由&#xff0c;被监视的感觉。餐厅点餐及推荐系统&#xff0c;紧跟数据时代的步伐&#xff0c;使用nodejs开发语言&#xff0c;配备MySQL数据库。扎根于实际问题所开发出来的一套系统。这个…

总结845

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

Windows 10 安装 MySQL

确认是否已安装 MySQL &#xff08;1&#xff09;按【winr】快捷键打开运行&#xff1b; &#xff08;2&#xff09;输入 services.msc&#xff1b; &#xff08;3&#xff09;点击【确定】&#xff0c;在打开的服务列表中查找 mysql 服务&#xff0c;如果没有 mysql 服务&…

HTAP for MySQL 在腾讯云数据库的演进

摘要&#xff1a;MySQL在充分利用多核计算资源方面比较欠缺&#xff0c;无法同时满足在线业务和分析型业务的客户需求&#xff0c;而单独部署一套专用的分析型数据库意味着额外的成本和复杂的数据链路。本次主题将介绍腾讯云数据库为满足此类场景而在HTAP for MySQL产品方面进行…

【数据挖掘与商务智能决策】第十五章 智能推荐系统 - 协同过滤算法

第十五章 智能推荐系统 - 协同过滤算法 15.2 相似度计算三种常见方法 15.2.1 欧式距离 import pandas as pd df pd.DataFrame([[5, 1, 5], [4, 2, 2], [4, 2, 1]], columns[用户1, 用户2, 用户3], index[物品A, 物品B, 物品C]) df用户1用户2用户3物品A515物品B422物品C421 …

【AI大模型】SparkDesk讯飞星火认知大模型初体验-持续更新

文章目录 SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写写在最后 SparkDesk讯飞星火认知大模型简介 科大讯飞推出的新一代认知智能大模型&#xff0c;拥有跨领域的知识和语言理解能力&#xff0c;能够基于自然对话方式理解与执行任务。从海…

6.其他函数

1.时间日期类 -- current_date() 返回当前日期 -- date_add(date, n) 返回从date开始n天之后的日期 -- date_sub(date, n) 返回从date开始n天之前的日期 -- datediff(date1, date2) 返回date1-date2的日期差 -- year(date) 返回…

港联证券|“牛市旗手”频遭股东减持 机构仍看好板块后市表现

5月8日&#xff0c;证券板块再迎爆发。截至收盘&#xff0c;中国银河盘中触及涨停&#xff0c;收盘涨超7%&#xff0c;中银证券涨超5%&#xff0c;信达证券、光大证券、招商证券涨超4%。板块回暖之际&#xff0c;多家券商二季度却遭遇股东减持。业内人士认为&#xff0c;减持计…

算法--扫描线

写在前面&#xff1a; 这个算法理解还是挺好理解的&#xff0c;就是到后面解决面积并问题的时候开始难理解了&#xff0c;看了半天&#xff0c;主要是还有其他的知识没理解就开始搞这个了。虽然最后还是直接懂了。 文章目录 扫描线算法的介绍一维问题LintCode 391 数飞机题目…

【历史上的今天】5 月 9 日:中国黄页上线;Red Hat 创始人出生;Scratch 2.0 发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 9 日&#xff0c;在 1993 年的今天&#xff0c;第一届东亚运动会在上海隆重开幕&#xff0c;这是亚洲体育运动史上的新篇章。来自东亚地区的中国、日本、…

【笔记】【HTTP】《图解HTTP》第5章 与HTTP协做的Web服务器

前言 有输入就要有产出&#xff0c;该笔记是本人看完《图解HTTP》后对每章涉及到的知识进行汇总博客将会已书的每章为一篇发布&#xff0c;下一篇博客发布时间不确定笔记中有些个人理解后整理的笔记&#xff0c;可能有所偏差&#xff0c;也恳请读者帮忙指出&#xff0c;谢谢。…

信号signal编程测试

信号会打断系统调用&#xff0c;慎用&#xff0c;就是用的时候测一测。 下面是信号的基础测试 信号 信号&#xff08;signal&#xff09;机制是UNIX系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。信号可以由各种异步事件产生&#xff0c;例如…

数据结构与算法1:引入概念

接下来系统的学一下数据结构与算法的知识&#xff0c;本章节是第一部分&#xff1a;数据结构与算法的进入与基本概述 第一章&#xff1a;引入概念 【铁打的算法demo】先来看到题&#xff1a; 如果 a b c 1000&#xff0c;且 a2 b2 c2&#xff08;a, b , c 为⾃然数&…

快进来,带你了解FPGA基础知识---lattice莱迪斯深力科MachXO2 FPGA系列简介

FPGA基础知识---lattice莱迪斯深力科MachXO2 LCMXO2-4000HC-4TG144I FPGA简介 FPGA基础知识&#xff1a;FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它…

《程序员面试金典(第6版)》面试题 16.17. 连续数列(贪心算法思想,动态规划算法思想,C++)

题目描述 给定一个整数数组&#xff0c;找出总和最大的连续数列&#xff0c;并返回总和。 示例&#xff1a; 输入&#xff1a; [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a; 6 解释&#xff1a; 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。进阶&#xff1a; 如果你已经实…

elementUI tabs切换 echarts宽度挤压到一起 由100%变成100px

被压缩的图表&#xff1a; 正常显示 <el-tabs v-model"activeName" type"card" tab-click"handleClick"><el-tab-pane name"first"></el-tab-pane><el-tab-pane name"second" label"未达成原因…

如何在Kali Linux中获得root权限?

根用户名或账户在Linux或任何其他类似Unix的操作系统中拥有所有可用命令和文件的默认权限。它也被称为超级用户、根账户和根用户。用户名&#xff1a;"kali "是登录新Kali系统的标准凭证。这建立了一个用户 "kali "的会话&#xff0c;你必须在 "Sudo …

Java—JDK8新特性—方法引用【内含思维导图】

目录 4.方法引用 思维导图 4.1 什么是方法引用 4.2 为什么要使用方法引用 4.3 方法引用语法 4.4 方法引用的5种情况使用示例 4.方法引用 思维导图 4.1 什么是方法引用 方法引用就是Lambda表达式&#xff0c;也就是函数式接口的一个实例&#xff0c;通过方法的名称来指向一…

Word怎么分页,提高效率就靠这3种方法!

案例&#xff1a;Word怎么分页 【文档要进行分页处理&#xff0c;但是我尝试了好多次还是不行&#xff01;大家知道Word怎么分页吗&#xff1f;】 在使用Microsoft Word处理文档时&#xff0c;我们常常需要进行分页操作。Word的分页功能可以将文档分成多个页面&#xff0c;以…

【Vue3 插件篇】GSAP 动画库与 图片预览插件

GSAP 动画库 GSAP&#xff08;GreenSock Animation Platform&#xff09;是一个专业的动画库&#xff0c;可以用它完成你想要的各种效果 官网地址&#xff1a;https://greensock.com/ 参考文章一&#xff1a;https://www.jianshu.com/p/a8e150f0e569 参考文章二&#xff1a…