【熔断限流组件resilience4j和hystrix】

文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 起因
    • resilience4j落地实现
      • pom.xml依赖
      • application.yml配置
      • 接口使用
    • hystrix 落地实现
      • pom.xml依赖
      • 启动类上添加注解
      • 接口上使用
  • 📢文章总结
  • 📥博主目标

🔊博主介绍

🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文专业写手、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、🚀徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📕拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙有过从0到1的项目高并发项目开发与管理经验,对JVM调优、MySQL调优、Redis调优 、ElasticSearch调优、消息中间件调优、系统架构调优都有着比较全面的实战经验。

📘有过云端搭建服务器环境,自动化部署CI/CD,弹性伸缩扩容服务器(最高200台),了解过秒级部署(阿里云的ACK和华为云的云容器引擎CCE)流程,能独立开发和部署整个后端服务,有过分库分表的实战经验。

🎥经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧,与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!


文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 起因
    • resilience4j落地实现
      • pom.xml依赖
      • application.yml配置
      • 接口使用
    • hystrix 落地实现
      • pom.xml依赖
      • 启动类上添加注解
      • 接口上使用
  • 📢文章总结
  • 📥博主目标

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

🥤本文内容

CSDN

起因

阿里Sentinel团队不稳定,超过了一半年的时间没有更新了,虽然认为一个成熟产品没必要老更新,在特定的阶段能完成他的历史使命就好,并且sentinel开源这块依旧还在维护开发中。但是它是为了kpi开放出来的,生怕哪天不维护了,总感觉阿里是在培养用户习惯之后,让你绑定阿里的生态,再到阿里云割韭菜,开源嘛,本来也是无偿用,人家没有义务像商业软件那样永久更新,之前开源社区好几个作者就是因为不更新或者更新慢被别人喷不搞了,所以个人觉得有必要多掌握几个限流熔断组件。

resilience4j落地实现

pom.xml依赖

如果你的springboot版本是2的使用以下依赖:

<!-- 熔断限流resilience4j-->
<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>2.2.0</version>
</dependency>

如果你的springboot版本是3的使用以下依赖:

<!-- 熔断限流resilience4j-->
<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot3</artifactId><version>2.2.0</version>
</dependency>

application.yml配置

resilience4j:retry: # 重试策略机制配置instances: # 定义多个重试策略实例retryApi: # 第一个重试策略重试名称max-attempts: 3 # 操作失败最大重试次数为3wait-duration: 1s # 每次重试等待时间1秒circuitbreaker:instances: # 定义多个断路器实例circuitBreakerApi: # 第一个断路器实例名称registerHealthIndicator: true # 配置健康指示器slidingWindowSize: 10 # 滑动窗口大小minimumNumberOfCalls: 5 # 最小调用次数permittedNumberOfCallsInHalfOpenState: 3 # 半开状态下允许的调用次数slidingWindowType: TIME_BASED # 滑动窗口类型automaticTransitionFromOpenToHalfOpenEnabled: true # 是否自动从开启状态转换为半开状态waitDurationInOpenState: 1s # 开启状态下等待时间failureRateThreshold: 20 # 失败率阈值,失败率20%时,断路器打开eventConsumerBufferSize: 10 # 事件消费者缓冲区大小ignoreExceptions: # 忽略的异常列表- java.io.IOExceptionratelimiter:instances: # 定义多个限流策略实例rateLimiterApi: # 第一个限流策略实例名称limitForPeriod: 10000 # 限制周期内的请求数量10000limitRefreshPeriod: 10s # 限制刷新周期,10秒一个周期timeoutDuration: 500ms # 超时时间为0.5秒,请求超过限制客户端立即收到超时响应,不等待subscribeForEvents: AFTER_SUCCESS # 订阅事件类型eventConsumerBufferSize: 10 # 事件消费者缓冲区大小

接口使用

@Retry(name = "retryApi",fallbackMethod = "fallbackRedPackage")
@CircuitBreaker(name = "circuitBreakerApi",fallbackMethod = "fallbackRedPackage")
@RateLimiter(name = "rateLimiterApi",fallbackMethod = "fallbackRedPackage")
@PostMapping(value = "/redPackage")
public Result redPackage(@RequestBody RedPackegeRainVo redPackage) {//红包唯一标识\红包的keyString redPackageKey = redPackage.getRedPackageKey();//用户id\用户tokenString userId = redPackage.getUserId();//使用StringBuilder拼接字符串,作为红包的键(key)String redAppend = StringUtil.StringAppend(RedPackageRainConstant.RED_PACKAGE_KEY, redPackageKey);//从redis缓存中获取红包池中的红包String partRedPackage = redisUtil.leftPop(redAppend);//判断是否为空,不为空进入后续流程;为空直接返回if (StringUtils.isNotEmpty(partRedPackage)) {//将红包的key和用户的id作为存储redis缓存已抢红包池的键(key)String redConsumeAppend = StringUtil.StringAppend(RedPackageRainConstant.RED_PACKAGE_CONSUME_KEY, redPackageKey,":", RedPackageRainConstant.RED_PACKAGE_USER_ID, userId);//存入redis缓存并且设置过期时间(使用了redis事务,保证原子性,因为操作简单、依赖关系简单,使用使用redis事务比使用 Lua 脚本更适合当前场景)redisUtil.multiStr(redConsumeAppend,partRedPackage,1,TimeUnit.DAYS);//自适应(根据当前机器的线程数适配核心线程数和最大线程数)全局线程池ThreadPoolExecutor.getThreadPoolExecutor().execute(new Runnable() {@Overridepublic void run() {ConcurrentHashMap concurrentHashMap =  pool.acquire(); // 从对象池中获取一个ConcurrentHashMap实例concurrentHashMap.put(RedPackageRainConstant.RED_PACKAGE_KEY,redPackageKey);concurrentHashMap.put(RedPackageRainConstant.RED_PACKAGE_USER_ID,userId);concurrentHashMap.put(RedPackageRainConstant.RED_PACKAGE_VALUE,partRedPackage);//将ConcurrentHashMap对象转换成字符串。String convertToString = StringUtil.convertToString(concurrentHashMap);//释放对象pool.release(concurrentHashMap);//发送MQ消息 发送字符串比发送对象的网络传输更小。这是因为字符串可以被序列化为字节数组,而对象需要被序列化为字节数组,并包含对象的类信息和其他序列化数据。因此,发送字符串可以节省网络传输的带宽。messageProducer.sendMessage(RedPackageRainConstant.TOPIC,convertToString);}});return Result.build(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS);}return Result.error(ResultCodeEnum.RED_PACKAGE_FINISHED.getCode(),ResultCodeEnum.RED_PACKAGE_FINISHED.getMessage());
}public Result fallbackRedPackage(Throwable throwable) {log.error("fallback RedPackage info:",throwable.getMessage());return Result.error(ResultCodeEnum.RED_PACKAGE_ERROR.getCode(),ResultCodeEnum.RED_PACKAGE_ERROR.getMessage());
}

hystrix 落地实现

pom.xml依赖

<!-- hystrix -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

启动类上添加注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableDiscoveryClient
// 开启断路器,开启Hystrix容错能力
@EnableCircuitBreaker
public class SpringCloudHystrixDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudHystrixDemoApplication.class, args);}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

接口上使用

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
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 org.springframework.web.client.RestTemplate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;@RestController
@RequestMapping("/hystrix")
public class HystrixController {@Autowiredprivate RestTemplate restTemplate;/*** HystrixCommand 开启Hystrix命令 当方法执行失败时,使用Hystrix逻辑处理* fallbackMethod 当方法执行失败时,调用此方法。*/@GetMapping("/getNacosConfigure")@HystrixCommand(fallbackMethod = "defaultFallbackMethod")public String getNacosConfigure() {return restTemplate.getForObject("http://nacos-config/getNacosConfigure", String.class);}private String defaultFallbackMethod() {return "方法执行失败啦,Hystrix起作用了";}// 信号量隔离@HystrixCommand(commandProperties = {// 超时时间,默认1000ms@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS, value = "5000"),// 信号量隔离@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"),// 信号量最大并发@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS, value = "5")},//回退方法fallbackMethod = "defaultFallbackMethod")@GetMapping("/semaphoreIsolation")public String semaphoreIsolation() {return "信号量隔离" + Thread.currentThread().getName();}// 线程池隔离@HystrixCommand(groupKey = "productService", // 服务名称,相同名称使用同一个线程池commandKey = "selectById",              // 接口名称,默认为方法名threadPoolKey = "productServiceListPool",    // 线程池名称,相同名称使用同一个线程池commandProperties = {// 超时时间,默认1000ms@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")},threadPoolProperties = {// 线程池大小@HystrixProperty(name = "coreSize", value = "5"),// 等待队列长度(最大队列长度,默认值-1)@HystrixProperty(name = "maxQueueSize", value = "100"),// 线程存活时间,默认1min@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),// 超出等待队列阈值执行拒绝策略@HystrixProperty(name = "queueSizeRejectionThreshold", value = "100")},//回退方法fallbackMethod = "defaultFallbackMethod")@GetMapping("/threadPoolIsolation")public String threadPoolIsolation() {return "线程池隔离" + Thread.currentThread().getName();}// 服务熔断@HystrixCommand(commandProperties = {// 请求数阈值:在快照时间窗口内,必须满足请求阈值数才有资格熔断。打开断路器的最少请求数,默认20个请求。//意味着在时间窗口内,如果调用次数少于20次,即使所有的请求都超时或者失败,断路器都不会打开@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "10"),// 错误百分比阈值:当请求总数在快照内超过了阈值,且有一半的请求失败,这时断路器将会打开。默认50%@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "50"),// 快照时间窗口:断路器开启时需要统计一些请求和错误数据,统计的时间范围就是快照时间窗口,默认5秒@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "5000")},fallbackMethod = "defaultFallbackMethod")@GetMapping("/serviceFuse")public String serviceFuse() {return "服务熔断" + Thread.currentThread().getName() + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME);}// 服务降级@HystrixCommand(fallbackMethod = "defaultFallbackMethod")@GetMapping("/serviceDegradation ")public String serviceDegradation() {return "服务降级" + Thread.currentThread().getName() + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME);}
}

CSDN

📢文章总结

对本篇文章进行总结: 本篇文章主要讲解了熔断限流组件resilience4j和hystrix,对sentinel感兴趣的同学可以看看这二篇文章:

  • 【java_wxid项目】【第十六章】【Spring Cloud Alibaba Sentinel集成】
  • sentinel-dashboard-1.8.0.jar开机自启动脚本

🔔以上就是今天要讲的内容,阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。

以梦为马,不负韶华

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

🚀🎉希望各位读者大大多多支持用心写文章的博主,现在时代变了,🚀🎉 信息爆炸,酒香也怕巷子深🔥,博主真的需要大家的帮助才能在这片海洋中继续发光发热🎨,所以,🏃💨赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD
  • 🎉微信号二维码SeniorRD

📥博主目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本是一个很普通的程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我们必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

🔔有需要对自己进行综合性评估,进行职业方向规划,我可以让技术大牛帮你模拟面试、针对性的指导、传授面试技巧、简历优化、进行技术问题答疑等服务。

可访问:https://java_wxid.gitee.io/tojson/

开发人员简历优化、面试突击指导、技术问题解答

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

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

相关文章

【期末复习向】数据可视化技术

一、重点复习 题型&#xff1a;填空题&#xff08;15道&#xff0c;2分一个&#xff09;与简答题&#xff08;3道题目&#xff0c;10分一个&#xff09;与绘图题&#xff08;选画2个类型的图&#xff09; 1.什么是数据可视化 在计算机视觉领域&#xff0c;数据可视化是对数据的…

Linux 进程(八) 进程的退出码

main 函数的返回值叫做进程的退出码。当进程成功退出的时候&#xff0c;我们一般用0来表示。进程失败的时候一般用非零来表示。我们使用不同的数字来表示进程退出时不同的失败原因。 我们查看系统的有多少退出码以及其含义时需要用到strerror() 他的头文件和用法如下。 通过一…

CSS 放大旋转动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ rotate-scale-up: isAnimating }"><!-- 元素内容 -->&l…

从零开始搭建企业级前端项目模板(vue3+vite+ts)

文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本&#xff0c;项目安装eslint配置2.3 安装完成后&#xff0c;后面启动项目还缺少一些依赖&#xff0c;提前按需安装好 三&#xff0c;修改eslintrc.…

3D目标检测(教程+代码)

随着计算机视觉技术的不断发展&#xff0c;3D目标检测成为了一个备受关注的研究领域。与传统的2D目标检测相比&#xff0c;3D目标检测可以在三维空间中对物体进行定位和识别&#xff0c;具有更高的准确性和适用性。本文将介绍3D目标检测的相关概念、方法和代码实现。 一、3D目…

2023年12月青少年软件编程Python等级考试(三级)真题试卷

2023年12月青少年软件编程Python等级考试&#xff08;三级&#xff09;真题试卷 题目总数&#xff1a;38 总分数&#xff1a;100 选择题 第 1 题 单选题 一个非零的二进制正整数&#xff0c;在其末尾添加两个“0”&#xff0c;则该新数将是原数的&#xff1f;&#x…

nuxt3 env文件、全局变量处理

有两种方向 通过配置nuxt.config.ts Nuxt提供的钩子函数&#xff0c;实现全局变量的获取 runtimeconfig env文件往runtimeconfig放入内容 useAppConfig 通过env文件配置来获取服务端全局变量&#xff0c;客户端通过vite.define实现 nuxt.config.ts Nuxt钩子 1. runtim…

Win32 TEXT()宏学习

之前学习了_T()宏&#xff1b; _T()是MFC的&#xff1b; TEXT()是win32的&#xff1b; _T("")定义于tchar.h&#xff1b; TEXT宏是windows程序设计中经常遇到的宏&#xff0c;定义在 <winnt.h>中&#xff1b; 如果使用UNICODE字符集&#xff0c;则TEXT&…

kubernetes(三)

文章目录 1. k8s弹性伸缩1.1 安装heapster监控1.2 弹性伸缩使用和验证 2. 持久化存储2.1 emptyDir 1. k8s弹性伸缩 k8s弹性伸缩&#xff0c;需要附加插件heapster 1.1 安装heapster监控 使用heapster(低版本)可以监控pod压力大不大 使用hpa调节pod数量&#xff0c;自动扩容或…

chatgpt3.5和chatgpt4的区别

ChatGPT4是基于GPT-3模型的一个实例&#xff0c;但ChatGPT4已经进行了进一步的改进和优化。GPT-3&#xff08;第三代生成式预训练模型&#xff09;是OpenAl开发的一个大型语言模型&#xff0c;它在很多自然语言处理任务中表现出色。 ChatGPT4继承了GPT-3的基本架构和能力&…

清风数学建模笔记-聚类算法

K-maens算法&#xff1a; 算法的原理&#xff1a; 在论文中时&#xff0c;可以把一些可以流程化的算法的流程图加上去 优点&#xff1a; 缺点&#xff1a; 点容易受异常值的影响&#xff0c;且受影响较大 k-means算法&#xff1a; 使用SPSS进行聚类分析&#xff1a; S默认使用…

CCNP课程实验-07-OSPF-Trouble-Shooting

目录 实验条件网络拓朴 环境配置开始排错错点1&#xff1a;R1-R2之间认证不匹配错误2&#xff1a;hello包的时间配置不匹配错误3&#xff1a;R2的e0/1接口区域配置不正确错误4&#xff1a;R4的e0/1接口没有配置进OSPF错误5&#xff1a;R2的区域1没有配置成特殊区域错误6&#x…

深度学习 | 多模态算法

AIGC也就是AI内容生成已经成为新一轮人工智能发展的热点和必然趋势&#xff0c;它使得大规模高质量的创作变得更加容易。 一 、InstructGPT模型 1、GPT系列回顾 chatGPT和InstructGPT都使用了指示学习和基于人工反馈的强化学习来指导模型的训练&#xff0c;不同点仅仅是在采集数…

c语言:用结构体求平均分|练习题

一、题目 用c语言的结构体&#xff0c;求4位学生成绩的平均分 如图&#xff1a; 二、代码截图【带注释】 三、源代码【带注释】 #include <stdio.h> float aver();//声明平均分函数 void printScore();//声明打印函数 //设置结构体&#xff0c; struct student { …

JMeter CSV 参数文件的使用方法

.在 JMeter 测试中&#xff0c;参数化是非常重要的&#xff0c;参数化允许我们模拟真实世界中的各种情况。本文我们将探讨如何在 JMeter 中使用 CSV 参数文件。 创建 CSV 文件 首先&#xff0c;我们需要创建一个逗号分隔的值&#xff08;CSV&#xff09;文件&#xff0c;其中…

CompressAI:深度学习与传统图像压缩

1、图像压缩算法原理 传统的有损图像压缩方法&#xff0c;如JPEG &#xff0c; JPEG2000 &#xff0c; HEVC或AV1或VVC&#xff0c;在类似的编码方案上进行了迭代改进&#xff1a;将图像划分为像素块&#xff0c;使用变换域通过线性变换(例如:DCT或DWT)去相关空间频率&#xf…

SpringBoot使用支付宝沙箱环境进行仿真支付

目录 一、进入支付宝开发平台—沙箱环境 二、点击沙箱进入沙箱环境 三、Java二维码生成技术 1、导入依赖 2、生成指定url对应的二维码图片 四、支付接口 1、保存好沙箱应用里面的公钥私钥 2、 测试接口 3、扫码 4、买家结果 5、卖家结果 五、回调接口 1、使用内网…

el-select 多选,选有一个未选择的选项

多选有未选择这个选项后。会出现一个情况&#xff0c;绑定的数据为[‘未选择’,‘cpu1’,‘cpu2’] 进行一个处理&#xff0c;选择&#xff08;未选择&#xff09;就清除&#xff08;其它的选择&#xff09;&#xff0c;选择&#xff08;cpu&#xff09;就清除&#xff08;未选…

RocketMQ快速入门

RocketMQ快速入门 RocketMQ提供了发送多种发送消息的模式&#xff0c;例如同步消息&#xff0c;异步消息&#xff0c;顺序消息&#xff0c;延迟消息&#xff0c;事务消息等&#xff0c;我们一一学习 1.1 消息发送和监听的流程 我们先搞清楚消息发送和监听的流程&#xff0c;然…

自制c++题目《模板综合》

1.输出结果&#xff1a; 2.主函数不允许改变 int arr[5] { 5,2,3,1,4}; char arr1[5] { a,c,b,e,d }; good <int>a(arr,5); good <char>b(arr1,5); bad<int>(1,2); bad<float>(1.1, 1.2); 自制c题目《模板综合》 王赫辰/c语言 - Gitee.com