微服务调用组件Feign学习笔记

news2024/12/28 18:59:04

目录

JAVA 项目中如何实现接口调用?

1. 什么是Feign

2. Spring Cloud Alibaba快速整合OpenFeign

3. Spring Cloud Feign的自定义配置及使用

4.自定义拦截器

5.超时时间配置


JAVA 项目中如何实现接口调用?

1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富
的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 
相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变
得容易,提高了开发的效率。
2)Okhttp
一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 
HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持
多种协议(HTTP/2 和 SPDY)。
3)HttpURLConnection
HttpURLConnection 是  Java  的标准类,它继承自 URLConnection,可用于向指定网站发送 
GET 请求、POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使
用。
4) RestTemplate     WebClient
RestTemplate 是  Spring  提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便
捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
上面介绍的是最常见的几种调用接口的方法,我们下面要介绍的方法比上面的更简单、方便,
它就是 Feign。

1. 什么是Feign

Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及
WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API。 Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud  openfeign 对Feign进行了增强,使其支持Spring MVC注解,另外还整合了
Ribbon和Nacos,从而使得Feign的使用更加方便。
1.1 优势
Feign可以做到 使用 HTTP 请求远程服务时就像调用本地方法一样的体验 ,开发者完全感知不
到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接
口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了
让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布
式环境开发。

2. Spring Cloud Alibaba快速整合OpenFeign

1)引入依赖

<!--        openfeig 远程调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
2)编写调用接口+@FeignClient注解
package com.wang.openfeign;

import com.wang.config.FeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;


/**
 * @author wang fei
 * @description:
 * 开启Feign, 根据不同的url,传入不同的参
 * name 指定调用rest接口所在的服务名称
 * path 指定调用rest接口所在的Controller指定的@RequestMapping映射路径
 * 局部配置,让调用的微服务生效,在@FeignClient注解中指定使用的配置类,configuration = FeignConfig.class
**/
@FeignClient(name = "stock-nacos",path = "/stock")
public interface OrderFeignService {
    //声明需要调用rest接口对应的方法
    @RequestMapping("/reduct")
     String reduct();

    @RequestMapping("/reduct2")
     String reduct2();
}

3)调用端在启动类上添加 @EnableFeignClients 注解
4)发起调用,像调用本地方式一样调用远程服务
package com.wang.controller;

import com.wang.openfeign.OrderFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @BelongsProject: SpringCloudAlibabaLearn
 * @BelongsPackage: com.wang.controllter
 * @Author: wang fei
 * @CreateTime: 2023-01-16  16:48
 * @Description: TODO
 * @Version: 1.0
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    OrderFeignService orderFeignService;



    @GetMapping("/pay")
    public String pay(){
        String msg = orderFeignService.reduct();
        System.out.println("小王支付成功" + msg);
        return msg;
    }
}

3. Spring Cloud Feign的自定义配置及使用

Feign 提供了很多的扩展机制,让用户可以更加灵活的使用。
3.1 日志配置
有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要
配置 Feign 的日志了,以此让 Feign 把请求信息输出来。
 全局配置: 当使用@Configuration 会将配置作用所有的服务提供方
 局部配置: 1. 通过配置类:如果只想针对某一个服务进行配置, 就不要加@Configuration
            2. 通过配置文件
3.1全局配置: 当使用@Configuration 会将配置作用所有的服务提供方
1)定义一个配置类,指定日志级别
package com.wang.config;

import com.wang.intercptor.CustomFeignInterceptor;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @BelongsProject: SpringCloudAlibabaLearn
 * @BelongsPackage: com.wang.config
 * @Author: wang fei
 * @CreateTime: 2023-01-20  15:26
 * @Description: TODO
 * @Version: 1.0
 */


/**
 * 配置Feign的日志
 * 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
 * @author 飞
*/
@Configuration
public class FeignConfig {
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }

}
注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
通过源码可以看到日志等级有 4 种,分别是:
  • NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
  • BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及
执行时间。
  • HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
  • FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body
和元数据。
3.2局部配置,让调用的微服务生效,在 @FeignClient 注解中指定使用的配置类

方式1:通过配置类:如果只想针对某一个服务进行配置, 就不要加@Configuration

1)配置类:

package com.wang.config;

import com.wang.intercptor.CustomFeignInterceptor;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @BelongsProject: SpringCloudAlibabaLearn
 * @BelongsPackage: com.wang.config
 * @Author: wang fei
 * @CreateTime: 2023-01-20  15:26
 * @Description: TODO
 * @Version: 1.0
 */


/**
 * 配置Feign的日志
 * 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
 * @author 飞
*/
//@Configuration
public class FeignConfig {
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }

    @Bean
    public CustomFeignInterceptor feignAuthRequestInterceptor(){
        return new CustomFeignInterceptor();
    }
}

2)接口: 

package com.wang.openfeign;

import com.wang.config.FeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;


/**
 * @author wang fei
 * @description:
 * 开启Feign, 根据不同的url,传入不同的参
 * name 指定调用rest接口所在的服务名称
 * path 指定调用rest接口所在的Controller指定的@RequestMapping映射路径
 * 局部配置,让调用的微服务生效,在@FeignClient注解中指定使用的配置类,configuration = FeignConfig.class
**/
@FeignClient(name = "stock-nacos",path = "/stock",configuration = FeignConfig.class)
public interface OrderFeignService {
    //声明需要调用rest接口对应的方法
    @RequestMapping("/reduct")
     String reduct();

    @RequestMapping("/reduct2")
     String reduct2();
}

3)配置spring日志级别:

logging:
  level:
   com.wang.openfeign: debug #日志级别
补充:局部配置可以在yml中配置
对应属性配置类: 

feign:
    client:
        config:
           对应微服务名称
                loggerLevel: FULL

方式2:通过配置文件(推荐)

feign:
  client:
    config:
      stock-nacos:
        loggerLevel: BASIC

效果截图:

4.自定义拦截器

我们openfeign实现RequestInterceptor接口定义自定义拦截器,在拦截器中完成相关业务。如下一个例子。

1)实现RequestInterceptor接口

package com.wang.intercptor;

import feign.RequestInterceptor;
import feign.RequestTemplate;

import java.util.UUID;


/**
 * @BelongsProject: SpringCloudAlibabaLearn
 * @BelongsPackage: com.wang.intercptor
 * @Author: wang fei
 * @CreateTime: 2023-01-20  15:53
 * @Description: TODO
 * @Version: 1.0
 */
public class CustomFeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        /* TODO 自定义 feign 请求拦截器  业务逻辑 */
        String access_token= UUID.randomUUID().toString();
        requestTemplate.header("token",access_token);
        System.out.println("请求拦截器feign自定义");

    }
}

1)将自定义的拦截器配置

  • 通过配置类配置
package com.wang.config;

import com.wang.intercptor.CustomFeignInterceptor;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @BelongsProject: SpringCloudAlibabaLearn
 * @BelongsPackage: com.wang.config
 * @Author: wang fei
 * @CreateTime: 2023-01-20  15:26
 * @Description: TODO
 * @Version: 1.0
 */


/**
 * 配置Feign的日志
 * 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
 * @author 飞
*/
//@Configuration
public class FeignConfig {
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }

   //自定义拦截器
    @Bean
    public CustomFeignInterceptor feignAuthRequestInterceptor(){
        return new CustomFeignInterceptor();
    }
}
  • 通过配置文件配置
feign:
  client:
    config:
      stock-nacos:
#        loggerLevel: BASIC
        # 连接超时时间,默认2s
        connectTimeout: 5000
        # 请求处理超时时间,默认5s
        readTimeout: 10000
      requestInterceptors[0]:
        com.wang.interceptor.CustomFeignInterceptor #feign的拦截器自定义

5.超时时间配置

通过 Options 可以配置连接超时时间和读取超时时间,Options 的第一个参数是连接的超时
时间(ms),默认值是 2s;第二个是请求处理的超时时间(ms),默认值是 5s。
全局配置
@Configuration
public class FeignConfig {
    @Bean
    public Request.Options options() {
         return new Request.Options(5000, 10000);
        }
 }
yml中配置
 
feign:
  client:
  config:
  mall‐order: #对应微服务
  # 连接超时时间,默认2s
  connectTimeout: 5000
  # 请求处理超时时间,默认5s
  readTimeout: 10000

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

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

相关文章

数据结构(模式匹配及相关算法)

目录 模式匹配 BF算法 算法实现 算法分析 KMP算法 问题的引入&#xff08;一&#xff09; 问题的引入&#xff08;二&#xff09; 问题的引入&#xff08;三&#xff09; 相关概念 计算失配函数的算法 算法思路 算法优点 模式匹配 函数int find(const sstring &am…

机器学习(三):人工智能主要分支

文章目录 人工智能主要分支 一、计算机视觉 二、语音识别 三、文本挖掘/分类 四、机器翻译 五、机器人 人工智能主要分支 通讯、感知与行动是现代人工智能的三个关键能力&#xff0c;在这里我们将根据这些能力/应用对这三个技术领域进行介绍&#xff1a; 计算机视觉(CV…

WiFi monitor模式的配置和运行检查(Ubuntu系统)

WiFi monitor模式的配置和运行检查1. WiFi monitor模式介绍2. WiFi monitor模式查看Step1&#xff1a;确保计算机上有安装硬件WiFi无线网卡Step2&#xff1a;安装必要的工具Step 3&#xff1a;iw list查看无线网卡是否支持monitor模式Step 4&#xff1a;配置WiFi monitor模式St…

有了独自开,我们离自己开发一套系统还会远吗

目录 一、结识独自开 二、独自开的介绍 三、独自开的需求 四、独自开注册流程 五、神仙公司独自开 一、结识独自开 算是机缘巧合&#xff0c;我被C站白佬拉入了他的聊天群&#xff0c;群内均是来自于CSDN的不同领域的优质作者&#xff0c;其中不乏相关领域工作多年的老工程…

“任性”华为 | 七十八岁老人的“四渡赤水”(二)

导读华为是一家“任性”的企业——因为任正非将自己的性格赋予了华为——在企业前进的每一个路口&#xff0c;都会看见这种性格的印记。2022年12月&#xff0c;当美国总统拜登出现在凤凰城出席台积电工厂迁机仪式上&#xff0c;苹果公司首席执行官库克等约900名政商界人士前往捧…

c#检测网络连接信息

用手机全屏看B站视频时可以看到右上角标识有WIFI&#xff0c;比较好奇如何检测当前网络连接是wifi还是数据网络什么的。于是百度相关信息&#xff0c;找到参考文献1-2&#xff0c;其中介绍采用Xamarin.Essentials检测网络连接性&#xff0c;其中的Connectivity类可用于监视设备…

【MATLAB】三维旋转的实现

1 三维旋转的表达方式 三维空间中常用的表示旋转的方式有&#xff1a; **[1]旋转矩阵(rotation matrix) [2]旋转向量(rotation vector&#xff09;/角轴&#xff08;轴角&#xff09;(axis angle) [3]欧拉角(euler angles) [4]四元数(quaternion)**主动旋转和被动旋转&#x…

现场工程师出手-PCAPHub与云IP实现异地LAN工业联测

在去年&#xff0c;因为众所周知的因素影响&#xff0c;项目的甲方主动提出延缓设备的交付。作为乙方&#xff0c;尽管项目延缓是甲方提出的&#xff0c;但依旧希望按期交付&#xff0c;这样才能回款&#xff0c;熬过一年。其实&#xff0c;2022年初&#xff0c;几类传感器、压…

Visual Studio 17.5 拼写检查器预览版现已推出,来说说你的看法吧

写在前面&#xff1a; Visual Studio17.5版本已添加拼写检查器功能&#xff0c;Visual Studio 中的许多功能旨在帮助你编写所需的代码。Visual Studio帮助你确保代码的编译&#xff0c;甚至可以帮助代码样式。现在它甚至可以确保您的拼写准确。Visual Studio 17.5 preview 3 引…

Linux常用命令——talk命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) talk 让用户和其他用户聊天 补充说明 talk命令是talk服务器的客户端工具&#xff0c;通过talk命令可以让用户和其他用户聊天。linux中talk命令参数程序的使用很简单&#xff0c;只要知道交谈对象的地址&#x…

plt自定义主要刻度值和次要刻度值

使用set_xticks方法和set_xticklabels方法即可 1、set_xticks方法 参数说明&#xff1a; set_xticks(self, ticks, minorFalse)参数1&#xff1a;ticks&#xff1a;指定刻度出现的位置参数2&#xff1a;minor&#xff1a;指定是否是次要刻度返回值1&#xff1a;包含XTick实例…

【数学建模】华为杯研究生数学建模备赛的一些建议

文章目录前言一、建模题目介绍1.1、题目数量1.2、题目种类1.3、题目难度1.4、题目选择二、笔者的备赛过程2.1.简单的题目&#xff08;本科比赛&#xff0c;学科大作业&#xff09;2.2.真题三、编程的备赛建议3.1.matlab和python的基础语法3.2.数据预处理3.3.常用的机器学习算法…

win10系统新增的几款非常有用的基础快捷键

win就是键盘的这个键winq或wins 打开搜索winw 打开白板、全屏截图wint 配合左右箭头←→&#xff0c;来回切换最小化窗口在任务栏的缩略图winu 设置显示器wini 打开设置winp 屏幕投影、扩展屏幕wina 查看最近消息通知winh 语音输入法wink 查找设备&#xff08;如&#xff1a;打…

线程池默认大小为CPU核数的2倍

1、前言 有位工作5年的小伙伴问我说&#xff0c;为什么Netty线程池默认大小为CPU核数的2倍&#xff0c;今天&#xff0c;我花2分钟时间给大家专门分享一下我对这个问题的理解。 另外&#xff0c;我花了1个多星期把往期的面试题解析配套文档准备好了&#xff0c;想获取的小伙伴…

Introduction to Multi-Armed Bandits——03 Thompson Sampling[1]

Introduction to Multi-Armed Bandits——03 Thompson Sampling[1] 参考资料 Russo D J, Van Roy B, Kazerouni A, et al. A tutorial on thompson sampling[J]. Foundations and Trends in Machine Learning, 2018, 11(1): 1-96. ts_tutorial 在线学习(MAB)与强化学习(RL)[…

JavaScript基础知识点整理(一)——数据类型、判定、转换、this指向

JavaScript是每一位前端开发者都必备的技能&#xff0c;接下来会分章节文章阐述介绍每一部分的内容。 JavaScript基础整理①1、JavaScript类型2、原始&#xff08;primitive&#xff09;类型3、对象&#xff08;Object&#xff09;类型4、类型判定4.1、typeof4.2、instanceof4.…

Vue2基础、组件化编程、脚手架、Vuex、Vue路由、UI组件库

尚硅谷张天禹老师讲课 学习视频 1、Vue简介 Vue2中文官网 1.1 Vue 介绍 一套用于构建用户界面的渐进式JavaScript框架 构建用户界面&#xff1a;把数据通过某种办法变成用户界面渐进式&#xff1a;可以自底向上逐层的应用&#xff0c;简单应用只需要一个轻量小巧的核心库&…

SQL--DQL

目录 1、基础查询 1. 查询多个字段 1. 举例 2. 举例 2. 字段设置别名 1. 举例 2. 举例 3. 去除重复记录 1. 举例 2、条件查询 1. 等于&#xff08;&#xff09; 2. 小于&#xff08;<&#xff09; 3. 小于等于&#xff08;<&#xff09; 4. 没有&#xff…

Java设计模式中命令模式是怎么回事/命令模式如何使用,什么场景适用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.4 命令模式 6.4.1 定义 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分隔开&#xff0c;方便了将命令对象进行存储&#xff0c;传递…

激活函数(26个)

最近在学习网络&#xff0c;发现一会这个网络用了这个激活函数&#xff0c;一会那个网络用了那个激活函数&#xff0c;这些激活函数都有什么作用啊&#xff0c;不知道&#xff0c;这里学习一下&#xff0c;整理下来&#xff0c;方便以后查阅。 激活函数&#xff08;26个&#x…