【微服务笔记12】微服务组件之Hystrix和OpenFeign结合使用

news2025/1/6 22:19:33

这篇文章,主要介绍微服务组件之Hystrix和OpenFeign结合使用。

目录

一、Hystrix和OpenFeign结合使用

1.1、引入依赖

1.2、openfeign启用hystrix

1.3、编写FeignClient接口

1.4、编写FeignClient实现类

1.5、编写Controller控制器

1.6、启动类启动OpenFeign

1.7、运行测试

1.8、捕获异常信息


一、Hystrix和OpenFeign结合使用

在实际开发中,Hystrix都是和OpenFeign组件一起结合使用的,OpenFeign组件中已经包含了Hystrix,但是默认情况下,OpenFeign是没有开启Hystrix的功能,我们需要在application.yml配置文件中手动的开启Hystrix的功能。

1.1、引入依赖

  • 引入openfeign组件中已经引入了hystrix的依赖,所以这里只需要引入openfeign依赖即可。
<!-- 引入 OpenFeign 依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 需要注意的是,OpenFeign虽然集成了Hystrix,但是如果你要使用Hystrix中的 @HystrixCommand等注解,那还是需要引入下面的依赖。
  • 注意:hystrix的依赖根据需要自行引入,如果你项目中要使用hystrix的注解,那就引入这个依赖。
<!-- 引入 hystrix 依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

1.2、openfeign启用hystrix

在application.yml配置文件中,添加如下配置:

# openfeign 开启 hystrix 的支持
feign:
  hystrix:
    enabled: true

1.3、编写FeignClient接口

  • 在@FeignClient注解中,使用 fallback 属性指定服务降级之后的处理类。
package com.gitcode.hystrix.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/4/13 11:14
 * @Copyright (C) ZhuYouBin
 * @Description: openfeign 和 hystrix 结合使用
 */
@FeignClient(name = "hystrix-provider", fallback = HystrixFallback.class)
public interface HystrixFeignClient {

    @GetMapping("/hystrix/provider/getById")
    Map<String, String> getUserInfoById(@RequestParam("id") String id);
    
}

1.4、编写FeignClient实现类

  • 需要注意的是:这个实现类必须注入到IOC容器里面。
package com.gitcode.hystrix.service;

import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/4/13 11:16
 * @Copyright (C) ZhuYouBin
 * @Description: 用于 hystrix 实现服务降级的类
 */
// 将当前类注入到 IOC 容器里面
@Component
public class HystrixFallback implements HystrixFeignClient {

    @Override
    public Map<String, String> getUserInfoById(String id) {
        System.out.println("服务降级,请稍后重试!");
        Map<String, String> map = new HashMap<>();
        map.put("uname", "服务降级");
        map.put("pass", "000");
        map.put("age", "0");
        return map;
    }

}

1.5、编写Controller控制器

package com.gitcode.hystrix.controller;

import com.gitcode.hystrix.service.HystrixFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/4/13 11:27
 * @Copyright (C) ZhuYouBin
 * @Description:
 */
@RestController
@RequestMapping("/api/openfeign")
public class HystrixOpenFeignController {
    @Autowired
    private HystrixFeignClient hystrixFeignClient;
    
    @GetMapping("/hystrix")
    public Map<String, String> hystrix(String id) {
        return hystrixFeignClient.getUserInfoById(id);
    }
}

1.6、启动类启动OpenFeign

package com.gitcode.hystrix;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @version 1.0.0
 * @Date: 2023/4/13 11:11
 * @Copyright (C) ZhuYouBin
 * @Description:
 */
// 启动类启动 OpenFeign 扫描
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class FeignHystrixApp {
    public static void main(String[] args) {
        SpringApplication.run(FeignHystrixApp.class, args);
    }
}

1.7、运行测试

到这里,Hystrix和OpenFeign就基本上可以一起使用啦,启动工程,访问接口,当访问超时或者出现异常时候,就会调用服务降级之后的方法。

1.8、捕获异常信息

采用上面那种方式,当接口调用出现异常的时候,控制台是不会抛出异常的,所以为了能够获取到异常信息,OpenFeign中的@FeignClient注解提供了一个fallbackFactory属性。fallbackFactory属性需要指定一个服务降级工厂类,自定义的工厂类需要实现【FallbackFactory】接口,并且重写其中的【create()】方法,这个方法中会有一个Throwable类型的参数,这个参数就是运行过程中出现的一些异常信息。

package com.gitcode.hystrix.service;

import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/4/13 11:35
 * @Copyright (C) ZhuYouBin
 * @Description: 自定义的服务降级工厂类
 */
@Component
public class HystrixFallbackFactory implements FallbackFactory<HystrixFeignClient> {

    @Override
    public HystrixFeignClient create(Throwable ex) {
        return new HystrixFeignClient() {
            @Override
            public Map<String, String> getUserInfoById(String id) {
                System.out.println("[HystrixFallbackFactory]服务降级,请稍后重试!出现的异常是: " + ex.getMessage());
                Map<String, String> map = new HashMap<>();
                map.put("uname", "服务降级");
                map.put("pass", "000");
                map.put("age", "0");
                return map;
            }
        };
    }

}

在对应的Feign接口中,使用fallbackFactory属性。

@FeignClient(name = "hystrix-provider", fallbackFactory = HystrixFallbackFactory.class)

到此,Hystrix和OpenFeign结合使用就介绍完啦。

综上,这篇文章结束了,主要介绍微服务组件之Hystrix和OpenFeign结合使用。

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

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

相关文章

Apache网页的优化,安全与防盗链

在企业中&#xff0c;部署Apache后只采用默认的配置参数&#xff0c;会引发网站很多问题&#xff0c;换言之默认配置是针对以前较低的服务器配置的&#xff0c;以前的配置已经不适用当今互联网时代。 为了适应企业需求&#xff0c;就需要考虑如何提升Apache的性能与稳定性&…

智慧水务系统-全域孪生驾驶舱-三维实景模型

平台概述 柳林智慧水务系统平台是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心&#xff0c;以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧运维等产品体系为支撑&#xff0c;以城市水资源、水生态、水…

LeetCode-152. 乘积最大子数组

目录思路动态规划题目来源 152. 乘积最大子数组 思路 这题跟LeetCode-53. 最大子数组和很像 最后把整个 dp 数组看一遍求最大值即可。因此状态转移方程可能是&#xff1a; dp[i] Math.max(dp[i-1]nums[i],nums[i]);说明&#xff1a;牢记状态的定义&#xff0c;一定以下标 i…

Android13 PMS是如何启动的?

作者&#xff1a;Arthas0v0 平常使用安卓实际就是在使用各种app&#xff0c;而下载的app实际是一个apk文件。这个apk文件的安装就交给了PackageManagerService来实现。PackageManagerService的启动也是在SystemServer中。这个过程比较长需要长一点的时间来理。 SystemServer.s…

2023-04-09 有向图及相关算法

有向图及相关算法 1 有向图的实现 有向图的的应用场景 社交网络中的关注互联网连接程序模块的引用任务调度学习计划食物链论文引用无向图是特殊的有向图&#xff0c;即每条边都是双向的 改进Graph和WeightedGraph类使之支持有向图 Graph类的改动WeightedGraph类的改动 2 …

肖 sir_就业课__004项目流程(H模型)

项目流程&#xff1a; 一、面试提问&#xff08;h模型&#xff09; 1、你说下你们公司测试流程&#xff1f; 2、给你一个需求你会怎么做? 3、你讲下你的工作&#xff1f; 4、谈谈你是如何去测试&#xff1f; 答案&#xff1a;h模型 要求第一人称来写 讲解简化文字流程&#x…

基于Python实现的深度学习技术在水文水质领域应用

目录 一、深度学习的基本概念和发展现状 二、Python系列开源软件包基本用法 三、前馈神经网络模型、原理和代码实现 四、前馈神经网络模型在水质、水位预测中的应用 五、卷积神经网络模原理、结构和应用&#xff0c;与支持向量机进行比较 六、循环神经网络原理与结构 七…

web 页面在浏览器运行eval性能分析和优化

公司有个低代码老项目&#xff0c;里面有一些自定义脚本运行使用了大量的eval 动态运行。 分析 网上对eval 的争论也非常激烈&#xff0c;大部分不建议使用&#xff0c;一些人观点是用不好才导致问题。 eval 是否真的存在效率问题&#xff1f; eval is evil 我们知道new Fun…

定时任务-常用的cron表达式

常用cron表达式例子&#xff1a; &#xff08;1&#xff09;0/2 * * * * ? 表示每2秒 执行任务 &#xff08;1&#xff09;0 0/2 * * * ? 表示每2分钟 执行任务 &#xff08;1&#xff09;0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务 &#xff08;2&#xff09;0 15 1…

宝塔设置PHP定时任务实战记录(定时任务、ajax异步刷新API、shell脚本、访问url)

文章目录项目需求生产环境一、php定时任务二、实战开发1.创建mysql数据表2.入库封装函数&#xff08;1&#xff09;封装入库&#xff08;2&#xff09;入库操作3.定时任务的实现&#xff08;1&#xff09;$ajax异步调用法&#xff08;2&#xff09;宝塔定时访问url&#xff08;…

http请求头部(header)详解

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行&#xff0c;一个或者多个头域&#xff0c;一个只是头域结束的空行和可 选的消息体组成。HTTP的头域包括通用头&#xff0c;请求头&#xff0c;响应头和实体头四个部分。每个…

OpenShift 4 - 通过 SSH 远程访问 OpenShift Virtualization 的虚拟机

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 在《OpenShift 4 - 用 OpenShift Virtualization 运行容器化虚拟机 &#xff08;视频&#xff09;》一文中使用了 OpenShift 控制台直接访问运行在 OpenSh…

【Python实战】从架构设计到实现:一个Powerful的图书管理系统

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland) (github.com)&…

栈的压入,栈的弹出,最小栈,用队列实现栈,设计循环队列

栈的压入&#xff0c;栈的弹出 输入两个整数序列&#xff0c;第一个序列表示栈的压入序列&#xff0c;判断第二个序列是否可能是该栈的弹出序列&#xff0c;假设压入栈中的所有数字均不相等&#xff0c;如pushA:1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5是某栈的…

day11 有名管道和无名管道

无名管道基础 进程间的通信 概念&#xff1a; 进程间的通信就是进程和进程之间交换信息&#xff1b; 常用方式&#xff1a; 无名管道&#xff08;pipe&#xff09; 有名管道&#xff08;fifo&#xff09; 信号&#xff08;signal&#xff09; 共享内存&#xff08;mmap…

DOS批处理文件---内嵌参数变量扩充功能

1 内嵌参数变量 1.1 介绍 内嵌参数变量指&#xff1a;%i&#xff0c;其中i为大于等于0的整数。如%0&#xff0c; %1&#xff0c; %2&#xff0c;... 1.2 作用 可以客制化功能。 1.3 案例 批处理文件&#xff1a;main_Param.bat echo off && setlocal ENABLEDELA…

游戏分析之引擎的基本概念及常见的游戏引擎介绍

一、引擎的基本概念 关于游戏引擎和中间件 过去开发游戏的时候&#xff0c;游戏机生产商提供的只是硬件的规格书和非常基本的“库”。所以&#xff0c;游戏需要的各种程序功能都需要游戏开发团队自己开发。从PC&#xff0c;FC的8位机时代开始&#xff0c;到SFC&#xff0c;MD的…

Java经典笔试题—day01

Java经典笔试题—day01&#x1f50e;选择题&#x1f50e;编程题&#x1f95d;组队竞赛&#x1f95d;删除公共字符&#x1f50e;结尾&#x1f50e;选择题 (1) 在 Java 中&#xff0c;存放字符串常量的对象属于&#xff08; &#xff09;类对象。 A. Character B. String C. Str…

类ChatGPT项目的部署与微调(下):从ChatGLM-6b到ChatDoctor

前言 随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出&#xff0c;绝大部分公司的技术 产品 服务&#xff0c;以及绝大部分人的工作都将被革新一遍 类似iPhone的诞生 大家面向iOS编程 有了App Store现在有了ChatGPT插件/GPT应用商店&#xff…

Faster-RCNN代码解读5:主要文件解读-上

Faster-RCNN代码解读5&#xff1a;主要文件解读-上 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现&#xff0c;不要多想&#xff0c;我还没有厉害到可以一个人复现所有代码。所以&#xff0c;是参考别人的代码&#xff0c;进行自己的解读。 ​ 代码来自于B站的UP主&#xff…