当前位置: 首页 > news >正文

Spring Cloud LoadBalancer 简单介绍与实战

前言

本文为SpringCloud的学习笔记,如有错误,希望各位高手能指出,主要介绍SpringCloudLoadBalancer的基本概念和实战

文章目录

  • 前言
  • 什么是LoadBalancer
  • 负载均衡分类
    • 服务端负载均衡
    • 客户端负载均衡
    • 服务端负载均衡和客户端负载均衡的优缺点
  • 常见负载均衡策略
  • 为什么要学习Spring Cloud LoadBalancer
  • 如何使用?
    • 项目搭建
    • 使用随机策略
    • 使用Nacos的负载均衡策略策略
    • 自定义策略(IP Hash为例)
      • 编写自定义策略类
      • 封装自定义负载均衡
      • 全局配置自定义负载均衡配置类
  • 缓存

什么是LoadBalancer

❀ LoadBalancer是一种流量分发机制,专业中文叫法“负载均衡”,这种流量分发可以通过软件或者硬件来实现服务端系统资源的均衡利用,提高整体系统的高可用和性能。


负载均衡分类

※ 负载均衡可以分为服务端负载均衡和客户端负载均衡

对于服务器端负载均衡,被称为:反向代理
对于客户端负载均衡,则称为:正向代理


服务端负载均衡

顾名思义,服务端负载均衡就是在服务器层面实现流量分发,如下图所示:
在这里插入图片描述

实现服务器端负载均衡的均衡器有:Nginx、HAProxy、F5等


客户端负载均衡

在知道服务器负载均衡后,客户端负载均衡也容易理解,这是在客户端就直接实现流量分发,也就是说,在客户端就知道请求去往何处,如下图所示:
在这里插入图片描述

客户端负载均衡有:Ribbon、SpringCloudLoadBalancer


服务端负载均衡和客户端负载均衡的优缺点

服务端负载均衡:

  • 优点:

    • 简化客户端逻辑:客户端无需了解服务实例的具体细节,只需要请求负载均衡器即可。
    • 可动态调整负载均衡策略:通过配置负载均衡器,能够根据实际情况动态调整请求的分发规则。
    • 提供更好的可扩展性:负载均衡器可与其他服务治理组件整合,如服务注册中心、服务发现等。
    • 减轻客户端压力:负载均衡器可以在后端服务器之间平均分发请求,降低单个服务器压力。
  • 缺点:

    • 单点故障:负载均衡器本身可能成为系统的单点故障,当负载均衡器出现问题时,会导致整个系统不可用。

    • 需要独立的负载均衡器:搭建和管理一个独立的负载均衡器需要额外的成本和维护工作。

    • 中心化决策:负载均衡的决策是集中在负载均衡器,无法根据客户端的具体状态和需求做出决策。

客户端负载均衡:

  • 优点:

    • 根据状态选择: 可以根据客户端的状态和需求进行负载均衡策略选择。

    • 分散决策:分散了负载均衡的决策,可以更加灵活地适应不同的场景需求。

    • 提供更好的容错能力:当某个服务实例故障时,客户端可以自动切换到其他可用实例。

  • 缺点:

    • 客户端复杂性增加:客户端需要实现负载均衡算法和服务发现逻辑,增加了客户端的复杂性。

    • 全局视图的欠缺:没有全局视图,可能导致不同客户端之间的实例选择不一致,进而影响系统整体性能和一致性。

    • 客户端资源消耗:每个客户端需要额外的资源来处理负载均衡逻辑,可能导致资源浪费。

综合来看,服务端负载均衡更适用于大型系统和复杂架构,可以提供统一的处理策略和更好的可扩展性。而客户端负载均衡则更适用于轻量级系统和简单架构,可以提供更灵活和定制化的负载均衡策略。


常见负载均衡策略

  1. 轮询(Round Robin):轮询策略就是按照顺序把每个请求分发给服务端,依次循环。适用于后端服务器性能相近,且每个服务器处理时间相近的情况
  2. 随机选择(Random):把请求随机发给后端服务器,适用于后端服务器性能相近,且每个服务器处理时间相近的情况,但无法保证请求均与分发
  3. 最少链接(Least Connections):最少连接策略将请求分发给当前连接数最少的后端服务器,可以确保后端服务器连接均衡,需要维护连接计数器。需要注意的是,“最少连接数”只是一个估计值,在千变万化的网络环境下,连接数也在变化。
  4. IP 哈希(IP Hash):根据客户端IP地址进行哈希计算,根据哈希值将请求发送到对应服务器上。这种策略可以用于确保来自同一客户端的请求都会被发送到后端服务器,适用于会话保持的情况。
  5. 加权轮询(Weight Round Robin):给每个后端服务器分配一个权重值,然后按照权值比例来分发请求,这种策略可以用来处理服务器性能不均衡的情况。
  6. 加权随机(Weigh Random):与加权轮询类似,但是按照权重值来随机选择后端服务器。这也可以用来处理后端服务器性能不均衡的情况,但是分发更随机。
  7. 最短响应时间(Least Response Time):根据后端服务器的响应时间情况,分发请求到响应时间最短的服务器。这样可以确保客户端或者最快的响应,适用于低延迟的应用。

为什么要学习Spring Cloud LoadBalancer

作为早期版本中SpringCloud内置的负载均衡器Ribbon,在SpringCloud 2020.0.0中已经被移除,可以在 https://github.com/spring-cloud/spring-cloud-release/wiki/Spring-Cloud-2020.0-Release-Notes中进行查看更新日志。

取而代之的是SpringCloud官方提供的Spring-Cloud-LoadBalancer负载均衡

但Spring Cloud LoadBalancer中仅提供了三种负载均衡策略:轮询、加权、自定义(Nacos的负载均衡算alibaba自定义)

可以通过Spring Cloud LoadBalancer的配置类LoadBalancerClientConfiguration查看底层配置

@Configuration(proxyBeanMethods = false
)
@ConditionalOnDiscoveryEnabled
public class LoadBalancerClientConfiguration {private static final int REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER = 193827465;public LoadBalancerClientConfiguration() {}@Bean@ConditionalOnMissingBeanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
// 以下忽略......
}

这段代码中,reactorServiceInstanceLoadBalancer()方法的返回类型ReactorLoadBalancer< T >就是策略的实现接口,具体实现类如下图所示:
在这里插入图片描述
值得我们注意的是,在这个方法中,默认返回了RoundRobinLoadBalancer这个类,也就说SpringCloudLoadBalancer默认使用轮询策略。


如何使用?

在项目中添加Spring Cloud OpenFeign、注册中心(Nacos)、在添加Spring Cloud LoadBalancer则会在接口调用时直接使用SpringCloudLoadBalance。


项目搭建

我们先构建一个多模块项目SpringCloud-LoadBalancer-demo,具体过程省略,详情可以到这篇文章下查看《Nacos 注册中心介绍与实操》

在这里插入图片描述
在Provider子模块中,我们创建一个简单controller类

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate ServletWebServerApplicationContext servletWebServerApplicationContext;@RequestMapping("/getid")public String getId(@RequestParam Integer id){return servletWebServerApplicationContext.getWebServer().getPort()+"-provider-"+id;}
}

随后我们启动两个相同的Provider服务并注册到Nacos中
在这里插入图片描述
在这里插入图片描述
对于Consumer,我们需要建立sevice接口和controller类,controller类调用service接口的方法,该方法会在注册中心中通过负载均衡(默认轮询)获取服务端信息,然后将请求发送到指定服务端请求数据。
在这里插入图片描述
Sevice代码

@Service
@FeignClient("nacos-provider")
public interface UserService {@RequestMapping("/user/getid")String getId(@RequestParam("id") Integer id); //@RequestParam("id") 不能省略必须全部带上
}
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/getid")public String getId(@RequestParam("id") Integer id){return userService.getId(id);}
}

启动类添加注解:@EnableFeignClients

@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

那么接下来启动Consumer验证底层默认策略是否为轮询

会发现在我们没有配置负载均衡策略的时候,每次访问都是两个服务端轮流使用
第一次访问:
在这里插入图片描述
第二次访问:
在这里插入图片描述


使用随机策略

创建随机策略配置类(不需要@configuration注解)

public class RandomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

细心的同学就已经发现了,这个方法跟上面提到的LoadBalancerClientConfiguration .reactorServiceInstanceLoadBalancer()方法实现很像。这是因为官方文档中就是这么告诉我们如果要使用其他策略就需要这样做,复制一下方法体,修改返回的策略对象。

官方文档链接:https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer
在这里插入图片描述

当然如果只是写一个配置类还不够,我们还需要到启动类(全局配置)或者服务类(局部配置)中去启用它

在这里插入图片描述全局配置:

@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
@LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

这时再去访问http://localhost:8080/user/getid?id=1时就会发现,我们不断刷新,它访问的值就完全随机了。(不知道怎么做动态图,不方便演示T_T)

在这里插入图片描述 局部配置

@Service
@FeignClient("nacos-provider")
@LoadBalancerClient(value = "nacos-provider", configuration = RandomLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getid")String getId(@RequestParam("id") Integer id); //@RequestParam("id") 不能省略必须全部带上
}

可能是SpringCloud版本问题,局部配置不生效,使用的任然是轮询策略,做了解即可


使用Nacos的负载均衡策略策略

@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
public class NacosLoadBalancerConfig {@Resourceprivate NacosDiscoveryProperties nacosDiscoveryProperties;@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name, nacosDiscoveryProperties);}
}

与其他两个官方儿子不一样,Nacos的负载均衡器还需要额外数据信息在这里插入图片描述
启动类添加注解

@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
//@LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class)
@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}

我们会发现Nacos中使用的不是轮询,翻阅底层实现,会发现他是权重策略,所以为了验证这个,我们到Nacos注册中心中去修改一下服务端权重
在这里插入图片描述
这个时候我们再去访问,就可以发现它会大部分请求都使用53922这个端口的服务(无动图不方便演示,读者可以自己实操体验一下)

局部配置NacosNacos策略是生效的,可以自行测试


自定义策略(IP Hash为例)

要实现自定义策略需要三个步骤

  1. 编写自定义策略类
  2. 封装自定义策略类
  3. 全局或者局部使用自定义配置类

编写自定义策略类

回到我们下面这张图
在这里插入图片描述

不难发现,ReactorLoadBalancer< T >是我们负载均衡器的实现上层骨架,这个就是设计模式中的“模板方法模式”,所有人都必须按照骨架进行开发,那么我们自定义策略类也需要如此,但我们去实现的接口是他的子接口ReactorServiceInstanceLoadBalancer,重写它的两个choose方法。

MyLoadBalancer实现

public class MyLoadBalancer implements ReactorServiceInstanceLoadBalancer {private static final Log log = LogFactory.getLog(MyLoadBalancer.class);private final String serviceId;private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;public MyLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {this.serviceId = serviceId;this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;}public Mono<Response<ServiceInstance>> choose(Request request) {// 提供备选服务列表ServiceInstanceListSupplier supplier = (ServiceInstanceListSupplier)this.serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);// 选择服务实例return supplier.get(request).next().map((serviceInstances) -> {return this.processInstanceResponse(supplier, serviceInstances);});}private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {// 从备选列表中选择一个具体的服务实例Response<ServiceInstance> serviceInstanceResponse = this.getInstanceResponse(serviceInstances);if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {((SelectedInstanceCallback)supplier).selectedServiceInstance((ServiceInstance)serviceInstanceResponse.getServer());}return serviceInstanceResponse;}private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {// 实例为空if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn("No servers available for service: " + this.serviceId);}return new EmptyResponse();} else { // 服务不为空// 获取Request对象ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String ipAddress = request.getRemoteAddr();System.out.println("用户IP"+ipAddress);int hash = ipAddress.hashCode();int index = hash%instances.size();ServiceInstance instance = (ServiceInstance)instances.get(index);return new DefaultResponse(instance);}}
}

代码看起来多,但是你如果看一下官方两个亲儿子的源码就会发现,其实只需要复制一下,修改getInstance这段核心代码就可以了
在这里插入图片描述


封装自定义负载均衡

构建Config类,使用同样配方进行封装

public class MyLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new MyLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

全局配置自定义负载均衡配置类

启动类

@SpringBootApplication
@EnableFeignClients // 开启OpenFeign
//@LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class)
//@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
@LoadBalancerClients(defaultConfiguration = MyLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

实际结果,只会访问固定一个端口


缓存

Spring Cloud LoadBalancer在获取实例时有两种选择
1.即使获取:每次从注册中心得到最新健康的实例,效果好,但是得一直询问,系统开销比较大
2.缓存服务列表:每次得到服务列表之后,缓存一段时间,这样能保证性能,同时也能兼容一定的及时性

Spring Cloud LoadBalancer中默认开始缓存服务列表
Spring Cloud LoadBalancer默认缓存重要特性有两项

  1. 缓存的过期时间为35S
  2. 缓存保存个数为256个

我们可以通过以下配置改变这些配置

Spring:cloud:loadbalancer:cache:ttl:35scapacity: 1024# enable: false # 开启缓存

END
希望对你有帮助

相关文章:

Spring Cloud LoadBalancer 简单介绍与实战

前言 本文为SpringCloud的学习笔记&#xff0c;如有错误&#xff0c;希望各位高手能指出&#xff0c;主要介绍SpringCloudLoadBalancer的基本概念和实战 文章目录 前言什么是LoadBalancer负载均衡分类服务端负载均衡客户端负载均衡服务端负载均衡和客户端负载均衡的优缺点 常见…...

私域流量解决方案分享

...

Scala---WordCount

一、创建Maven项目导入pom.xml文件 安装Maven仓库管理工具&#xff0c;版本要求是3.2版本以上。新建Maven项目&#xff0c;配置pom.xml。导入必要的包。 二、Spark-Scala版本的WordCount 1.val conf new SparkConf() 2.conf.setMaster("local") 3.conf.setAppNam…...

GTC2023全球流量大会蓄势待发,菊风在7B57展位等你!

第六届 GTC 全球流量大会&#xff08;以下简称 GTC2023&#xff09;将于12月5日- 6日&#xff0c;在深圳福田会展中心7&#xff06;8号馆举办。 据悉&#xff0c;本届大会将是历届以来规模最大、参与人数最多、跨境出海资源最丰富的一次行业盛会。7、8 号馆共 15000 平方米&am…...

喜讯!云起无垠成为国家信息安全漏洞库(CNNVD)技术支撑单位

近日&#xff0c;云起无垠凭借其在漏洞挖掘、漏洞检测以及漏洞修复等领域的卓越表现&#xff0c;荣获“国家信息安全漏洞库&#xff08;CNNVD&#xff09;技术支撑单位等级证书&#xff08;三级&#xff09;”&#xff0c;正式成为CNNVD技术支撑单位。 中国国家信息安全漏洞库&…...

cc linux用root用户执行chmod 777 -R ./提示 Operation not permitted怎么办?

如果你作为 root 用户执行 chmod 777 -R ./ 命令时收到 “Operation not permitted” 错误&#xff0c;可能有几个原因&#xff1a; 不可更改 (Immutable) 文件属性&#xff1a; 文件可能被设置为不可更改。即使是 root 用户也不能修改这些文件的权限。使用 lsattr 命令查看文件…...

scrapy框架流程

1、Scrapy从Spider子类中提取start_url,然后构造为request请求对象 2、将request请求对象传递给爬虫中间件 3、将request请求对象传递给Scrapy引擎&#xff08;核心代码&#xff09; 4、将request请求对象传递给调度器&#xff08;它负责对多个request安排&#xff0c;好比交…...

802.11 帧的Reason Code 位和Status Code 位

Reason Code 位 当对方不适合加入网络时&#xff0c;工作站会送出 Disassociation&#xff08;解除连接&#xff09;或 Deauthentication&#xff08;解除身份认证&#xff09;帧作为应答。这些帧当中包含一个长度 16bit 的 Reason Code&#xff08;原因代码&#xff09;位&am…...

骨传导能保护听力吗?为什么说骨传导耳机可以保护听力?

由于骨传导耳机的特殊传声方式&#xff0c;是可以保护听力的。 首先了解下骨传导耳机的传声方式是什么&#xff1a; 骨传导耳机是通过骨骼震动传导技术&#xff0c;将声音传至颅骨&#xff0c;然后通过颅骨传导到内耳&#xff0c;直接刺激听觉神经&#xff0c;使人感知到声音…...

【iOS】实现评论区展开效果

文章目录 前言实现行高自适应实现评论展开效果解决cell中的buttom的复用问题 前言 在知乎日报的评论区中&#xff0c;用到了Masonry行高自适应来实现评论的展开&#xff0c;这里设计许多控件的约束问题&#xff0c;当时困扰了笔者许久&#xff0c;特此撰写博客记录 实现行高自…...

POE交换机——电源解决方案-升压控制器\降压控制器\中高压降压转换器

PoE是一种有线以太网供电技术&#xff0c;使用于数据传输的网线同时具备直流供电的能力&#xff0c;PoE供电具有可靠、连接简捷、标准统一的优势。越来越多的工业物联网设备开始采用PoE供电&#xff0c; 如IP电话、网络视频监控以及无线以太网设备等。 PoE交换机是一种用于提供…...

[C/C++]数据结构 循环队列

前言: 队列是一种具有先进先出特性的结构,但是当数据出队列以后,前面的空间就无法再次利用了,循环队列就可以解决这个问题 一:概念及结构: 1.循环队列概念 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队…...

Cache学习(2):Cache结构 命中与缺失 多级Cache结构 直接映射缓存

1 Cache名词解释 命中&#xff08;hit&#xff09;&#xff1a; CPU要访问的数据在Cache中有缓存缺失&#xff08;miss&#xff09;&#xff1a; CPU要访问的数据在Cache中没有缓存Cache Size&#xff1a;Cache的大小&#xff0c;代表Cache可以缓存最大数据的大小Cache Line&a…...

vue前端前端页面权限验证方式

在Vue应用中使用Vuex&#xff08;Vue的状态管理库&#xff09;来存储用户组&#xff08;user group&#xff09;和角色&#xff08;roles&#xff09;信息是一种合理的做法&#xff0c;特别是在涉及到权限管理和用户身份的情况下。Vuex提供了一个集中式的状态管理方案&#xff…...

jenkins springCloud项目优雅下线

文章目录 场景解决下线请求效果如图贴一个可用的部署脚本 场景 在 Spring Cloud 项目的微服务实例关闭时&#xff0c;需要首先从注册中心设置为下线&#xff0c;避免该服务的消费者继续请求该服务实例&#xff0c;导致请求失败如果我们在服务实例从注册中心取消注册后&#xff…...

indexOf

可以通過String的indexOf判斷是否包括某個字符。 SpringBootTest Slf4j class BaseApplicationTests {Testvoid contextLoads() {log.info("01".indexOf(".")"");log.info("0.1".indexOf(".")"");log.info("…...

STM32分区跳转问题

项目场景&#xff1a; 在OTA中&#xff0c;FLASH通常被划分为以下几种类型 bootloaderiapappbootloaderappapp保存区bootloaderapp1app2 不同的分区方式有不同的有点&#xff0c;但是共同点都是需要执行分区跳转 问题1描述 但在分区跳转过程中遇到过使用不同的编译器不能跳转…...

亿级流量架构服务降级

什么是服务降级 如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫限流,那么什么是服务降级呢? 简单来说就是,将一些不太重要的景区项目砍掉,平时就那么三五…...

【技术分享】RK3399 Ubuntu通过Python实现录音和播放功能

​本文基于IDO-SBC3968 Ubuntu 系统通过Python脚本实现录音和播放功能。 IDO-SBC3968采用RK3399国产六核64位CPU高性能处理器&#xff0c;支持4K HDMI2.0显示&#xff0c;接口丰富&#xff0c;拥有千兆以太网&#xff0c;全协议TypeC接口&#xff0c;USB3.0 &#xff0c;eDP 和…...

关于vs code Debug调试时候出现“找不到任务C/C++: g++.exe build active file” 解决方法

vs code Debug调试时候出现“找不到任务C/C: g.exe build active file” &#xff0c;出现报错&#xff0c;Debug失败 后来经过摸索和上网查找资料解决问题 方法如下 在Vs code的操作页面左侧有几个配置文件 红框里的是需要将要修改的文件 查看tasks.json和launch.json框选&…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...