SpringCloud之OpenFeign介绍案例+相关面试题

概述

OpenFeign是一个声明式的WEB服务客户端,它使WEB服务客户端变得更加容易。具有可插拔的注解支持,SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka,以及SpringCloud LoadBalance,以便在使用Feign时提供负载均衡的HTTP客户端Feign是一个远程调用的组件集成了Ribbon,默认的负载均衡策略是轮询

OpenFeign使用案例

① 调用设计图:

 

② order-service

server:
  port: 8080
spring:
  application:
    name: order-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    lease-renewal-interval-in-seconds: 5

 提供API

@RestController
public class OrderController {

    @GetMapping("doOrder")
    public String doOrder(){
        return "鱼香肉丝";
    }
}

③ user-service

作为消费者需要进行远程调用,加入OpenFeign依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

配置文件

server:
  port: 8081
spring:
  application:
    name: user-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    lease-renewal-interval-in-seconds: 5

启动类中添加@EnableOpenFeignClients注解,开启OpenFeign客户端远程调用的功能

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class UserServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

定义一个接口,添加@FeignClient注解并指定提供者的服务名

接口中的方法为提供者的API签名部分

/**
 * @FeignClient:value=提供者的服务名
 */
@FeignClient("order-service")
public interface UserOrderFeign {
    
    /**
     * 提供者的方法签名
     * 除方法体之外的全部属性
     */
    @GetMapping("doOrder")
    String doOrder();
}

创建Controlller注入该接口,提供API供浏览器进行请求

@RestController
public class UserController {

    @Autowired
    private UserOrderFeign userOrderFeign;

    @GetMapping("userDoOder")
    public String userDoOder(){
        return userOrderFeign.doOrder();
    }
}

④ 设置超时

默认超时时间为1s,修改Ribbon配置,查询DefaultClientConfigImpl

ribbon:
  ReadTimeout: 3000 #调用超时时间 3s
  ConnectTimeout: 3000 #连接超时时间 3s

底层核心原理

底层通过JDK动态代理获取到接口中的服务信息,使用Ribbon管理后的RestTemplate进行调用

@SpringBootTest
class ApplicationTests {

    @Autowired
    private RestTemplate restTemplate;

    @Test
    void contextLoads() {
        UserOrderFeign o = (UserOrderFeign) Proxy.newProxyInstance(UserOrderFeign.class.getClassLoader(), new Class[]{UserOrderFeign.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 获取目标方法上的注解
                GetMapping MethodAnnotation = method.getAnnotation(GetMapping.class);
                // 获取注解上的请求路径
                String path = MethodAnnotation.value()[0];
                // 获取目标方法所在的类
                Class<?> aClass = method.getDeclaringClass();
                // 获取类上面的注解
                FeignClient classAnnotation = aClass.getAnnotation(FeignClient.class);
                // 获取注解上的value值(服务名)
                String applicationName = classAnnotation.value();
                // 拼接URL
                String url = "http://"+applicationName+"/"+path;
                // 使用Ribbon托管后的RestTemplate进行调用
                return restTemplate.getForObject(url, String.class);
            }
        });
        String s = o.doOrder();
        System.out.println(s);
    }

}

 

日志

级别

  • NONE:默认的,不记录日志

  • BASE:记录请求方法、URL、响应状态码、执行时间

  • HEADERS:在BASE上增加了请求和响应头信息

  • FULL:在HEADERS上增加了请求和响应的正文、无数据

创建配置类

@Configuration
public class OpenFeignLevelConfig {
    
    @Bean
    public Logger.Level level(){
        return Logger.Level.FULL;
    }
}

修改配置文件

logging:
  level:
    com.jiuxiao.controller.feign.UserOrderFeign: debug

总结

1、openFeign是一个HTTP客户端,它融合了springmvc的注解,使之可以用REST风格的映射来请求转发。

2、可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射,亦或是作为service层处理逻辑,只不过这里,openFeign只是做一个请求转发的逻辑操作。

3、openFeign整合了hystrix做熔断处理,同时,可以和ribbon客户端负载均衡、Eureka注册中心配合使用,实现负载均衡的客户端。

4、openFeign有一个很重要的功能:fallback,其实它是hystrix的特性

 面试相关

1、如何使用?

  1. 首先,调用以及被调用的微服务双方都应该被注册到注册中心

  2. Spring Boot启动APP上标注 @EnableFeignClients注解。

  3. 编写远程调用接口并标注@FeignClient注解。(括号内添加所要调用的微服务名称)

  4. 接口中的方法为实际想要调用的服务的方法签名,并使用@PostMapping注解映射为一个post类型的HTTP请求。

Feign和openFeign有什么区别?

FeignopenFiegn
Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pyest+appium实现APP自动化测试,思路全总结在这里

目录 01、appium环境搭建 2、搭建pythonpytestappium环境 3、安装pycharm搭建项目编写脚本 4、执行测试 绵薄之力 01、appium环境搭建 安装nodejs http://nodejs.cn/ 为什么要安装nodejs&#xff1f; 因为appium这个工具的服务端是由nodejs语言开发的 安装jdk&#xf…

mysql数据库简介

1.什么是数据库&#xff1a;数据仓库。访问必须只能用SQL语句来访问。数据库也是一个文件的系统。 2.数据库的作用&#xff1a;存储数据的作用。开发任何的应用&#xff0c;都有数据库。 3.关系型的数据库&#xff1a;数据库中保存的都是实体与实体之间的关系。 4.常见的数据库…

2023接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…

stata绘图指令

stata绘图指令 – 潘登同学的stata笔记 文章目录 stata绘图指令 -- 潘登同学的stata笔记 绘图概览韦恩图折线图连线图线性拟合图直方图 函数图添加特殊字符和文字 绘图概览 Stata 提供的图形种类&#xff1a; twoway 二维图scatter 散点图line 折线图area 区域图lfit 线性拟合…

基于单片机的温室大棚环境监测系统设计

温室大棚对北方反季节蔬菜的种植具有重要意义。据了解全国各地温室大棚使用集中&#xff0c;但是大棚环境调控方式落后、管理落后、生产效率比较低。针对此问题本文提出了一种基于STM32单片机智能温室大棚控制系统方案&#xff0c;实现环境参数的自动检测&#xff0c;以达到智能…

2023年股票代持行业研究报告

第一章 股票代持概述 1.1 基本概念 股票代持&#xff0c;或称委托持股&#xff0c;是指实际出资人与名义出资人达成以下约定&#xff1a;名义出资人作为名义股东&#xff0c;在股东名册等公司工商登记信息上出现&#xff0c;而实际上由实际出资人出资并享有投资权益。 股票代…

Segment Anything论文详解(SAM)

论文名称&#xff1a;Segment Anything 论文地址&#xff1a;https://arxiv.org/abs/2304.02643 开源地址&#xff1a;https://github.com/facebookresearch/segment-anything demo地址&#xff1a;Segment Anything | Meta AI 主要贡献&#xff1a;开发一个可提示的图像分…

图片存储方案-七牛云存储

1.引语 在实际开发中&#xff0c;我们会有很多处理不同功能的服务器。例如&#xff1a; 应用服务器&#xff1a;负责部署我们的应用 数据库服务器&#xff1a;运行我们的数据库 文件服务器&#xff1a;负责存储用户上传文件的服务器 分服务器处理的目的是让服务器各司其职…

设计模式简述

设计模式(简述) 设计模式的分类 ​ 根据目的可以分为创建型、结构性和行为型三类&#xff1a; 创建型模型&#xff1a;创建对象结构性模型&#xff1a;处理类或对象的组合行为型模式&#xff1a;用于描述对类或对象怎样交互和怎么分派职责 ​ 根据范围可以分为类模式和对象…

nvm-windows的安装使用及踩坑指南

nvm是node的一款版本管理工具&#xff0c;可以简单操作node版本的切换、安装、查看。常规来说&#xff0c;开发中安装一个node版本就够了&#xff0c;但是最近在开发中有的老项目或者一些特定的项目需要来回切换node的版本&#xff0c;不可能手动去卸载掉之前的node版本&#x…

013:Mapbox GL添加marker

第013个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加marker。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhu…

算法时间复杂度计算

目录 1.时间复杂度计算 1.1 时间复杂度例题 1.1.1例题 1.1.2例题 1.1.3例题 1.1.4例题 1.2时间复杂度leetcode例题 1.时间复杂度计算 首先&#xff0c;我们需要了解时间复杂度是什么&#xff1a;算法的时间复杂度是指算法在编写成可执行程序后&#xff0c;运行时需要耗费…

使用 Floyd Warshall 检测负循环

我们得到了一个有向图。我们需要计算图形是否有负循环。负循环是循环的总和为负的循环。 在图形的各种应用中都可以找到负权重。例如,如果我们沿着这条路走,我们可能会得到一些好处,而不是为一条路付出代价。 例子:

Linux中的read/write和recv/send的区别,并使用recv/send实现简单的聊天功能

Linux中的read/write和recv/send的区别 r e a d / w r i t e read/write read/write的用法 r e c v / s e n d recv/send recv/send的用法 L i n u x Linux Linux中的 r e a d / w r i t e read/write read/write和 r e c v / s e n d recv/send recv/send的区别下面是一个使用…

Three.js教程:第一个3D场景

推荐&#xff1a;将 NSDT场景编辑器加入你3D工具链 其他工具系列&#xff1a; NSDT简石数字孪生 下面的代码完整展示了通过three.js引擎创建的一个三维场景&#xff0c;在场景中绘制并渲染了一个立方体的效果&#xff0c;为了大家更好的宏观了解three.js引擎&#xff0c; 尽量使…

基于SpringBoot的私人健身和教练的预约管理系统源码数据库论文

目 录 第一章 概述 1.1研究背景 1.2开发意义 1.3研究现状 1.4研究内容 1.5论文结构 第二章 开发技术介绍 2.1系统开发平台 2.2平台开发相关技术 2.2.1 Javar技术 2.2.2 Mysql数据库介绍 2.2.3 Mysql环境配置 2.2.4 B/S架构 2.2.5 Springboot框架 …

设计模式-结构型模式之外观模式

4. 外观模式 4.1. 模式定义 外观模式(Facade Pattern)&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个 高层接口&#xff0c;这个接口使得这一子系统更加容易使用。外观模…

socket 到底是个啥

哈喽大家好&#xff0c;我是咸鱼 我相信大家在面试过程中或多或少都会被问到这样一个问题&#xff1a;你能解释一下什么是 socket 吗 我记得我当初的回答很是浅显&#xff1a;socket 也叫套接字&#xff0c;用来负责不同主机程序之间的网络通信连接&#xff0c;socket 的表现…

使用树状图可视化聚类

一般情况下&#xff0c;我们都是使用散点图进行聚类可视化&#xff0c;但是某些的聚类算法可视化时散点图并不理想&#xff0c;所以在这篇文章中&#xff0c;我们介绍如何使用树状图&#xff08;Dendrograms&#xff09;对我们的聚类结果进行可视化。 树状图 树状图是显示对象…

大模型混战,阿里百度华为谁将成就AI时代的“新地基”?

从算力基础到用户生态&#xff0c;群雄逐鹿大模型 自2022年stable diffusion模型的进步推动AIGC的快速发展后&#xff0c;年底&#xff0c;ChatGPT以“破圈者”的姿态&#xff0c;快速“吸粉”亿万&#xff0c;在全球范围内掀起了一股AI浪潮&#xff0c;也促使了众多海外巨头竞…