七. OpenFeign 服务接口调用

2023-11-05

一. 基础介绍

  1. Feign 与 OpenFeign 的区别, Feign 停止更新后,SpringCloud 在 Feign 基础上进行增强推出的 Rest Client 服务消费端进行服务调用
  2. 在前面 SpringCloud 是通过 Ribbon+Remplate 调用服务接口,当一个服务接口需要被其它服务调用时需要进行正对性的封装,Feign 在此基础做了进一步的封装,只需要创建一个接口,进行一定配置,即可完成,简化了多于操作
  3. Fing 集成了 Ribbon 维护了服务列表信息,可以实现负载均衡,并且
    在这里插入图片描述

二. 使用 OpenFeign 调用服务接口的实现步骤

  1. 服务提供方中存在提供服务的接口,并将服务以指定名称注册到了注册中心(此处以Eureka作为注册中心)
  2. 服务消费方创建专门使用 Feign 调用服务消费方的接口,接口使用 @FeignClient(value = “被调用的服务名称”),通过注解的value属性值指定当前 Feign 调用的是哪个服务提供方,底层会通过该值在注册中心获取该服务的调用列表,Feign 底层使用 Ribbon 然后本地负载,选择指定的服务 ip
  3. 接口中编写与要调用的服务提供方接口的对应接口(一一对应),并将接口注入到容器中
  4. 服务消费方启动类添加 @EnableFeignClients 修饰,表示开启 Feign 客户端调用功能
  5. 服务消费方 yml 文件配置调用服务接口超时时间,配置 Feign 日志记录功能等
    服务提供方提供服务接口

服务提供方

  1. 服务提供方 yml ,配置注册中心,配置向注册中心注册的名字"cloud-payment-service"等等
server:
  port: 8001 #当前服务端口号

spring:
  application:
    name: cloud-payment-service #当前服务名称
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
    driver-class-name: com.mysql.cj.jdbc.Driver #mysql驱动包
    url: jdbc:mysql://localhost:3306/test01?serverTimezone=GMT%2B8 #连接的库
    username: root
    password:
#=================eureka相关配置======================
eureka:
  client:
    register-with-eureka: true #true 表示将当前服务注册到eureka注册中心
    #true 表示是否在注册中心抓取已有的注册信息,集群环境时必须为true,配合ribbon进行负载
    fetchRegistry: true
    service-url:
      #eureka 注册中心访问连接,集群环境多个注册地址
      defaultZone: http://127.0.0.1:7001/eureka,http://127.0.0.1:7002/eureka
  instance:
    instance-id: payment8001 #配置当前服务向eureka注册中心注册时显示的服务器主机名称
    prefer-ip-address: true #配置在开发人员直接访问eureka服务器时显示当前eureka上注册的服务的ip
    lease-renewal-interval-in-seconds: 1 #指定定时向eureka注册中心发送代表当前服务心跳包的时间默认30秒
    # Eureka 接收到当前服务最后一次发送代表正常心跳包的等待时间,超过则将当前服务在 Eureka 上踢除
    lease-expiration-duration-in-seconds: 2 
#=================eureka相关配置end======================
mybatis:
  mapperLocations: classpath:mapper/*.xml #扫描mappper.xml */
  type-aliases-package: com.test.dao #扫描对应mapper.xml 接口
  1. 服务提供方提供服务的接口
@Controller
public class PaymentController {

    @RequestMapping(value = "/getAll", method = RequestMethod.GET)
    @ResponseBody
    public JsonResult getAll(){
        System.out.println("微服务8001执行");
        return  paymentServerApi.getAll();
    }

    @RequestMapping(value = "/save", method = RequestMethod.GET)
    @ResponseBody
    public JsonResult saveOrUpdatePayment(){
        System.out.println("微服务8001执行");
        Payment payment = PaymentController.returnPayment();
        return  paymentServerApi.saveOrUpdatePayment(payment);
    }
    
    public static Payment returnPayment() {
        Payment payment = new Payment();
        //payment.setId();
        payment.setSerialNumber("1111");
        return payment ;
    }
}

服务消费方

  1. pom 引入除了Spring , Eureka 依赖以外增加 Feign 依赖
<!-- openfeign -->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>
  1. 服务消费方创建 Feign 调用服务的接口,将接口注入到容器中
import com.common.result.JsonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Component
//表示当前接口调用名为 "CLOUD-PAYMENT-SERVICE" 的服务提供方
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
	//与服务提供方中的接口一一对应,调用服务提供方中接口路径是"/save"的服务方法
	//方法名返回值也要一一对应
    @RequestMapping(value = "/save", method = RequestMethod.GET)
    public JsonResult saveOrUpdatePayment();

	//调用服务提供方接口路径是"/getAll"的服务方法
    @RequestMapping(value = "/getAll", method = RequestMethod.GET)
    public JsonResult getAll();
}
  1. 服务消费方通过接口调用服务,获取创建的 Feign 接口,调用接口中的方法, Controller 调用示例
import com.common.result.JsonResult;
import com.order.feignService.PaymentFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class OrderController {
   //自己创建注入到容器中的 Feign 服务调用接口
    @Autowired
    private PaymentFeignService paymentFeignService;

    @RequestMapping(value = "/consumer/feign/save", method = RequestMethod.GET)
    @ResponseBody
    public JsonResult save(){
        //通过 paymentFeignService 调用方
        return paymentFeignService.saveOrUpdatePayment();
    }

    @RequestMapping(value = "/consumer/feign/getAll", method = RequestMethod.GET)
    @ResponseBody
    public JsonResult getAll(){
        return paymentFeignService.getAll();
    }
}
  1. 启动类增加 @EnableFeignClients 开启 feign 调用功能
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients //开启 feign 调用功能
public class OrderFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain80.class,args);
    }
}

OpenFeign 调用服务超时问题

在使用 Feign 调用服务接口时,默认等待1秒,如果一秒没有拿到被调用服务返回的请求结果会自动报错,在实际开发中,一个逻辑接口调用可能会超过1秒,可以在服务消费方的 yml 配置文件中,使用 Ribbon 配置(Feign 底层通过 Ribbon 进行负载)

OpenFeign 日志打印功能

  1. Feign 提供了日志打印功能,可以通过配置调整日志级别,可以通过Feign获取发送请求的细节
  2. Feign支持的日志级别:

NONE: 默认的,不显示任何日志
BASIC: 仅记录请求方法,URL,响应状态码,执行时间
HEADERS: 除了 BASIC 中的信息以外,还包含请求和响应的头信息
FULL: 除了 HEADERS 中的信息以外,还包含请求和响应的正文及元数据

  1. 实现步骤:

1.服务消费方在项目中创建配置类,配置 Feign 支持的日志级别,注入到 Spring 容器中
2.服务消费方在 yml 文件中配置 Feign 日志监控哪个接口(当前项目中使用Feign调用其它服务的 Feign 接口)

  1. 配置类示例:
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {
    //此处以 FULL 级别为例
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}
  1. 在 yml 中配置 Feign 监控记录日志的接口后,调用被监控的方法执行记录日志示例
    在这里插入图片描述

服务消费方 yml 中配置 Feign 调用超时与 Feign 日志

server:
  port: 80 #当前服务端口号
spring:
  application:
    name: cloud-feign-order-service #当前服务名称
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #eureka 注册中心访问连接,集群环境多个注册地址
      defaultZone: http://127.0.0.1:7001/eureka,http://127.0.0.1:7002/eureka
  instance:
    instance-id: order80 #配置当前服务向eureka注册中心注册时显示的服务器主机名称
    prefer-ip-address: true #配置在开发人员直接访问eureka服务器时显示当前eureka上注册的服务的ip
    lease-renewal-interval-in-seconds: 1 #指定定时向eureka注册中心发送代表当前服务心跳包的时间默认30秒
    lease-expiration-duration-in-seconds: 2 # Eureka 接收到当前服务最后一次发送代表正常心跳包的等待时间,超过则将当前服务在 Eureka 上踢除

#=====================Feign===========================================
#超时时间配置
ribbon:
  ReadTimeout: 5000 #当前服务消费方调用服务提供方,建立连接超时时间,默认1秒超过报错
  ConnectTimeout: 5000 #当前服务消费方与服务提供方建立连接后调用服务接口读取资源的时间

#配置 Feign 日志功能
logging:
  level:
    #表示 com.order.feignService.PaymentFeignService 接口中的方法执行,Feign 监控,记录日志
    com.order.feignService.PaymentFeignService: debug
#=====================Feign end===========================================
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

七. OpenFeign 服务接口调用 的相关文章

  • 超时后如何重新建立 JDBC 连接?

    我有一个长时间运行的方法 它通过 EntityManager TopLink Essentials 执行大量本机 SQL 查询 每个查询只需要几毫秒即可运行 但查询数量却有数千个 这发生在单个 EJB 事务内 15 分钟后 数据库关闭连接
  • 使用 ActionBar 选项卡进行导航时菜单会折叠

    我已经使用支持库中的 ActionBar 来将我的应用程序构建为选项卡式导航栏 我的应用程序中有两个选项卡 这两个片段都有菜单 并且有一个菜单项 我想将其显示为操作栏中的一项操作 但由于某种原因 显示了溢出图标 而不是分配给这些项目的图标
  • Java替换特殊字符

    我试图用仅包含特殊字符的模式替换文件中的特殊字符 但它似乎不起作用 String special Something great that special special replaceAll as 但是 当我运行时 我得到原始字符串而不是
  • 如何将 AES CCM 与 Bouncycastle JCE 提供程序一起使用 - CCMParameters

    是否可以使用JCE来执行CCM 我在互联网上看到很多使用非 JCE bouncycastle 类的示例 特别是 我看到他们调用 init 并传入 CCMParameters 对象 问题是 这个 CCMParameters 对象不是从 Alg
  • Java Swing - 在运行时动态切换语言环境

    我了解如何国际化 java 程序 但我有一个问题 我的程序中的语言可以随时切换 但我的程序可以存在多种状态 这意味着它可能会也可能不会打开多个 JLabels JPanel JFrame 等 是否有一个类或方法可以将当前的 GUI 更新为切
  • Android MediaCodec 在异步模式下比同步模式下慢?

    再次 我有一个关于 Android 的 MediaCodec 类的问题 我已成功解码原始 h264 内容并将结果显示在两个纹理视图中 h264 流来自运行 openGL 场景的服务器 该场景有一个摄像头 因此可以响应用户输入 为了进一步减少
  • 如何在 Java 中将 hashmap 转换为 JSON 对象 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在 Java 中将 hashmap 转换或转换为 JSON 对象 然后再次将 JSON 对象转换为 JSON 字符串 您可以使用 new
  • 通过 jclouds 使用 AWS (S3) - 如何承担角色

    使用普通身份验证凭据时 我可以执行以下操作 ContextBuilder newBuilder aws s3 credentials keyId key buildView BlobStoreContext class 访问 S3 的 Bl
  • 杰克逊:引用同一个对象

    在某些情况下 主体 例如 JSON 主体 中序列化或非序列化的数据包含对同一对象的引用 例如 包含球员列表以及由这些球员组成的球队列表的 JSON 正文 players name Player 1 name Player 2 name Pl
  • Java + JNA:找不到指定的过程

    我正在尝试使用 Visual Studio 创建一个 dll 文件并在 java 项目中使用 访问它 该库似乎已加载 但总是抛出相同的异常 线程 main 中出现异常 java lang UnsatisfiedLinkError 查找函数
  • 方法链接的优点和缺点以及用对象本身替换所有 void 返回参数的可能性

    我最感兴趣的是Java 但我认为这是一个普遍的问题 最近我一直在使用 Arquillian 框架 ShrinkWrap 使用了大量的方法链 方法链的其他示例是以下方法StringBuilder StringBuffer 使用这种方法有明显的
  • 如何从github项目获取jar? [复制]

    这个问题在这里已经有答案了 我想使用官方网站上的 kSoap2 android 库http simpligility github io ksoap2 android index html http simpligility github
  • 如何使用java.util.concurrent包实现后台线程?

    这是我首先使用的代码 但在最新的 Android 版本中AsyncTask类已被弃用并且 因此它没有响应 然后我使用了Thread类 但该类也不起作用 我想要与我得到的结果相同的结果AsyncTask班级 我知道我必须使用 java uti
  • EJB3 - 通过注入与查找获取 bean - 有什么区别、影响和陷阱?

    我知道有两种获取 EJB 实例的方法 通过 EJB 注释在 servlet 和 EJB 中进行依赖注入 在任何地方通过 Context lookup 进行 JNDI 查找 使用这两种方法有哪些差异 影响和陷阱 它们是一样的吗 依赖注入比查找
  • CoreNLP 如何识别小写的命名实体,例如 kobe bryant?

    我遇到一个问题 CoreNLP 只能识别以大写字符开头的命名实体 例如科比 布莱恩特 Kobe Bryant 但无法识别科比 布莱恩特 kobe bryant 作为一个人 那么CoreNLP如何识别以小写字符开头的命名实体 赞赏它 首先 您
  • Swing JTable:当行可见或滚动到底部时发生事件?

    我正在寻找一种方法 以便在 JTable 滚动时收到通知 以便特定行变得可见 或者在表底部滚动到视图中时失败 理想情况下 这应该在不轮询的情况下完成 而是通过一些事件触发来完成 有任何想法吗 Add a ChangeListener到滚动窗
  • Java 到 ruby​​ AES/ECB/PKCS5Padding 加密

    我有一个使用第三方支付门户的在线电子商务网站 支付门户一直运行良好 直到第三方支付门户要求每个人开始使用带有其他支付参数的哈希密钥 现在的问题是第三方支付门户只提供了一页文档来实现哈希密钥 这是提供的文档 加密演算法 为了减少数据传输和发布
  • Fragment中有类似setResult()的方法吗?

    我正在使用一个片段 我收到错误onResult 方法 我需要一个替代方法setResult RESULT OK data 我可以在我的片段中使用它 请帮忙 日历片段 package app pal study samplestudy imp
  • 使用 Android API 发布推文

    我一直在寻找一种使用 Android 应用程序发布推文的方法 但我发现的所有方法都不起作用 我不得不承认 Twitter 的 API 并不是那么容易理解 但是我的代码并不长 而且我看不出我的错误在哪里 这是我的代码 public class
  • Java 将函数添加到 json 对象而不使用引号。

    我正在用 java 构建一个 json 对象 我需要将一个函数传递到我的 javascript 中并使用 jquery isFunction 对其进行验证 我遇到的问题是我必须将 json 对象中的函数设置为字符串 但 json 对象将周围

随机推荐

  • 最火前端Web组态软件(可视化)

    前言 随着物联网 大数据等技术高速发展 我们逐步向数字化 可视化的人工智能 AI 时代的方向不断迈进 智能时代是工业 4 0 时代 我国工业领域正努力从 制造 迈向 智造 的新跨越 正文 1 mxgraph 介绍 开源免费 但是需要解决的问
  • CososCreator (Android)-AppLovin MAX 广告聚合平台接入+Firebase统计

    CososCreator 2 4 4 Android Studio 4 2 1 接入SDK有 接max聚合及中介平台 Admob FB applovin pangle mintegral vungle unity 和Firebase 统计
  • kubernetes(k8s)介绍

    记录自己的学习历程 应用部署方式演变 在部署应用程序的方式上 主要经历了三个时代 传统部署 互联网早期 会直接将应用程序部署在物理机上 优点 简单 不需要其它技术的参与 缺点 不能为应用程序定义资源使用边界 很难合理地分配计算资源 而且程序
  • 入门Webpack,看这篇就够了

    写在前面的话 阅读本文之前 先看下面这个webpack的配置文件 如果每一项你都懂 那本文能带给你的收获也许就比较有限 你可以快速浏览或直接跳过 如果你和十天前的我一样 对很多选项存在着疑惑 那花一段时间慢慢阅读本文 你的疑惑一定一个一个都
  • 笔试

    文章目录 前言 41 关键路径与路径优化 何为关键路径 怎么进行路径优化 1 组合逻辑中插入寄存器 插入流水线 2 寄存器平衡 重定时Retiming 3 操作符平衡 加法树 乘法树 4 消除代码优先级 case代替if else 5 逻辑
  • linux通过yum和官网下载jdk安装java步骤

    1 yum方式下载安装 1 查找java相关的列表 yum y list java 或者 yum search jdk 2 安装jdk yum install java 1 8 0 openjdk x86 64 3 完成安装后验证 java
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • elk笔记21--将DSL查询转为kibana短链接

    elk笔记21 将DSL查询转为kibana短链接 1 简介 2 功能实现 2 1 源码 2 2 测试 3 注意事项 4 说明 1 简介 较新版本的 kibana 前端都有一个 Share gt Short URL 的功能 用起来非常方便
  • springBoot项目与Eureka注册中心整合时候关于版本兼容问题

    java lang NoSuchMethodError org springframework boot builder SpringApplicationBuilder Ljava lang Object V 如果在搭建springboo
  • python基础总结:1.7、模块

    python基础总结 1 7 模块 文章目录 python基础总结 1 7 模块 1 更多有关模块的信息 1 1 以脚本的方式执行模块 1 2 模块搜索路径 1 3 编译过的 python文件 2 标准模块 3 dir 函数 4 包 4 1
  • 区分电角度和机械角度

    电角度的区别和联系 以下内容均来自于网络搜索 这里仅用作于自己记录笔记 解释1 机械角度意为空间几何角度 相当于360 电角度是指通过一个完整的周期内电流完成变化 从电磁分布的角度来看 永磁体 或励磁 产生的磁场空间分布呈现周期性变化 一个
  • 《SQL中有关DQL、DML、DDL、DCL的概念与区别》

    SQL Structure Query Language 结构化查询语言是数据库的核心语言 是高级的非过程化编程语言 它功能强大 效率高 简单易学易维护 SQL语言基本上独立于数据库本身 使用的机器 网络 操作系统 基于SQL的DBMS产品
  • 解决使用layui上传文件时提示“请求上传接口出现异常”

    在做网站的过程中 需要用户上传文件 接收文件的接口已经写好 经过测试确定可用 现在需要在网页上提供一个文件上传的按钮 由于原生input type file 组件太丑 考虑使用现成的框架layui 跑到layui官网上查看官方文档进行学习
  • 2023必须掌握的10大Web3技术

    2023必须掌握的10大Web3技术 1 区块链技术 Blockchain Technology 2 智能合约 Smart Contracts 3 物联网 IoT Internet of Things 4 云计算 Cloud Computi
  • git报错fatal: unable to access ‘XXX‘: SSL certificate problem: certificate has expired

    一 问题 在git bash中执行git clone xxx之后 并没有弹出登陆框 而是报以下错误 git报错fatal unable to access XXX SSL certificate problem certificate ha
  • Java中的直接赋值、浅拷贝和深拷贝

    将一个对象的引用复制给另外一个对象 一共有三种方式 第一种方式是直接赋值 第二种方式是浅拷贝 第三种是深拷贝 所以大家知道了哈 这三种概念实际上都是为了拷贝对象啊 直接赋值 好 下面我们先看第一种方式 直接赋值 在Java中 A a1 a2
  • 华为OD机试 - 数组分组(C++ & Java & JS & Python)

    描述 输入int型数组 询问该数组能否分成两组 使得两组中各元素加起来的和相等 并且 所有5的倍数必须在其中一个组中 所有3的倍数在另一个组中 不包括5的倍数 不是5的倍数也不是3的倍数能放在任意一组 可以将数组分为空数组 能满足以上条件
  • pandas.DataFrame.notnull返回非空值

    gt gt gt import pandas as pd gt gt gt df pd read csv test csv gt gt gt print df name id 0 ZhangSan 1 0 1 LiSi 2 0 2 Wang
  • 关于UML时序图与类图的学习(程序开发)

    时序图 时序图可以帮助我们更加清晰地看到一个系统之中各个对象的运行情况 有助于我们 梳理业务代码的结构 梳理一些框架的源码理清启动流程以及各个层次之间的关系 在绘制时序图的时候 我们需要接触七种元素 角色 Actor 对象 Object 生
  • 七. OpenFeign 服务接口调用

    目录 一 基础介绍 二 使用 OpenFeign 调用服务接口的实现步骤 服务提供方 服务消费方 OpenFeign 调用服务超时问题 OpenFeign 日志打印功能 服务消费方 yml 中配置 Feign 调用超时与 Feign 日志