微服务-Fegin

news2024/9/27 17:31:27

在之前我们两服务之间调用的时候用的是restTemplate,但是这个方式调用存在很多的问题

  String url = "http://userservice/user/" + order.getUserId();
  • 代码可读性差,编码体验不统一
  • 参数复杂的url难以维护

所以我们大力推出我们今天的主角--Fegin

       Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决上面的问题

定义和使用Fegin客户端

1.引入依赖

 <!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.在A服务的启动类中添加注解开启Figin的功能

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients//Feign的客户端
public class OrderApplication {

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

3.编写Feign客户端:

@FeignClient(value = "userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

/*
基于SpringMVC的注解来声明远程调用的信息
服务名称:userservice
请求方式:GET
请求路径:/user/{id}
请求参数:Long id
返回值类型:User
*/

4.使用Fegin客户端代替RestTemplate


    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

Fegin的使用步骤

  • 引入依赖
  • 添加@EnableFeginClient注解
  • 编写FeginClient接口
  • 使用FeginClient中定义的方法代替RestTemplate

自定义配置来覆盖默认配置,可修改为:

类型作用说明
fegin.Logger.Decoder修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL

feign.codec.Decoder

响应结果的解析器

http远程调用的结果做解析,例如解析json字符串为java对象

feign.codec.Encoder

请求参数编码

将请求参数编码,便于通过http请求发送

feign. Contract

支持的注解格式

默认是SpringMVC的注解

feign. Retryer

失败重试机制

请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

自定义Fegin的配置

一般配置Fegin日志一般有两种方式:

方法一:

1.全局生效:

feign:
  client:
    config: 
      default: #这里default就是全局变量,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #日志级别

2.局部生效

feign:
  client:
    config: 
      userservice: #这里userseervice就是局部变量
        loggerLevel: FULL #日志级别

方法二(java代码方式):

public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}

1.如果是全局配置,则将它放到@EnableFeginClients这个注解中:

@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeign

2.如果是局部配置,则把它放到@FeginClient这个注解中:

@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)

Fegin性能优化

Fegin的底层的客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

优化Fegin的性能主要包括:

  • 使用连接池代替默认的URLConnection
  • 日志级别,最好用basic或者none

Fegin添加FttpClient的支持:

引入依赖:

 <!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

配置连接池:

feign:
  client:
    config:
      default: #这里default就是全局变量,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #日志级别
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数

Fegin的最佳实践

 

@EnableFeignClients(clients ="com.ffyc.fegin.clients")

       如果按照第二种方法将Fegin客户端独立出去,在启动SpringBootAppliaction的扫描包范围时,这些Fegin客户端无法使用,所以我们需要去解决这个问题

方式一(指定FeginClient所在包):

@EnableFeignClients(clients ="ffyc.com.fegin.clients")

方式二(指定FeginClient字节码):

@EnableFeignClients(clients ={ UserClient.class})

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

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

相关文章

大数据时代下的GIS:数据驱动的地理智能

在当今信息时代&#xff0c;大数据技术的飞速发展正深刻影响着各个领域&#xff0c;地理信息系统&#xff08;GIS&#xff09;作为其中之一&#xff0c;也在大数据的浪潮下展现出了新的活力和潜力。 大数据为GIS注入了强大的数据能量 过去&#xff0c;地理信息数据的收集和存储…

B站一个月内涨粉57万,情景剧再迎黑马UP主

飞瓜数据&#xff08;B站版&#xff09;【达人排行榜】-【涨粉榜】显示&#xff0c;继上次的【成长榜】第三之后&#xff0c;UP主-显眼宝-在本周登上了涨粉榜第三的位置&#xff0c;单周涨粉就超过22万。 从UP主的粉丝趋势图来看&#xff0c;自7月起UP主账号就多次出现涨粉峰值…

Sealos 国内集群正式上线,可一键运行 LLama2 中文版大模型!

2023 年 7 月 19 日&#xff0c;MetaAI 宣布开源旗下的 LLama2 大模型&#xff0c;Meta 首席科学家、图灵奖得主 Yann LeCun 在推特上表示 Meta 此举可能将改变大模型行业的竞争格局。一夜之间&#xff0c;大模型格局再次发生巨变。 不同于 LLama&#xff0c;LLama2 免费可商用…

【仿写框架之仿写Tomact】三、使用socket监听配置文件中的端口接收HTTP请求并创建线程池处理请求

文章目录 1、自定义配置文件2、使用DOM解析XML文件3、创建Tomcat启动方法&#xff08;解析配置文件、创建线程池、socket循环监听端口&#xff09; 1、自定义配置文件 首先在main文件下创建资源目录resources&#xff1a; 在resource目录下创建server.xml文件&#xff0c;并写…

第二章-自动驾驶卡车-自动驾驶卡车前装量产的要求

1、自动驾驶卡车的特点与挑战 重卡主要运行在相对封闭的高速公路&#xff0c;相较城市道路场景看似更简单。但是&#xff0c;由于重卡特有的物理特性、运行环境和商业运营要求&#xff0c;相较于乘用车的自动驾驶系统&#xff0c;重卡的自动驾驶系统对车辆的感知距离和精度、系…

【操作系统】24王道考研笔记——第一章 计算机系统概述

第一章 计算机系统概述 一、操作系统基本概念 1.1 定义 1.2 特征 并发 &#xff08;并行&#xff1a;指两个或多个事件在同一时刻同时发生&#xff09; 共享 &#xff08;并发性指计算机系统中同时存在中多个运行着的程序&#xff0c;共享性指系统中的资源可供内存中多个并…

Vue实现动态可视化

1、可视化效果&#xff1a; 水晶球环绕地球旋转&#xff1b; 2、实现 <template><div class"container"><div class"header-body"><div class"header-left"></div><div class"header-title">网…

删除了很久的备忘录怎么恢复?快速恢复误删备忘录的方法

习惯于经常使用手机来记录事情的网友&#xff0c;应该都对备忘录软件不陌生&#xff0c;因为我们可以直接在备忘录中记录心情日记、读书笔记、生活琐事以及其他重要的事情&#xff0c;这样就不用担心自己会忘记了。不过也有一些备忘录用户表示自己在整理无效备忘录时&#xff0…

gtsam使用-Pose2 SLAM

Pose2 SLAM Pose2 SLAM是一种昂进行同时定位与地图构建&#xff08;SLAM&#xff09;的一种简单方法是仅仅融合连续机器人姿态之间的相对姿态测量。这种不涉及地标的SLAM变体通常被称为 "Pose SLAM"。 %pip -q install gtbook # also installs latest gtsam pre-re…

安防监控视频汇聚平台EasyCVR视频平台调用iframe地址无法播放的问题解决方案

安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝…

Docker容器:docker基础概述、docker安装、docker网络

文章目录 一.docker容器概述1.什么是容器2. docker与虚拟机的区别2.1 docker虚拟化产品有哪些及其对比2.2 Docker与虚拟机的区别 3.Docker容器的使用场景4.Docker容器的优点5.Docker 的底层运行原理6.namespace的六项隔离7.Docker核心概念 二.Docker安装 及管理1.安装 Docker1.…

[C++] string类的介绍与构造的模拟实现,进来看吧,里面有空调

文章目录 1、string类的出现1.1 C语言中的字符串 2、标准库中的string类2.1 string类 3、string类的常见接口说明及模拟实现3.1 string的常见构造3.2 string的构造函数3.3 string的拷贝构造3.4 string的赋值构造 4、完整代码 1、string类的出现 1.1 C语言中的字符串 C语言中&…

【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】

【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】 文章目录 【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】前言整形数除法和取余数合并除法和取余数通过2的幂次进行除法和取余数取模的一种替代方法使用数组下标全局变量使用别名变量的生命周期分割变量类型局部变量指针…

Lnton羚通关于如何使用OpenCV-Python在直方图中查找显示分析

什么是直方图&#xff1f; 直方图是统计图像中像素亮度或颜色等分布的一种常用工具&#xff0c;几乎所有图像处理的工具都提供了这种工具&#xff0c;X轴表示 0~255&#xff08;刻度大小与Bin设置有关系&#xff09;&#xff0c;Y轴统计个数&#xff08;频率&#xff09;。 【…

VIOOVI:标准的作业规范要求是什么?标准化作业规范怎么写?

本文围绕“标准化作业”展开论述&#xff0c;分享一些关于标准化作业以及标准的作业规范等相关知识。 什么是标准化作业&#xff1f; 标准化作业是一种以人的行为为中心&#xff0c;在一个操作序列中有效地进行生产而没有浪费的操作方法。 标准化作业的前提即&#xff1a;关注…

从零开始打造家装预约咨询小程序

在如今互联网高度发达的时代&#xff0c;家装行业也逐渐意识到了线上渠道的重要性。为了更好地服务客户&#xff0c;提高用户体验&#xff0c;越来越多的家装公司开始寻找合适的小程序制作平台。本文将向大家介绍如何使用第三方制作平台&#xff0c;如乔拓云网&#xff0c;打造…

Android 9.0 Vold挂载流程解析(上)

Android 9.0 Vold挂载流程解析&#xff08;上&#xff09; 前言Android挂载模块整体框架Vold进程main函数详细分析总结 前言 我们分2篇文章来介绍Android 9.0中存储卡的挂载流程&#xff0c;本篇文章先介绍总体的挂载模块、Vold进程的入口main函数的详细分析&#xff0c;有了这…

文心一言最新重磅发布!

8月16日&#xff0c;由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023举办。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰以《大语言模型为通用人工智能带来曙光》为题&#xff0c;阐述了大语言模型具备理解、生成、逻辑、记忆…

C++新经典01--函数递归

函数的递归 #include <stdio.h> void diguifunc() {printf("diguifunc()函数执行\n");diguifunc();//自己调用自己 }void main(){diguifunc(); }把程序执行起来&#xff0c;等几秒钟&#xff0c;可以看到&#xff0c;屏幕不断滚动并输出如下内容&#xff1a; …

通过cpolar分享本地电脑上有趣的照片:部署piwigo网页【无公网IP内网穿透】

在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。我们是移动开发领域的优质创作者&#xff0c;同时也是阿里云专家博主。 ✨ 关注我们的主页&#xff0c;探索iOS开发的无限可能&#xff01; &#x1f525;我们与您分享最新的技术洞察和实战经验&#xff0c;助您在移动应…