Hystrix——服务容错保护库
熔断机制是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压,最终导致自身服务瘫痪的一种机制,它的功能类似电路的保险丝,其目的是为了阻断故障,从而保护系统稳定性。Hystrix作为Spring Cloud中实现了熔断机制的组件,具有服务容错保护功能。
Hystrix简介
什么是Hystrix?
概述:Hystrix是Netflix开源的一款针对分布式系统延迟和容错的库。
作用:通过添加延迟容忍和容错逻辑,从而控制分布式服务之间的交互。
为什么用Hystrix?
对于一个复杂的分布式系统,包含的应用可能多达数十个,这些应用有许多依赖项目,每个依赖项目在某个时刻不可避免会失败导致故障,如果不对这些故障进行隔离,整个分布式系统都可能会崩溃。
分布式系统中服务请求一切正常情况
分布式系统中服务有一个系统有延迟请求情况
当分布式系统中其中有一个系统有延迟时,它可能阻塞整个用户请求:
分布式系统中服务高流量下请求情况
在高流量情况下,一个后端的依赖延迟可能会导致所有服务的资源在数秒内变的饱和,这也就意味着,后续如果再有请求将无法提供服务,应用会出现故障。比故障更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,从而备份队列、线程和其他资源,从而导致整个系统出现更多级联故障.如图:
分布式系统中Hystrix解决服务请求堵塞情况
Hystrix的出现就是为了解决上述问题的,它封装了每个依赖项,每个依赖项彼此隔离,当延迟发生时,它会被限制在资源中,并包含回退逻辑,该逻辑决定在依赖发生任何类型故障时应作出何种响应。
简单创建Hystrix工程
工作架构图:
1.创建eureka-server项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.xiaofen</groupId><artifactId>eureka-server</artifactId><version>0.0.1-SNAPSHOT</version><name>eureka-server</name><description>Demo project for Spring Boot with Eureka Server</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 如果需要,可以添加构建插件等配置 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yml
server:port: 7000 # 服务器端口号7000
spring:application: #端口号名称配置name: eureka-server
eureka:client:fetch-registry: false # 表示是否向Eureka Server注册register-with-eureka: false # 表示是否从Eureka Server获取注册信息service-url:defaultZone:http://${eureka.instance.hostname}:${server.port}/eureka/ #设置服务注册中心地址instance:hostname: localhost
启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}}
2.创建eureka-hystrix-client项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/></parent><groupId>com.xiaofeng</groupId><artifactId>eureka-hystrix-client</artifactId><version>0.0.1-SNAPSHOT</version><name>eureka-hystrix-client</name><description>Demo project for Spring Boot</description><url/><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url></repository></repositories>
</project>
application.yml
server:port: 8764
spring:application:name: eureka-hystrix-client
eureka:client:service-url:defaultZone: http://localhost:7000/eureka/instance:hostname: localhost
启动类添加这几个注解:
config:
@Configuration
public class HystrixConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
controller:
@RestController
public class HystrixController {@Autowiredprivate HystrixService hystrixService;@GetMapping("/hi")public String hi(String id){return hystrixService.hi(id);}
}
service:
@Service
public class HystrixService {@Autowiredprivate RestTemplate restTemplate;@HystrixCommand(fallbackMethod = "hiError")public String hi(String id){return restTemplate.getForObject("http://hystrix-provider/hi?id="+id,String.class);}public String hiError(String id){return "此次调用进行服务降级,当前的id为:"+id;}
}
3.创建hystrix-provider项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.xiaofeng</groupId><artifactId>hystrix-provider</artifactId><version>0.0.1-SNAPSHOT</version><name>hystrix-provider</name><description>Demo project for Spring Boot</description><url/><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.1.7.RELEASE</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.1.7.RELEASE</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 如果需要,可以添加构建插件等配置 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
启动类:
@SpringBootApplication
@EnableEurekaClient
public class HystrixProviderApplication {public static void main(String[] args) {SpringApplication.run(HystrixProviderApplication.class, args);}}
controller:
@RestController
public class HystrixController {@RequestMapping("/hi")public String hi(String id){return "你好,访问接口成功,当前id为:"+id;}
}
4.项目测试
成功:
失败:
在Feign中使用Hystrix熔断器
开启Hystrix熔断
Feign自带熔断功能,默认情况下,熔断功能是关闭的。如果要开启熔断,只需在配置文件中将hystrix.enabled设置为true即可。
开启Hystrix熔断功能。在eureka-hystrix-client项目的配置文件application.yml中添加开启熔断的配置
feign:hystrix:enabled: true
因为在Feign的起步依赖中引入了Hystrix依赖,所以在Feign中使用Hystrix不需要引入任何的依赖,只需要在配置文件中开启即可。
开启Feign Client功能
在eureka-hystrix-client的启动类中添加@EnableFeignClients开启Feign Client功能。
修改项目中接口
进入项目eureka-hystrix-client,在HystrixService接口上方的@FeignClient注解中,增加fallback属性配置,指定HystrixServiceImpl类为失败逻辑处理类
使用fallback属性指定的用于处理回退逻辑的类,必须实现@FeignClient注解修饰的接口。
FeignHystrixServiceImpl实现了FeignHystrixService接口,并定义了一个hi()方法用于编写处理熔断的具体逻辑。这里,我们使用@Component注解修饰类FeignHystrixServiceImpl,其目的是将该类交给Spring容器管理。
controller
运行测试:
成功:
失败:
Hystrix工作原理
Hystrix改为工作流程图
Hystrix的具体工作流程
1.实例化HystrixCommand或HystrixObservableCommand对象
第一步实例化HystrixCommand或HystrixObservableCommand对象,是因为它们封装了对外部依赖访问的逻辑。
2.调用Command方法触发操作指令
通过创建的HytrixCommand和HystrixObservableCommand实例调用相关方法执行操作指令。Hystrix API提供了4个触发流程的方法供开发者调用,具体如下:
1、execute()方法:该方法是同步的,从依赖请求中接收到单个响应(或者出错时抛出异常)。
2、queue()方法:调用外部依赖只返回一个值,返回一个Future对象。
3、observe()方法:订阅一个从依赖请求中返回的Observable对象,这个Observable对象包含了从依赖服务返回的结果。
4、toObservable()方法:返回一个Observable对象,只有当订阅一个从依赖请求中返回的Observable对象时,该方法才会执行Hystrix命令并返回结果。
3.根据依赖调用的缓存情况进行相应处理
执行操作指令时,Hystrix首先会检查缓存内是否有对应指令的结果,如果有的话,将缓存的结果直接以Observable对象的形式返回。
4.判断熔断器是否开启
没有对应的缓存,Hystrix会检查Circuit Breaker的状态。如果Circuit Breaker的状态为开启状态,Hystrix将不会执行对应指令,而是而是直接路由到第8步(Fallback),获取fallback方法,并执行fallback逻辑。
5.判断线程池/队列/信号资源是否已满
如果Circuit Breaker的状态为关闭状态,Hystrix会继续进行线程池、任务队列、信号量的检查(第5步),确认是否有足够的资源执行操作指令。如果资源满,Hystrix同样将不会执行对应指令,而是立即跳到第8步,执行fallback逻辑。
6.执行HystrixObservableCommand.construct()或HystrixCommand.run()
如果资源充足,Hystrix将会执行操作指令,操作指令的调用最终会用到两个方法:
1、HystrixCommand.run(): 返回单个响应或者抛出异常。
2、HystrixObservableCommand.construct():返回一个发射响应的Observable
或者发送一个onError()的通知。
如果执行上述方法的执行时间大于命令所设置的超时时间值,那么该线程将会抛出一个TimeoutException异常在这种情况下,Hystrix将会路由到第8步,执行fallback逻辑,并且如果上述方法没有被取消或者中断,会丢弃这上述两个方法最终返回的结果。
如果命令最终返回了响应并且没有抛出任何异常,Hystrix在返回响应后会返回一些日志信息。
(1)如果是调用run()方法,Hystrix会返回一个Observable。
(2)如果是调用construct()方法,Hystrix会通过construct()方法返回
相同的Observable对象。
7.计算熔断器执行数据
Hystrix会报告成功、失败、拒绝和超时的指标给熔断器,熔断器包含了一系列的滑动窗口数据,并通过该数据进行统计。Hystrix使用这些统计数据来决定熔断器是否应该熔断,如果需要熔断,将在一定的时间内不再请求依赖(这个时间可以通过配置指定),当再一次检查请求的健康的话会重新关闭熔断器。
8.调用降级方法或者返回依赖请求的真正结果
如果Hystrix命令执行成功,它将以Observable形式返回响应给调用者。根据第(2)步的调用方式不同,在返回Observable之前可能会做一些转换。
Dashboard监控熔断器状态
1.主要依赖pom.xml:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
2.然后在原来项目基础上再添加开启DashBoard的注解:
@EnableHystrixDashboard
3.创建config包,在 config包下创建HystrixDashboardConfiguration类,加入Hystrix.stream的Servlet配置。
@Configuration
public class HystrixDashboardConfiguration {@Beanpublic ServletRegistrationBean getServlet() {HystrixMetricsStreamServlet streamServlet = newHystrixMetricsStreamServlet();ServletRegistrationBean registrationBean = newServletRegistrationBean(streamServlet);registrationBean.setLoadOnStartup(1);registrationBean.addUrlMappings("/hystrix.stream");registrationBean.setName("HystrixMetricsStreamServlet");return registrationBean;}
}
4.测试
还有一个图形化界面http://localhost:8764/hystrix
点击按钮后进入这个界面:
① 标注的是服务的健康程度。
② 数字从上往下依次是消费者请求调用者的请求成功数、短路或熔断数和失败
的次数。
③ 数字从上往下依次是消费者请求调用者的超时数、线程池拒绝数和请求异常数。
④ 表示集群下的主机报告。
⑤ 表示消费者请求调用者的请求频率。
相关文章:

Hystrix——服务容错保护库
熔断机制是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压,最终导致自身服务瘫痪的一种机制,它的功能类似电路的保险丝,其目的是为了阻断故障,从而保护系统稳定性。Hystrix作为Spring Cloud中实现了熔断机制的组件&am…...

【区块链+金融服务】河北股权交易所综合金融服务平台 | FISCO BCOS应用案例
区域性股权市场是我国资本市场的重要组成部分,是多层次资本市场体系的基石。河北股权交易所(简称:河交所) 作为河北省唯一一家区域性股权市场运营机构,打造河北股权交易所综合金融服务平台,将区块链技术与区…...

[图解]需要≠需求-《分析模式》漫谈
1 00:00:00,760 --> 00:00:02,910 今天的《分析模式》漫谈 2 00:00:02,920 --> 00:00:04,180 我们来说一下 3 00:00:04,490 --> 00:00:06,490 需要不等于需求 4 00:00:10,490 --> 00:00:11,760 还是第一章 5 00:00:13,120 --> 00:00:15,020 这里 6 00:00:1…...

刷到好听的音频怎么办
在短视频平台上,我们常常会刷到那些好听得让人陶醉的视频,可却无法直接下载保存其中的音频,是不是感觉很遗憾? 比如刷到林俊杰这首前奏超好听的《江南》,却禁止下载无法直接下载保存。 别担心,下面就为您揭…...

怎么在网络攻击中屹立不倒
在当今蓬勃发展的网络游戏产业中,服务器安全无疑是企业生存与发展的基石。面对互联网环境中无处不在的DDoS(分布式拒绝服务)与CC(挑战碰撞)攻击威胁,游戏服务器的防御能力与高效处理能力显得尤为重要。相较…...

详解 Python 中的面向对象编程(2)
引言 面向对象编程(OOP)是一种编程范式,它通过将属性和行为整合到对象中来构建程序。本教程将带你了解Python语言中面向对象编程的基本概念。 想象一下,对象就像是系统中的各个部件。可以把程序比作一条工厂流水线。在流水线的每一…...
数据结构-线性表-顺序表
一. 了解顺序表 顺序表定义: 顺序表(也称为线性数组)是一种线性数据结构,它将数据元素按顺序存储在一块连续的内存空间中。顺序表的基本特征包括: 元素的顺序性:顺序表中的元素具有线性关系,每…...

AI绘画大模型-StableDiffusion最强模型sd3(本地安装方法)
前言/introduction Stable Diffusion 3(简称SD3)是Stability AI最新推出的文本到图像生成模型。相比前代模型,SD3在生成质量、细节表现以及运行效率上有了显著提升,尤其在细腻的图像渲染和复杂的场景构建方面表现出色。SD3模型…...
SpringBoot调用外部接口的几种方式
SpringBoot调用外部接口的几种方式 使用FeignClient调用1、在使用方引入依赖2、服务接口调用方2.1、在启动类上加上EnableFeigncliens注解2.2、编写Feign接口调用服务controller层2.3、服务接口调用service层 3、服务接口提供者4、说明 使用RestTemplate调用1、引入依赖2、Rest…...
MySQL:information_schema查找某个表的主键是否在数据的其他位置出现之二
上一篇: MySQL:information_schema查找某个表的主键是否在数据的其他位置出现之一-CSDN博客 摘要 遍历数据库每一张表的每一个字段,是否存在字符串search_term 正文 源码 import pymysql from datetime import datetime# 测试函数 if __n…...
Linux进程和计划任务管理
目录 一、进程基本概念 1.进程 2.程序和进程的关系 二、查看进程信息 1.ps命令 1.1 ps aux命令 1.2 ps -elf 命令 2. top 命令 3.pgrep 命令 4.jobs 命令 三、查看进程树 四、进程的启动方式 1.手动启动 2.调度启动 五、终止进程的运行 1.CtrlC组合键 2.kill、kil…...

【Angular18】封装自定义组件
1. 准备组件 2. 创建打包文件夹及部分配置文件 创建 文件夹app-legalentities-root拷贝组件源文件到新的文件夹app-legalentities中创建文件 .npmrc registry发布地址always-authtrue创建文件 ng-package.json {"$schema": "./node_modules/ng-packagr/ng-pac…...

【流媒体】RTMPDump—RTMP_ConnectStream(创建流连接)
目录 1. RTMP_ConnectStream函数1.1 读取packet(RTMP_ReadPacket)1.2 解析packet(RTMP_ClientPacket)1.2.1 设置Chunk Size(HandleChangeChunkSize)1.2.2 用户控制信息(HandleCtrl)1…...
MySQL学习3之锁机制
一、什么是锁粒度? 锁粒度(Lock Granularity)是指在数据库中锁定数据资源的最小单位。锁粒度决定了锁定操作的范围,即锁定的是整个数据库、整个表、表中的某个分区、表中的某一页还是表中的某一行。 在MySQL中常见的锁粒度有&am…...

2004-2023年上市公司过度负债数据(含原始数据+计算结果)
2004-2023年上市公司过度负债数据(含原始数据计算结果) 1、时间:2004-2023年 2、来源:上市公司年报 3、指标:证券代码、证券简称、统计截止日期、是否剔除ST或*ST股、是否剔除当年新上市、已经退市或被暂停退市的公…...

[机器学习]--KNN算法(K邻近算法)
KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性: 思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错 KNN算法原理 上图是每一个点都是一个肿瘤病例…...

跨平台控制神器Escrcpy,您的智能生活助手
Escrcpy 是一款基于 Scrcpy 开发的图形化安卓手机投屏控制软件,它允许用户将 Android 手机屏幕实时镜像到电脑上,并使用电脑的鼠标和键盘直接操作手机,实现了无线且高效的操控。这款软件是免费开源的,支持跨平台使用,包…...

AR 眼镜之-开关机定制-实现方案
目录 📂 前言 AR 眼镜系统版本 开关机定制 1. 🔱 技术方案 1.1 技术方案概述 1.2 实现方案 1)开机 Logo 2)开机音效 3)开机动画 4)关机动画 5)关机弹窗 2. 💠 开机 Logo…...

论文阅读-Transformer Layers as Painters
1. 摘要 尽管大语言模型现在已经被广泛的应用于各种任务,但是目前对其并没有一个很好的认知。为了弄清楚删除和重组预训练模型不同层的影响,本文设计了一系列的实验。通过实验表明,预训练语言模型中的lower和final layers与中间层分布不一致…...

【STL】vector模拟实现
vector引入 vector的实现主要依靠三个成员变量:start,finish和end_of_storage 其中: [start]指向容器中的起始位置 [finish]指向容器中最后一个有效数据的下一个位置 [end_of_storage]指向容器中现有容量的位置 通过这三个指针,就使得vector的size…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...