SpringCloud Feign-声明性Http请求以及Hystrix-Http请求的熔断配置

1、OpenFeign

1.1 概述

– Feign是一个声明性web服务客户机。它使编写web服务客户机变得更容易。

– 它的使用方法是定义一个服务接口并在上面添加注解

– Feign支持可插拔编码器和解码器。

– Spring Cloud对Feign进行了封装,使其支持SpringMVC标准注解和HttpttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。 

1.2 Feign的作用

Feign旨在使编写Java Http客户端变得更容易。

前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口可能被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由它来定义和实现依赖服务接口的定义。在Feign的实现下,只需要创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上标注一个Feign注解即可),即可完成对服务提供方的的接口绑定,简化了使用Spring Cloud Ribbon时,自动封装服务调用客户端的开发量。 

1.3 Feign集成了Ribbon

利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务的调用。 

1.4 Feign和OpenFeign的区别

Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。

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

OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

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

2、Fegin的使用

2.1 EnableFeignClients

在启动类上使用@EnableFeignClients注解开启Feign客户端,并注入RestTemplate

package com.fcant.userservice;import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;/*** UserServiceApplication** encoding:UTF-8* @author Fcant 9:54 2019/12/9*/
@EnableFeignClients
@SpringCloudApplication
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}    @Bean
    @LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

2.2 Fegin的Service层

  • 在接口层使用注解**@FeignClient(name = "area-service")**指定请求的服务名
  • 请求中有参数需要通过**@PathVariable(name = "countryId")**注解的name属性指定才能解析反射值

package com.fcant.userservice.feign;
import com.fcant.userservice.bean.Country; 
import org.springframework.cloud.openfeign.FeignClient; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.PathVariable;
/**
ICountryService
通过@FeignClient注解指定Feign客户端,名称为要访问的服务名encoding:UTF-8 *
@author Fcant 10:24 2019/12/9 */ 
@FeignClient(name = “area-service) public interface ICountryService {/**queryCountryFeign中没有指定@PathVariable(name = “countryId)变量映射关系,必须通过name属性指定 *@param countryId 城市ID@return com.fcant.userservice.bean.Country@author Fcant 10:53 2019/12/9 */ @GetMapping(/country/{countryId}) Country queryCountry(@PathVariable(name = “countryId) long countryId); 
}

 2.3 接口层

接口层的调用和使用和平常的Controller没什么区别,把Service层注入即可

java
package com.fcant.userservice.controller;import com.fcant.userservice.bean.Country;
import com.fcant.userservice.bean.User;
import com.fcant.userservice.feign.ICountryService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;/*** FeignController* <p>* encoding:UTF-8** @author Fcant 10:06 2019/12/9*/
@RestController
@RequestMapping("/user")
public class FeignController {private static final List<User> USER_LIST;static {List<User> userList = new ArrayList<>();userList.add(new User(3L, "User 03", "男", "user03@fcant.com", 1L, ""));userList.add(new User(4L, "User 04", "女", "user04@fcant.com", 2L, ""));USER_LIST = userList;}private final ICountryService countryService;public FeignController(ICountryService countryService) {this.countryService = countryService;}    @GetMapping("/feign")public List<User> queryUser() {List<User> userList = new ArrayList<>(USER_LIST);userList.forEach(user -> {Country country = countryService.queryCountry(user.getCountryId());user.setCountryName(country.getCountryName());});return userList;}
}

3、Fegin异常处理的回调

A.在接口的注解上添加fallback属性指定异常回调的类

package com.fcant.userservice.feign;import com.fcant.userservice.bean.Country;
import com.fcant.userservice.feign.impl.CountryServiceImpl;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;/*** ICountryService* 通过@FeignClient注解指定Feign客户端,名称为要访问的服务名* <p>* encoding:UTF-8** @author Fcant 10:24 2019/12/9*/
@FeignClient(name = "area-service", fallback = CountryServiceImpl.class)
public interface ICountryService {/*** queryCountry* Feign中没有指定@PathVariable(name = "countryId")变量映射关系,必须通过name属性指定** @param countryId 城市ID* @return com.fcant.userservice.bean.Country* @author Fcant 10:53 2019/12/9*/
    @GetMapping("/country/{countryId}")Country queryCountry(@PathVariable(name = "countryId") long countryId);
}

B.在指定的处理异常的类中实现接口的方法进行处理

  • 该类实现FeginClients注解指定的接口
  • 该类添加@Component注解将其作为Bean注入

package com.fcant.userservice.feign.impl;
import com.fcant.userservice.bean.Country; import com.fcant.userservice.feign.ICountryService; import org.springframework.stereotype.Component;
/**
CountryServiceImplencoding:UTF-8 *
@author Fcant 14:24 2019/12/9 */ @Component public class CountryServiceImpl implements ICountryService {
private static final Country ERROR = new Country(1L, “ERROR); /**
queryCountry
Feign中没有指定@PathVariable(name = “countryId)变量映射关系,必须通过name属性指定 *
@param countryId 城市ID
@return com.fcant.userservice.bean.Country
@author Fcant 10:53 2019/12/9 */ @Override public Country queryCountry(long countryId) { return ERROR; }}

Fegin的异常处理属于熔断的范围,要在配置文件配置开启熔断-application.yml

feign:hystrix:enabled: true

4、关于Feign访问超时的配置

如果不配置访问超时则会报如下异常

feign.RetryableException: Read timed out executing POST http://******

因为Feign接口调用分两层,Ribbon的调用Hystrix调用,理论上设置Ribbon的时间即可,但是Ribbon的超时时间和Hystrix的超时时间需要结合起来,按照木桶原则最低的就是Feign的超时时间,建议最好配置超时时间一致。经过配置一下application设置后,完美解决了问题。因为第三方接口中需要3~20秒不等的时间,所以这个数值也是根据自己的业务系统情况设置的。

hystrix的超时时间
hystrix:command:default:execution:timeout:enabled: trueisolation:thread:timeoutInMilliseconds: 30000
ribbon的超时时间-设置feign客户端超时时间(openfeign默认支持ribbon
ribbon:
    # 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间ReadTimeout: 30000
  # 指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 30000

5、OpenFeign日志增强

Feign提供了日志打印功能,可以通过配置来调整日志级别,从而了解Feign中Http请求的细节。对Feign接口的调用情况进行检控和输出。

  • NONE:默认的,不显示任何日志。
  • BASIC:仅记录请求方法、URL、响应状态吗即执行时间。
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息。
  • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。 

(1)添加配置类指明日志打印级别

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
  @BeanLogger.Level feignLoggerLevel(){return Logger.Level.FULL;}
}

(2)application.yml/properties配置文件开启日志的Feign客户端

logging:level:
  #feign日志以什么级别监控哪个接口com.atguigu.springcloud.service.PaymentFeignService: debug

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

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

相关文章

1.1 理解大数据(2)

小肥柴的Hadoop之旅 1.1 理解大数据&#xff08;2&#xff09; 目录1.1 理解大数据1.1.3 大数据概述1.1.4 更多思考 参考文献和资料 目录 1.1 理解大数据 1.1.3 大数据概述 step_0 大数据定义 【《大数据算法设计分析》】&#xff1a; 通常来讲大数据&#xff08;Big Data&am…

生态系统服务构建生态安全格局中的实践技术应用

生态安全是指生态系统的健康和完整情况。生态安全的内涵可以归纳为&#xff1a;一&#xff0c;保持生态系统活力和内外部组分、结构的稳定与持续性&#xff1b;二&#xff0c;维持生态系统生态功能的完整性&#xff1b;三&#xff0c;面临外来不利因素时&#xff0c;生态系统具…

解决jenkins的Exec command命令不生效,或者执行停不下来的问题

Jenkins构建完后将war包通过 Publish Over SSH 的插件发布到服务器上&#xff0c;在服务器上执行脚本时&#xff0c;脚本中的 nohup 命令无法执行&#xff0c;并不生效&#xff0c;我配置的Exec command命令是后台启动一个war包&#xff0c;并输出日志文件。 nohup java -jar /…

MySQL数据库连接超时和自动重连

1、当我们连接一个数据库的时候&#xff0c;当ip是错的&#xff0c;但是他还是很耗时间的&#xff0c;大概30s之后才会通知连接失败&#xff0c;该操作是十分费时的 所以可以使用 //&是你自己初始化的数据库名字 //&time3表示3秒连接不上&#xff0c;直接报错 int ti…

批量美化图片:让您的图片库焕然一新!

您是否曾经遇到过这样的问题&#xff1a;在处理大量图片时&#xff0c;一张一张地调整时间和精力成本太高&#xff1f;现在&#xff0c;我们为您带来了一款全新的批量图片美化工具&#xff0c;让您轻松解决这个问题&#xff01; 首先&#xff0c; 我们要进入首助编辑高手主页面…

(每日持续更新)jdk api之BufferedReader基础

&#xff08;每日持续更新&#xff09;jdk api之BufferedReader基础 1.8 BufferedReader BufferedReader 是 Java 中 Reader 的缓冲流实现&#xff0c;用于提高读取字符数据的性能。它提供了一些额外的属性和方法&#xff0c;以增强对字符流的操作。 以下是 BufferedReader …

/etc/profile文件一不小心改坏了,所有命令无法执行了怎么办?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 在部署jdk的时候&#xff0c;修改/etc/profile文件&#xff0c;文件改得有问题&#xff0c;但是当时没有…

【二】CocosCreator-CCGame.js源码分析

PS&#xff1a;只是看源码学习过程中把认为重要的内容以笔记的形式记录下来。 【1】config&#xff1a;当前游戏的一些配置 1.debugMode&#xff1a;用于控制输出日志的级别 2.showFPS&#xff1a;是否显示FPS 3.exposeClassName 4.frameRate&#xff1a;设置游戏帧率 5.id 6.…

redis单机部署

一、下载redis压缩包tar.gz 官网下载&#xff0c;现在一般用6.x以上版本 二、上传指定目录&#xff0c;解压缩 #假如上传到redis用户的家目录 cd /home/redis tar -zxvf redis-6.2.14.tar.gz 三、进入解压缩目录&#xff0c;进行编译 cd redis-6.2.14 make &&a…

SSH以及Dropbear介绍

SSH 1、什么是SSH (1)SSH仅仅是一种协议标准&#xff0c;目的是实现安全远程登录及安全网络服务。 2、实现SSH的工具有哪些 (1)开源OpenSSH&#xff0c;使用最广泛。 (2)Dropbear&#xff0c;轻量级SSH。 3、SSH可以实现的功能场景 (1)安全远程登录 (2)安全的端口转发 ①本地端…

【elfboard linux开发板】5.vmware tools安装及uart属性的获取和设置

1. 安装VMware tools 系统&#xff1a;ubuntu22.04 虚拟机版本&#xff1a;VMware workstation 16 pro&#xff08;16.1.2&#xff09; VMware tools文件&#xff08;iso)一般在虚拟机目录下&#xff0c;如果没有&#xff0c;这是下载网址&#xff0c;找到对应的虚拟机版本下载…

ARM笔记-----输入捕获

输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获&#xff0c;常用的有测量输入信号的脉 宽&#xff0c;和测量 PWM 输入信号的频率和占空比这两种。 输入捕获的大概的原理 当捕获到信号的跳变沿的时候&#xff0c;把计数器 CNT 的值锁存到捕获寄 存器 CCR 中…

2023机器人行业总结,2024机器人崛起元年(具身智能)

2023总结&#xff1a; 1.Chatgpt引爆了通用人工智能&#xff0c;最大的受益者或是机器人&#xff0c;2023年最热门的创业赛道便是人形机器人&#xff0c;优必选更是成为人形机器人上市第一股&#xff0c; 可以说2023年是机器人开启智能化的元年&#xff0c;而2024则将成为机器…

【动态规划】LeetCode-10. 正则表达式匹配

10. 正则表达式匹配。 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 …

winform简易用户权限管理系统

一、功能简介 1. 数据库可使用sqlite、mssql、mysql等 2. 管理员账号不管控&#xff0c;其余账号进行权限管控&#xff08;左侧菜单&#xff0c;表单按钮&#xff09;&#xff0c;且只能看到自己创建的角色、用户 二、操作界面 1. 管理员账号登陆后&#xff0c;左侧菜单栏自动…

SVN迁移至GitLab,并附带历史提交记录

Git在代码管理方面比SVN有更多的优势&#xff0c;如代码审查&#xff0c;分支和合并。 一、准备工作 安装Git环境&#xff0c;配置本地git账户信息&#xff1a; git config --global user.name "XXX" git config --global user.email "XXXmail.com"可通…

对象存储的策略问题

对象存储中的数据可以让其他用户访问吗&#xff1f; 对象存储&#xff08;简称ZOS&#xff09;中的数据有两种常见的方式可以授予其他用户访问权限&#xff1a; 桶级别的访问控制列表&#xff08;ACL&#xff09;&#xff1a;您可以在桶上设置ACL&#xff0c;定义哪些用户具有…

基于矩阵乘的CUDA编程优化过程

背景&#xff1a;网上很多关于矩阵乘的编程优化思路&#xff0c;本着看理论分析万遍&#xff0c;不如实际代码写一遍的想法&#xff0c;大概过一下优化思路。 矩阵乘的定义如下&#xff0c;约定矩阵的形状及存储方式为: A[M, K], B[K, N], C[M, N]。 CPU篇 朴素实现方法 按照…

C/C++汇编学习(一)——C++代码到汇编代码的转换

目录 一、 学习C编译过程 预处理器的作用 编译器如何将C代码转换为汇编 汇编代码示例&#xff08;假设&#xff09; 链接器的作用 二、 使用编译器探索C代码的汇编表示 使用GCC查看汇编输出 使用Visual Studio查看汇编输出 比较不同优化级别的汇编代码 三、 理解C控制…

判断两张图片是否完全一致

判断两张图片是否为完全相同的图片 批量判断尺寸 大小 图像展示内容体是否完全一致的图片 import os import hashlib from PIL import Imagedef check_img_repeat(directory):"""批量对图片进行重复性校验是检查一组图像中是否有相同或几乎相同的图像副本。一…