负载均衡(理解/解析)

news2024/11/15 4:02:28

目录

什么是负载均衡

应用场景

        网络服务和应用:

        云计算和虚拟化:

负载均衡分类

        硬件负载均衡器

        软件负载均衡器

部署方式

        硬件部署:

        软件部署:

        云部署:

        路由模式:

算法实现

        轮询法(Round Robin):

        加权轮询法(Weighted Round Robin):

        随机法(Random):

        最小连接数算法(Least-Connection Scheduling):

        加权最小连接数算法(Weighted Least-Connection Scheduling):


什么是负载均衡

负载均衡(Load Balancing)是一种将工作负载(例如网络流量、数据请求、计算任务等)分配到多个计算资源(例如服务器、虚拟机、容器等)的技术。它的主要目的是优化性能、提高可靠性以及增加可扩展性。在工作环境中,负载均衡器通常位于应用程序前端,接受并分配传入的请求,通过算法确定分配请求的最佳方式,从而防止任何一个资源过载或失效导致应用程序的性能下降或停止响应。

应用场景

        网络服务和应用:

负载均衡技术广泛用于Web服务器、FTP服务器、数据库服务器等,确保它们能够处理大量并发请求,提供稳定的服务。


        云计算和虚拟化:

在云计算环境中,负载均衡用于分配虚拟机、容器等资源,确保资源的有效利用和服务的持续可用性。
大数据和分布式系统:在处理大规模数据和分析任务时,负载均衡有助于将数据和工作负载均匀分布到多个节点上,提高处理速度和效率。
在生活中,虽然不会直接用到负载均衡的概念,但类似的原理可以应用于许多场景。例如,在一个大型活动中,组织者可能会将参与者分配到不同的区域或队列中,以平衡各个区域或队列的负载,确保活动顺利进行。这种分散处理的方式与负载均衡在网络和计算环境中的应用有相似之处。

负载均衡分类

首先,从软硬件的角度来看,负载均衡可以分为硬件负载均衡和软件负载均衡。

        硬件负载均衡器

是专为负载均衡任务设计的物理设备,它利用专用硬件组件(如ASICs或FPGAs)来高效分发流量。其优点在于高性能和吞吐量,经过优化的任务处理,以及内置网络安全、监控和管理功能,能应对大量流量和多种协议。然而,硬件负载均衡器通常价格昂贵,特别是高性能型号,配置和维护也需要专业知识,且可扩展性受限。

        软件负载均衡器

则是运行在通用服务器或虚拟机上的应用程序,使用软件算法将流量分发到多个服务器或资源。其优点在于经济实惠、适应性强、易于扩展(可通过增加资源或升级硬件实现)以及灵活(可在各种平台和环境中部署)。但在高负载下,软件负载均衡器的性能可能较差,且可能影响主机系统资源,需要维护软件更新。

另外,负载均衡还可以根据分配策略的不同,分为普通负载均衡和动态负载均衡。普通负载均衡是指将用户请求均匀地分发到多个服务器,以实现服务器的负载均衡,通常采用静态的分发算法,如轮询、随机等。而动态负载均衡则是根据服务器的实时负载情况,动态地调整请求的分发策略,以保证服务器负载的均衡。每个服务器被分配一个权重值,权重越高,则分发到该服务器的请求越多。

此外,根据网络层次的不同,负载均衡还可以分为二层负载均衡(MAC)、三层负载均衡(IP)、四层负载均衡(TCP)和七层负载均衡(HTTP)。这些负载均衡类型的主要区别在于它们工作的网络层次和处理的请求类型。

至于线上与线下的分类,这更多地是指负载均衡的部署方式。线上负载均衡通常指的是在互联网环境中运行的负载均衡解决方案,而线下负载均衡则可能指的是在私有网络或企业内部环境中运行的负载均衡。

至于各种负载均衡的优缺点,除了之前提到的软硬件负载均衡的优缺点外,不同层次的负载均衡也有其特定的优缺点。例如,七层负载均衡能够基于URL或主机名进行请求分发,对于基于Web的应用非常有用,但可能增加处理延迟。而二层负载均衡则更适用于底层网络通信,但配置和管理可能更为复杂。

部署方式

        硬件部署:

使用专用设备来进行负载均衡,这种方式需要购买昂贵的硬件设备,但具有良好的性能和可靠性。对于大型企业和高流量网站来说非常适合,可以快速分配流量,提高网站的访问速度和响应时间。但硬件负载均衡的维护成本也很高,需要专业的运维人员来管理和维修设备。


        软件部署:

基于软件运行的方式,通过安装特定的软件程序来实现负载均衡。这种方式相对于硬件部署来说价格更为合理,而且配置和管理更为简单。适合中小型企业和中小流量网站。但软件负载均衡也存在一些问题,比如安全性和可靠性方面的考虑,并且其性能和稳定性受限于所选择的软件。


        云部署:

基于云计算技术的方式,将负载均衡功能放在云服务商的服务器上运行。这种方式可以根据实际需求动态调整资源,提高灵活性和可扩展性。
在负载均衡的部署中,还需要考虑其网络架构。常见的负载均衡部署模式包括:

        路由模式:

服务器的网关必须设置成负载均衡机的LAN口地址,且与WAN口分署不同的逻辑网络。这种方式对网络的改动小,能均衡任何下行流量,约60%的用户采用这种方式部署。
桥接模式:负载均衡的WAN口和LAN口分别连接上行设备和下行服务器,所有的服务器与负载均衡均在同一逻辑网络中。此模式配置简单,不改变现有网络,但由于其容错性差,一般不推荐。
服务直接返回模式:负载均衡的LAN口不使用,WAN口与服务器在同一个网络中。对于客户端而言,响应的IP是服务器自身的IP地址,返回的流量不经过负载均衡。这种模式比较适合吞吐量大特别是内容分发的网络应用,约30%的用户采用这种模式。

算法实现

        轮询法(Round Robin):

轮询法是最简单的一种负载均衡算法,它将请求按顺序轮流地分配到后端服务器上。这种算法对后端服务器的处理能力一视同仁,不考虑实际的连接数和系统负载。

package routine.LoadBalance;

import java.util.LinkedList;
import java.util.List;

/**
 * 轮询法(Round Robin)
 *
 * 非常基本的实现,并没有考虑很多实际负载均衡器需要考虑的因素,
 * 比如服务器的健康状况、性能、权重等。
 * 在实际应用中,负载均衡算法通常会结合更多的信息和策略来实现更高效的负载分配。
 */
public class RoundRobinLoadBalancer {
    private List<String> servers; // 后端服务器列表  
    private int currentIndex = 0; // 当前服务器索引  

    public RoundRobinLoadBalancer(List<String> servers) {
        this.servers = servers;
    }

    // 获取下一个服务器  
    public synchronized String getNextServer() {
        if (servers == null || servers.isEmpty()) {
            return null;
        }
        //每次被调用时,都会返回当前索引对应的服务器,并将索引加一并取模,以确保索引在服务器列表的范围内循环。
        String server = servers.get(currentIndex);
        currentIndex = (currentIndex + 1) % servers.size(); // 循环索引  
        return server;
    }

    public static void main(String[] args) {
        //创建三台服务器
        List<String> servers = new LinkedList<>();
        servers.add("server1");
        servers.add("server2");
        servers.add("server3");

        RoundRobinLoadBalancer loadBalancer = new RoundRobinLoadBalancer(servers);

        // 模拟10请求。每次请求都会调用 getNextServer 方法来获取下一个服务器,并输出请求发送到的服务器名称。
        for (int i = 0; i < 10; i++) {
            String server = loadBalancer.getNextServer();
            System.out.println("Request " + (i + 1) + " is sent to server: " + server);
        }
    }
}


        加权轮询法(Weighted Round Robin):

加权轮询法给每个服务器都设置了权重,配置低、负载高的服务器权重低,配置高、负载低的服务器权重高。这样,高性能的服务器能够处理更多的请求。

package routine.LoadBalance;

import java.util.LinkedList;
import java.util.List;

/**
 * 加权轮询法
 * 示例中并没有实现动态调整权重的功能,如根据服务器的当前连接数来调整权重。
 * 在实际应用中,你可能需要根据服务器的实时负载情况来动态调整权重,以达到更好的负载均衡效果
 */
public class WeightedRoundRobinLoadBalancer {  
    private List<Server> servers; // 后端服务器列表,每个服务器带有权重  
    private int currentWeight; // 当前权重  
    private int maxWeight; // 所有服务器权重中的最大值  
    private int currentIndex; // 当前服务器索引  
  
    // Server类用于存储服务器信息和权重  
    public static class Server {  
        String ip;  
        int weight;  
        int currentConnections; // 当前连接数(可选,用于动态调整权重)  
  
        public Server(String ip, int weight) {  
            this.ip = ip;  
            this.weight = weight;  
            this.currentConnections = 0;  
        }  
    }  
  
    public WeightedRoundRobinLoadBalancer(List<Server> servers) {  
        this.servers = servers;  
        if (servers == null || servers.isEmpty()) {  
            throw new IllegalArgumentException("Servers list cannot be null or empty");  
        }  
        this.currentIndex = 0;  
        this.currentWeight = 0;  
        this.maxWeight = getMaxWeight(servers);  
    }  
  
    // 获取服务器列表中的最大权重  
    private int getMaxWeight(List<Server> servers) {  
        int max = 0;  
        for (Server server : servers) {  
            if (server.weight > max) {  
                max = server.weight;  
            }  
        }  
        return max;  
    }  
  
    // 获取下一个服务器  
    public synchronized Server getNextServer() {  
        if (servers == null || servers.isEmpty()) {  
            return null;  
        }  
  
        Server selectedServer = null;  
        while (selectedServer == null) {
            //currentWeight 大于或等于 maxWeight
            if (currentWeight >= maxWeight) {
                //选择当前服务器,并将 currentWeight 减去 maxWeight
                currentWeight = currentWeight - maxWeight;
                //索引 currentIndex 向前移动一位
                currentIndex = (currentIndex + 1) % servers.size();  
            }  
  
            if (currentIndex >= 0 && currentIndex < servers.size()) {  
                selectedServer = servers.get(currentIndex);  
                currentWeight = currentWeight + selectedServer.weight;  
            }  
        }  
  
        // 可选:更新当前服务器的连接数(用于动态调整权重)  
//         selectedServer.currentConnections++;
  
        return selectedServer;  
    }  
  
    public static void main(String[] args) {  
        List<Server> servers = new LinkedList<>();  
        servers.add(new Server("server1", 1));  
        servers.add(new Server("server2", 3));  
        servers.add(new Server("server3", 2));  
  
        WeightedRoundRobinLoadBalancer loadBalancer = new WeightedRoundRobinLoadBalancer(servers);  
  
        // 模拟请求  
        for (int i = 0; i < 10; i++) {  
            Server server = loadBalancer.getNextServer();  
            System.out.println("Request " + (i + 1) + " is sent to server: " + server.ip);  
        }  
    }  
}


        随机法(Random):

随机法通过系统的随机算法,根据后端服务器的列表大小值来随机选择其中一台服务器访问。这种方式能够随机地分配请求,但对于每台服务器的实际负载情况并无考虑。
加权随机法(Weighted Random):加权随机法类似于加权轮询法,不过在处理请求分担时是一个随机选择的过程。它根据后端服务器的配置和负载情况分配不同的权重,然后按照权重随机选择服务器。

package routine.LoadBalance;

import java.util.List;
import java.util.Random;

/**
 * 随机法
 * 随机法不考虑服务器的性能或负载情况,因此它可能不是最优的负载均衡策略,
 * 特别是在服务器之间存在较大性能差异的情况下。
 * 然而,对于某些简单场景或临时负载平衡,随机法可能是一个简单且有效的选择。
 */
public class RandomLoadBalancer {  
    private List<Server> servers; // 后端服务器列表  
    private Random random; // 随机数生成器  
  
    // Server类用于存储服务器信息  
    public static class Server {  
        String ip;  
  
        public Server(String ip) {  
            this.ip = ip;  
        }  
    }  
  
    public RandomLoadBalancer(List<Server> servers) {  
        if (servers == null || servers.isEmpty()) {  
            throw new IllegalArgumentException("Servers list cannot be null or empty");  
        }  
        this.servers = servers;  
        this.random = new Random();  
    }  
  
    // 获取下一个服务器  
    public Server getNextServer() {  
        if (servers == null || servers.isEmpty()) {  
            return null;  
        }  
  
        // 随机选择一个服务器索引  
        int index = random.nextInt(servers.size());  
          
        // 返回该索引对应的服务器  
        return servers.get(index);  
    }  
  
    public static void main(String[] args) {  
        List<Server> servers = List.of(  
                new Server("server1"),  
                new Server("server2"),  
                new Server("server3")  
        );  
  
        RandomLoadBalancer loadBalancer = new RandomLoadBalancer(servers);  
  
        // 模拟请求  
        for (int i = 0; i < 10; i++) {  
            Server server = loadBalancer.getNextServer();  
            System.out.println("Request " + (i + 1) + " is sent to server: " + server.ip);  
        }  
    }  
}


        最小连接数算法(Least-Connection Scheduling):

该算法是一种动态调度算法,通过服务器中当前所活跃的连接数来估计服务器的负载情况,把新的连接请求分配到当前连接数最小的服务器。这种算法能更好地利用后端服务器的处理能力,但在服务器处理能力差异大的情况下可能并不理想。

package routine.LoadBalance;

import java.util.*;

/**
 * 最小连接数算法
 * 没有考虑线程安全问题。
 * 在并发环境中,connectionCounts 的更新需要同步,以避免竞态条件。
 * 可以使用 synchronized 块、ReentrantLock 或其他并发控制机制来实现线程安全。
 * 此外,这个示例也没有处理服务器不可用的情况,实际应用中可能需要添加服务器健康检查逻辑。
 */
public class LeastConnectionsLoadBalancer {
    private List<Server> servers; // 后端服务器列表  
    private Map<Server, Integer> connectionCounts; // 服务器当前连接数映射  

    // Server类用于存储服务器信息和当前连接数  
    public static class Server {
        String ip;
        int currentConnections;

        public Server(String ip) {
            this.ip = ip;
            this.currentConnections = 0;
        }

        // 增加连接数  
        public void incrementConnectionCount() {
            this.currentConnections++;
        }

        // 减少连接数  
        public void decrementConnectionCount() {
            this.currentConnections--;
        }
    }

    public LeastConnectionsLoadBalancer(List<Server> servers) {
        if (servers == null || servers.isEmpty()) {
            throw new IllegalArgumentException("Servers list cannot be null or empty");
        }
        this.servers = servers;
        this.connectionCounts = new HashMap<>();
        for (Server server : servers) {
            connectionCounts.put(server, 0);
        }
    }

    // 获取下一个服务器,使用最小连接数算法  
    public Server getNextServer() {
        if (servers == null || servers.isEmpty()) {
            return null;
        }

        Server leastLoadedServer = null;
        int minConnections = Integer.MAX_VALUE;

        // 遍历服务器列表,找到连接数最少的服务器  
        for (Server server : servers) {
            int currentConnections = connectionCounts.get(server);
            if (currentConnections < minConnections) {
                minConnections = currentConnections;
                leastLoadedServer = server;
            }
        }

        // 如果没有找到服务器或者所有服务器连接数相同,则随机选择一个  
        if (leastLoadedServer == null) {
            Collections.shuffle(servers);
            leastLoadedServer = servers.get(0);
        }

        // 更新连接数  
        connectionCounts.put(leastLoadedServer, minConnections + 1);

        return leastLoadedServer;
    }

    // 当请求处理完成时,减少服务器的连接数  
    public void processCompleted(Server server) {
        if (server != null && connectionCounts.containsKey(server)) {
            connectionCounts.put(server, connectionCounts.get(server) - 1);
        }
    }

    public static void main(String[] args) {
        List<Server> servers = Arrays.asList(
                new Server("server1"),
                new Server("server2"),
                new Server("server3")
        );

        LeastConnectionsLoadBalancer loadBalancer = new LeastConnectionsLoadBalancer(servers);

        // 模拟并发请求,实现连接数最小取值
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(() -> {
                Server server = loadBalancer.getNextServer();
                System.out.println("线程:" + Thread.currentThread().getName() + " is sent to server: " + server.ip);
                // 模拟请求处理完成后减少连接数
                loadBalancer.processCompleted(server);
            });
            thread.start();
        }
    }
}


        加权最小连接数算法(Weighted Least-Connection Scheduling):

这种算法用相应的权值表示各个服务器的处理性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询服务器的负载情况,并动态地调整其权值。

package routine.LoadBalance;

import java.util.*;

/**
 * 加权最小连接数算法
 * 考虑了服务器的处理能力差异,为每个服务器分配不同的权重,
 * 权重通常反映了服务器的处理能力。权重较高的服务器可以处理更多的连接。
 */
public class WeightedLeastConnectionsLoadBalancer {
    private List<WeightedServer> servers; // 后端服务器列表  
    private Map<WeightedServer, Integer> connectionCounts; // 服务器当前连接数映射  

    // WeightedServer类用于存储服务器信息、权重和当前连接数  
    public static class WeightedServer {
        String ip;
        int weight;
        int currentConnections;

        public WeightedServer(String ip, int weight) {
            this.ip = ip;
            this.weight = weight;
            this.currentConnections = 0;
        }

        // 增加连接数  
        public void incrementConnectionCount() {
            this.currentConnections++;
        }

        // 减少连接数  
        public void decrementConnectionCount() {
            this.currentConnections--;
        }

        // 获取有效连接数(考虑权重)  这里需要计算考量
        public int getEffectiveConnections() {
            return currentConnections * weight;
        }
    }

    public WeightedLeastConnectionsLoadBalancer(List<WeightedServer> servers) {
        if (servers == null || servers.isEmpty()) {
            throw new IllegalArgumentException("Servers list cannot be null or empty");
        }
        this.servers = servers;
        this.connectionCounts = new HashMap<>();
        for (WeightedServer server : servers) {
            connectionCounts.put(server, 0);
        }
    }

    // 获取下一个服务器,使用加权最小连接数算法  
    public WeightedServer getNextServer() {
        if (servers == null || servers.isEmpty()) {
            return null;
        }

        WeightedServer leastLoadedServer = null;
        int minEffectiveConnections = Integer.MAX_VALUE;

        // 遍历服务器列表,找到有效连接数最少的服务器
        for (WeightedServer server : servers) {
            int effectiveConnections = connectionCounts.get(server);
//            int effectiveConnections = server.getEffectiveConnections();
            if (effectiveConnections < minEffectiveConnections) {
                minEffectiveConnections = effectiveConnections;
                leastLoadedServer = server;
            }
        }

        // 如果没有找到服务器,则随机选择一个  
        if (leastLoadedServer == null) {
            Collections.shuffle(servers);
            leastLoadedServer = servers.get(0);
        }
        // 更新连接数
        connectionCounts.put(leastLoadedServer, connectionCounts.get(leastLoadedServer) + 1);
        return leastLoadedServer;
    }

    // 当请求处理完成时,减少服务器的连接数  
    public void processCompleted(WeightedServer server) {
        if (server != null && connectionCounts.containsKey(server)) {
            connectionCounts.put(server, connectionCounts.get(server) - 1);
        }
    }

    public static void main(String[] args) {
        List<WeightedServer> servers = Arrays.asList(
                new WeightedServer("server1", 2),
                new WeightedServer("server2", 3),
                new WeightedServer("server3", 1)
        );

        WeightedLeastConnectionsLoadBalancer loadBalancer = new WeightedLeastConnectionsLoadBalancer(servers);

        // 模拟请求  
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(() -> {
                WeightedServer server = loadBalancer.getNextServer();
                System.out.println("线程:" + Thread.currentThread().getName() + " is sent to server: " + server.ip);
                // 模拟请求处理完成后减少连接数
                loadBalancer.processCompleted(server);
            });
            thread.start();
        }
    }
}


除此之外,还有源地址哈希法等负载均衡算法,通过对发送请求的客户端的IP地址进行哈希运算,然后选择结果对应的服务器来处理请求,这样可以保证来自同一客户端的请求总是被分配到同一台服务器上,有助于保持会话的持续性。

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

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

相关文章

java学习——消息队列MQ

上一篇传送门&#xff1a;点我 目前只学习了RabbitMQ&#xff0c;后续学习了其他MQ后会继续补充。 MQ有了解过吗&#xff1f;说说什么是MQ&#xff1f; MQ是Message Queue的缩写&#xff0c;也就是消息队列的意思。它是一种应用程序对应用程序的通信方法&#xff0c;使得应用…

Apache Zeppelin 命令执行漏洞复现(CVE-2024-31861)

0x01 产品简介 Apache Zeppelin 是一个让交互式数据分析变得可行的基于网页的开源框架&#xff0c;Zeppelin提供了数据分析、数据可视化等功能&#xff0c; 0x02 漏洞概述 Apache Zeppelin 中代码生成控制不当&#xff08;“代码注入”&#xff09;漏洞。攻击者可以使用 She…

Springboot集成Ehcache3实现本地缓存

如果只需要在单个应用程序中使用本地缓存&#xff0c;则可以选择Ehcache&#xff1b;它支持内存和磁盘存储&#xff0c;这里不以注解方式演示&#xff0c;通过自己实现缓存管理者灵活控制缓存的读写&#xff1b; 1、引入相关依赖 <!-- ehcache3集成start --><depende…

蓝色系UX/UI设计求职面试作品集模版figmasketchPPT可编辑源文件

页面数量: 20P 页面尺寸:1920*1080PX 交付格式&#xff1a;figma、sketch、PPT 赠送文件&#xff1a;24款高质量样机&#xff08;PSD格式&#xff09; 该作品集虽然只有20页&#xff0c;但可根据需求复制作品集里已有的页面作为模版来扩展您的设计项目 该作品集模版可编辑可修…

MySQL (索引 事务)

索引 索引是一种特殊的文件, 包含着对于数据库里所有数据的引用指针. 可以对表中的一列或多列创建索引, 并指定索引类型, 各类索引有各自的数据结构实现 索引的目的在于 快速定位, 检索数据 索引可以提高 查找 效率, 但会增加 增删改 的开销 索引创建好之后, 每次调用 查询操作…

探索顶级短视频素材库:多样化选择助力创作

在数字创作的浪潮中&#xff0c;寻找优质的短视频素材库是每位视频制作者的必经之路。多种短视频素材库有哪些&#xff1f;这里为您介绍一系列精选的素材库&#xff0c;它们不仅丰富多样&#xff0c;而且高质量&#xff0c;能极大地提升您的视频创作效率和质量。 1.蛙学网 蛙学…

华火电焰灶全国经销商加盟_优势怎么样_费用多少_华焰天下

随着科技的不断进步&#xff0c;电焰灶作为现代厨房的重要设备&#xff0c;其市场需求持续增长。华火电焰灶&#xff0c;凭借其独特的技术优势和广泛的市场前景&#xff0c;吸引了众多投资者的目光。本文将从华火电焰灶的优势、加盟费用以及华焰天下的机遇三个方面&#xff0c;…

【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解

目录 &#x1f31e;1. 整体思路 &#x1f31e;2. 准备内容 &#x1f33c;2.1 配置.c文件 &#x1f33c;2.2 准备测试程序 &#x1f33c;2.3 GDB调试基础 &#x1f31e;3. GDB调试四层二叉树 &#x1f33c;3.1 测试程序分析 &#x1f33c;3.2 gdb分析 &#x1f33b;1. …

OpenHarmony轻量系统开发【3】代码编译和烧录

3.1源码目录 下载完代码后&#xff0c;大家可以进入代码目录&#xff1a; 这里重点介绍几个比较重要的文件夹&#xff1a; 1 vendor文件夹 该文件夹存放的是厂商相关的配置&#xff0c;包括组件配置、HDF相关配置&#xff0c;代码目录如下&#xff1a; 可以看到有hisilicon文…

LLMs之ToolAlpaca:ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略

LLMs之ToolAlpaca&#xff1a;ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略 目录 ToolAlpaca的简介 0、《ToolAlpaca: Generalized Tool Learning for Language Models with 3000 Simulated Cases》翻译与解读 1、数据集列表 2…

连续上榜!Coremail连续十一次入选《中国网络安全行业全景图》

4月12日&#xff0c;国内专业权威咨询机构——安全牛&#xff0c;正式发布第十一版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;。该全景图包含了16项一级安全分类&#xff0c;108项二级安全分类&#xff0c;共收录454家网络安全厂商。 Coremail作为…

【保姆级】2024年OnlyFans订阅指南

OnlyFans是一个独特的社交媒体平台&#xff0c;它为创作者和粉丝提供了一个互动交流的空间。通过这个平台&#xff0c;创作者可以分享他们的独家内容&#xff0c;而粉丝则可以通过订阅来支持和享受这些内容。如果你对OnlyFans感兴趣&#xff0c;并希望成为其中的一员&#xff0…

D365开发-在视图按钮的js里,引用别的js里的公共方法

公共方法写法&#xff1a; "use strict"; var JJMC window.JJMC || {}; JJMC.SamMCommon JJMC.SamMCommon || {}; (function () { this.cloneRecord function (excludeAttrbuteNames){ / } }).call(JJMC.SamMCommon); 然后在需要调方法的command里面&#xff0c;之…

PNPM 8管理Node版本,卸载了旧版本Node找不到PNPM

前言 用 pnpm env 来管理 node 的版本&#xff0c;安装了新版本之后&#xff0c;卸载了之前的旧版本&#xff0c;调用 pnpm 报错 异常截图 解决方式 从终端获取报错文件到路径&#xff0c;进入编辑修改错误的 node bin 路径为正确的 node 启动路径即可也就是修改 "/Use…

vite+vue3+antDesignVue 记录-持续记录

记录学习过程 持续补充 每天的学习点滴 开始时间2024-04-12 1&#xff0c;报错记录 &#xff08;1&#xff09;env.d.ts文件 解决方法&#xff1a; 在env.d.ts文件中添加以下代码&#xff08;可以看一下B站尚硅谷的讲解视频&#xff09; declare module *.vue {import { Defi…

SpringBoot基于RabbitMQ实现消息延迟队列方案

知识小科普 在此之前&#xff0c;简单说明下基于RabbitMQ实现延时队列的相关知识及说明下延时队列的使用场景。 延时队列使用场景 在很多的业务场景中&#xff0c;延时队列可以实现很多功能&#xff0c;此类业务中&#xff0c;一般上是非实时的&#xff0c;需要延迟处理的&a…

宠物品牌出海 丨战略布局这样做让你爆单不停

宠物用品市场在电商领域增长迅速。面对国内市场竞争激烈&#xff0c;同质化严重&#xff0c;不少宠物用品公司开始寻求新的市场增长点&#xff0c;将目光转向国外市场。本文将探讨宠物品牌海外扩张的商机和策略&#xff0c;以便帮助其他公司应对挑战&#xff0c;抓住国际市场的…

利用国产库libhv动手写一个web_server界面(二)

目录 一、配置参数解析与响应 1.读取参数 2.设置参数 3.恢复默认参数 二、整体的界面实现以及交互效果 三、关于yaml文件乱码问题解决 四、参考文章 一、配置参数解析与响应 使用cJSON解析库&#xff0c;解析接收到的JSON数据字段&#xff0c;区别接收到的配置参数是请…

数据结构--选择排序

1、选择排序 1.1 基本认识 1.1.1 基本概念 选择排序是一种简单直观的排序算法&#xff0c;无论什么数据进去都是 O(n) 的时间复杂度。 1.1.2 算法步骤 &#xff08;1&#xff09;首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起…

【VTKExamples::Meshes】第十期 Decimation

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例Decimation,并解析接口vtkDecimatePro,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO…