SpringCloud OpenFeign--声明式WebService 客户端

news2024/12/23 15:30:25

😀前言
本篇博文是关于SpringCloud OpenFeign的基本介绍,希望你能够喜欢

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

文章目录

  • SpringCloud OpenFeign
    • OpenFeign 介绍
      • OpenFeign 是什么
      • 官网
      • Feign 和OpenFeign 区别
        • Feign
        • OpenFeign
    • OpenFeign-应用实例
      • 需求分析/图解
        • 示意图
      • 创建服务消费模块-通过OpenFeigen 实现远程调用
      • 测试
      • 注意事项和细节
    • 日志配置
      • 基本介绍
        • 1.说明:
        • 2.日志级别
      • 配置日志-应用实例
      • 测试
        • 结果页面
      • 别忘了,撤销测试日志配置
    • OpenFeign 超时
      • 先看一个问题
      • 原因分析:
      • 设置超时时间
      • 测试

SpringCloud OpenFeign

OpenFeign 介绍

OpenFeign 是什么

  1. OpenFeign 是个声明式WebService 客户端,使用OpenFeign 让编写Web Service 客户端更简单
  2. 它的使用方法是定义一个服务接口然后在上面添加注解
  3. OpenFeign 也支持可拔插式的编码器和解码器。
  4. Spring Cloud 对OpenFeign 进行了封装使其支持了Spring MVC 标准注解和HttpMessageConverters
  5. OpenFeign 可以与Eureka 和Ribbon 组合使用以支持负载均衡

官网

官网地址:https://github.com/spring-cloud/spring-cloud-openfeign

Feign 和OpenFeign 区别

Feign

  1. Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端。
  2. Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
  3. Feign的使用方式是:使用Feign的注解定义接口,调用服务注册中心的服务。
  4. Feign支持的注解和用法请参考官方文档:https://github.com/OpenFeign/feign。
  5. Feign本身不支持Spring MVC的注解,它有一套自己的注解。
  6. 引入依赖

image-20230827143851040

OpenFeign

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

image-20230827143952627

精简一句话:OpenFeign 就是在Feign 基础上做了加强, 有些程序员为了方便,说Feign 就是指的OpenFeign

OpenFeign-应用实例

需求分析/图解

示意图

image-20230827144047241

创建服务消费模块-通过OpenFeigen 实现远程调用

  1. 参考member-service-consumer-80 创建member-service-consumer-openfeign-80(具体步骤参考以前)
  2. 修改pom.xml拷贝member-service-consumer-80 的pom.xml 内容,加入openfeign-starter
<!-- 引入openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3.创建application.yml 内容如下:

server:
  port: 80
spring:
  application:
    name: e-commerce-consumer-openfeign-80

#配置eureka-client
eureka:
  client:
    register-with-eureka: true #将自己注册到Eureka-Server
    fetch-registry: true
    service-url:
      #表示将自己注册到哪个eureka-server
      #这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
  1. 创建主启动类com/my/springcloud/MemberConsumerOpenfeignApplication80.java
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
@EnableFeignClients
public class MemberConsumerOpenfeignApplication80 {
    public static void main(String[] args) {
    	SpringApplication.run(MemberConsumerOpenfeignApplication80.class, args);
    }
}
  1. 创建com/my/springcloud/service/MemberFeignService.java,注意:这里是OpenFeign 的核心
@Component
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")
public interface MemberFeignService {

    //这里定义方法-就是远程调用的接口

    /**
     * 1. 远程调用的方式是get
     * 2. 远程调用的url http://MEMBER-SERVICE-PROVIDER/member/get/{id}
     * 3. MEMBER-SERVICE-PROVIDER 就是服务提供方在Eureka Server 注册的服务
     * 4. openfeign 会根据负载均衡来决定调用10000/10002-默认是轮询
     * 5. 因为openfeign 好处是支持了springmvc注解 + 接口解耦
     */
    @GetMapping("/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id);

}
  1. 创建com/my/springcloud/controller/MemberConsumerFeignController.java
@RestController
public class MemberConsumerFeignController {

    //装配MemberFeignService
    @Resource
    private MemberFeignService memberFeignService;

    @GetMapping(value = "/member/consumer/openfeign/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id) {
        return memberFeignService.getMemberById(id);
    }
}

测试

  1. 浏览器输入: http://localhost/member/consumer/openfeign/get/1
  2. 观察访问的10000/10002 端口的服务是轮询的

image-20230827181517761

image-20230827181531668

注意事项和细节

  1. 配Openfeign的使用特点是微服务调用接口+@FeignClient , 使用接口进行解耦。
  2. @FeignClient(value = “MEMBER-SERVICE-PROVIDER”), 这里MEMBER-SERVICE-PROVIDER就是Eureka Server服务提供方注册的名称, 不要写
    错了。
  3. 接口方法上: value是不能乱写, 远程调用的url 为http://MEMBER-SERVICE-PROVIDER/member/get/{id}
@GetMapping(value = "/member/get/{id}")
public Result<Member> getMembertById(@PathVariable("id") Long id);

日志配置

基本介绍

1.说明:

Feign 提供了日志打印功能,可以通过配置来调整日志级别,从而对Feign 接口的调用情况进行监控和输出

2.日志级别

NONE∶默认的,不显示任何日志

BASIC∶仅记录请求方法、URL、响应状态码及执行时间;

HEADERS∶除了BASIC中定义的信息之外,还有请求和响应的头信息;

FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。

image-20230827181753857

配置日志-应用实例

  1. 在member-service-consumer-openfeign-80 创建com/my/springcloud/config/OpenFeignConfig.java
@Configuration
public class OpenFeignConfig {

    @Bean
    public Logger.Level loggerLevel() {
        return Logger.Level.FULL;
    }
}
  1. 在member-service-consumer-openfeign-80 修改application.yml

常见的日志级别有5 种,分别是error、warn、info、debug、trace
error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的;
warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
debug:用于开发DEBUG 的,关键逻辑里面的运行时数据;
trace:最详细的信息,一般这些信息只记录到日志文件中。

logging:
  level:
    #对MemberFeignService 接口调用过程打印信息-Debug
    com.my.springcloud.service.MemberFeignService: debug

测试

​ 浏览器: http://localhost/member/consumer/openfeign/get/1

结果页面

image-20230827182218719

image-20230827182155708

别忘了,撤销测试日志配置

OpenFeign 超时

先看一个问题

  1. 修改member-service-provider-10000/10002 的com/my/springcloud/controller/MemberController.java
  @GetMapping("/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {

        try {
            TimeUnit.MILLISECONDS.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Member member = memberService.queryMemberById(id);

        //使用Result把查询到的结果返回
        if (member != null) {
            //return Result.success("查询会员成功 member-service-provider-10000 " + color + "-" + address, member);
            return Result.success("查询会员成功 member-service-provider-10000", member);
        } else {
            return Result.error("402", "ID= " + id + "不存在");
        }

    }

2.浏览器访问http://localhost/member/consumer/openfeign/get/1

image-20230827182451058

原因分析:

OpenFeign 默认超时时间1 秒钟,即等待返回结果1 秒

设置超时时间

说明: 在某些情况下,一个服务调用时间可能要超过1 秒,就需要重新设置超时时间

  1. 修改member-service-consumer-openfeign-80 的application.yml
ribbon:
  #1. 设置feign客户端超时时间(openfeign默认支持ribbon)
  #2. ReadTimeout: 8000: 建立连接从服务提供方获取可用资源的所用的全部时间
  #3. 时间单位是毫秒
  ReadTimeout: 8000
  #两端连接所用时间
  ConnectionTimeout: 8000

测试

  1. 浏览器输出: http://localhost/member/consumer/openfeign/get/1, 不会出现超时,会轮询访问10000/10002

image-20230827183014359

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

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

相关文章

排序算法—

1 1.冒泡排序&#xff08;相邻两两比较&#xff09; 理解&#xff1a;进行n轮循环&#xff0c;相邻元素两两比较&#xff0c;交换位置 先将最大/最小元素放到最后一个位置 然后缩小j的比较范围&#xff0c;因为每一轮循环最后一个元素的位置都已经确定了 #include <stdio.h&…

Ubuntu 图形界面查看Mysql 数据库内容

1.安装mysql workbench 打开ubuntu软件中心&#xff0c;搜索如下字符&#xff0c;安装这个社区版的workbench 2.登录workbench 按下图依次打开该安装后的软件 点击此处进行登录&#xff0c;首次登录可能需要密码&#xff0c;第二次如果记住密码了就不需要了。 3.查看数据库的…

Python程序设计实例 | 学生管理数据库系统的开发

本文将通过一个学生管理数据库系统的开发过程来展示如何系统地基于Python实现SQLite数据库编程。以下首先提出数据库系统的基本结构&#xff0c;以及如何通过SQLite逐步达到这些要求并进行常规操作。 01、数据表结构 该学生管理数据库系统包括4张表&#xff1a; 专业表、学生…

华为数通方向HCIP-DataCom H12-821题库(单选题:361-380)

第361题 如图所示是一台路由器的BGP输出信息。那么以下关于这段信息的描述,错误的是哪一项? <Huawei>display bgp error Error Type: Peer Error Peer Address:10.1.1.2 VRFName:Public Error Info: Router-ID conflictA、该路由器邻居地址是10.1.1.2 B、Error Type显…

SWC 流程

一个arxml 存储SWC &#xff08;可以存多个&#xff0c;也可以一个arxml存一个SWC&#xff09;一个arxml 存储 composition &#xff08;只能存一个&#xff09;一个arxml 存储 system description (通过import dbc自动生成system) 存储SWC和composition的arxml文件分开&#…

Python基础指令(上)

Python基础指令上 常量和表达式变量和类型1. 什么是变量2. 变量的语法2.1 定义变量2.2 使用变量 3. 变量的类型4. 为什么要有这么多类型5. 动态类型特性 注释输入输出1. 程序与用户的交互2. 通过控制台输出3. 通过控制台输入 运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. …

科学家首次为地球“全面体检”;国产光刻机或系误传;推特或将按月收费丨RTE开发者日报 Vol.52

开发者朋友们大家好&#xff1a; 这里是「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

nginx(CVE-2022-41741和41742) 漏洞修复

一、漏洞描述 近期Nginx安全发布几个中高危漏洞&#xff1a;CVE-2022-41741 (Memory Corruption) – CVSS score 7.1 (High)、CVE-2022-41742 (Memory Disclosure) – CVSS score 7.0 (High)&#xff0c;上述是&#xff1a;MP4 流媒体模块&#xff08;ngx_http_mp4_module&…

固定资产管理系统有哪些基本功能

固定资产管理系统是一种用于管理和跟踪企业固定资产的软件。它能够帮助企业实现固定资产的全生命周期管理&#xff0c;包括资产采购、仓储、申请、维护、损坏等环节。以下是固定资产管理系统的一些基本功能&#xff1a;资产信息管理&#xff1a;系统可记录公司固定资产信息&…

「聊设计模式」之桥接模式(Bridge)

&#x1f3c6;本文收录于《聊设计模式》专栏&#xff0c;专门攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎持续关注&&收藏&&订阅&#xff01; 前言 设计模式是程序员不可或缺的一部分。它们提供了一种通用的…

华为数通方向HCIP-DataCom H12-831题库(单选题:61-80)

第61题 R3与R4的IS-IS Leve1-1邻居没有建立,根据本图的信息可能的原因是? A、R3与R4的互连接口circuit-type不四配 B、R3与R4的区域号不同 C、R3与R4的IS-Leve1不匹配 D、R3与R1的IIH认证失败 答案:B 解析: 直接看图中的非0数字就能得出答案。 Display isis error 是查看…

如何开心的在iOS上玩NDS游戏

如何开心的在iOS上玩NDS游戏 先说结论&#xff0c;有原生方案和web方案2种。 Web 方案 其实现在的 webassembly 技术已经非常成熟了&#xff0c;我们可以通过编译 C 语言的模拟器代码&#xff0c;然后在浏览器上运行。 这样就可以实现一个在线的模拟器了&#xff0c;而且不…

内网穿透的应用-Cloudreve搭建云盘系统,并实现随时访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

mysql表的导出和导入

表的导出 mysql 默认对导出的目录有权限限制&#xff0c;也就是说使用命令进行导出的时候&#xff0c;需要指定目录进行操作 show global variables like ‘%secure%’; secure_file_priv 值情况分析&#xff1a; 如果设置为empty&#xff0c;表示不限制文件生成的位置&#x…

MySQL:获取Auto_increment失败问题记录

项目场景&#xff1a; 人员权限设置&#xff0c;定义了一张存储自增id的表sys_id_sequence&#xff08;A表&#xff09; /*A表定义*/ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for sys_id_sequence -- -----------…

PyTorch深度学习实战(16)——面部关键点检测

PyTorch深度学习实战&#xff08;16&#xff09;——面部关键点检测 0. 前言1. 关键点检测1.1 关键点检测模型分析1.2 数据集分析 2. 面部关键点检测3. 2D 和 3D 面部关键点检测小结系列链接 0. 前言 我们已经学习了如何解决二分类(猫狗分类)和多分类( fashionMNIST )问题。本…

Python(八十七)函数的定义与调用

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

ffmpeg抠图

1.不用png&#xff0c;用AVFrame 2.合流 3.图片抠图透明 (1.)mp4扣yuv图&#xff0c;(2)用1. (3)用抠图算法函数对yuv进行处理 ffmpeg -y -i TJTV.png -vf colorkey0x0000FF:0.5:0.0 -c:v png t.png0x0000FF&#xff1a;六位每两位分别表示红绿蓝&#xff0c;因此它是对…

如何提高技术领导力?与你分享 5 个心得

技术领导力于很多人而言都是谜一般的存在。有观点认为&#xff0c;实战经验丰富的资深开发最终只有成为技术管理者才能继续成长。从某些方面来看&#xff0c;这可能是对的&#xff0c;但考虑到公司结构和规章制度等&#xff0c;想要完成从「个人贡献者」到「技术管理者」的跨越…

mysql自动删除过期的binlog

一、binlog_expire_logs_seconds 配置项 mysql 8.0使用配置项 binlog_expire_logs_seconds 设置binlog过期时间&#xff0c;单位为秒。 mysql旧版本使用配置项 expire_logs_days 设置binlog过期时间&#xff0c;单位为天&#xff0c;不方便测试。 在 8.0 使用 expire_logs_d…