SpringCloud OpenFeign--声明式WebService 客户端

news/2024/10/18 7:53:07/

😀前言
本篇博文是关于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-Serverfetch-registry: trueservice-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@Resourceprivate 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 {@Beanpublic 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 接口调用过程打印信息-Debugcom.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.ppmy.cn/news/1115781.html

相关文章

兽医诊所温湿度失衡,该如何止损?

在现代社会中&#xff0c;宠物已经成为家庭的一员&#xff0c;人们越来越重视宠物的健康和幸福。兽医诊所作为照顾和治疗宠物的重要场所&#xff0c;不仅承担着宠物医疗护理的责任&#xff0c;还肩负着确保宠物在诊所内舒适、安全的任务。 然而&#xff0c;很多时候&#xff0c…

2023年9月30号的火车票什么时候开售?用待办APP提醒抢票

2023年的中秋节和国庆节马上就要到了&#xff0c;你假期的工作都提前完成了吗&#xff1f;今年的国庆节放假时间是从9月29日&#xff08;中秋节&#xff09;-10月6日共8天时间&#xff0c;所以是名副其实的长假了。有不少网友表示自己要在中秋国庆长假期间回家探亲、外出游玩&a…

Vue的进阶使用--模板语法应用

目录 前言 一. Vue的基础语法 1.插值 1.1文本插值 1.2HTML插值 1.3属性插值 1.4Vue演示三元条件运算 2 指令 2.1if&&else指令&#xff08;v-if/v-else-if/v-else&#xff09; 2.2 v-for 指令 2.3 v-on指令(动态参数) 2.4知识点补充之v-if与v-show的区别 3.过…

【操作系统】聊聊进程间通信方式

作为操作系统软件治理的核心 进程&#xff0c;那么进程间通信的方式就非常重要&#xff0c;常见的比如管道、消息队列、共享内存、信号量、信号、Socket等。本篇主要简单介绍下 我们知道每个进程都有自己独立的用户空间&#xff0c;而内核空间是共享的。 管道 ps -ef | gre…

初识软件工程

软件工程是一门涵盖软件开发、维护和管理的学科&#xff0c;它通过应用工程化的原则和方法来提高软件系统的质量和可靠性。在当今数字化和信息化的时代&#xff0c;软件工程对于现代社会的各个领域都具有至关重要的作用。 基本概念&#xff1f; 计算机系统中与硬件相互依存的一…

通过插件去除Kotlin混淆去除 @Metadata标记

在Kotlin中&#xff0c;Metadata是指描述Kotlin类的元数据。它包含了关于类的属性、函数、注解和其他信息的描述。Metadata的作用主要有以下几个方面&#xff1a; 反射&#xff1a;Metadata可以用于在运行时获取类的信息&#xff0c;包括类的名称、属性、函数等。通过反射&…

沃通SSL证书、国密SSL证书、IPSSL证书,2023中秋国庆双节钜惠

2023中秋国庆喜相逢&#xff0c;沃通CA特此推出“迎中秋、庆国庆&#xff0c;沃通SSL证书双节钜惠”活动&#xff0c;即日起至2023年10月18日&#xff0c;沃通SSL证书、国密SSL证书、IP SSL证书等多款热销SSL证书产品优惠来袭。 沃通全球信任SSL证书&#xff0c;助力数据安全保…

终于搞清了:SPI、UART、I2C通信的区别与应用!

电子设备之间的通信就像人类之间的交流&#xff0c;双方都需要说相同的语言。在电子产品中&#xff0c;这些语言称为通信协议。 之前有单独地分享了SPI、UART、I2C通信的文章&#xff0c;这篇对它们做一些对比。 串行 VS 并行 电子设备通过发送数据位从而实现相互交谈。位是…