负载均衡(理解/解析)

目录

什么是负载均衡

应用场景

        网络服务和应用:

        云计算和虚拟化:

负载均衡分类

        硬件负载均衡器

        软件负载均衡器

部署方式

        硬件部署:

        软件部署:

        云部署:

        路由模式:

算法实现

        轮询法(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地址进行哈希运算,然后选择结果对应的服务器来处理请求,这样可以保证来自同一客户端的请求总是被分配到同一台服务器上,有助于保持会话的持续性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacOS - 程序坞,但图标消失不见了 但是还能用

如图 强迫症难受死 重启什么的都尝试了。不好使&#xff01; 差点重装系统。 经验证 改名字可以修复。 但是系统的比如启动台 也显示不出来 全网好使的方案 在“应用程序”中打开“终端” 输入命令如下&#xff1a;&#xff08;注意&#xff1a;需要 sudo 权限&#xff0…

【CLR】《Cyclical Learning Rates for Training Neural Networks》

WACV-2017 IEEE Winter Conference on Applications of Computer Vision 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 CIFAR-10 and CIFAR-1005.3 ImageNet 6 Conclusion&#xff08;o…

Unity 中消息提醒框

Tooltip 用于ui布局 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using UnityEngine.UI;[ExecuteInEditMode()] // 可以在编辑模式下运行public class Tooltip : MonoBehaviour {public TMP_Text header; // 头部文本publi…

✌粤嵌—2024/3/11—跳跃游戏

代码实现&#xff1a; 方法一&#xff1a;递归记忆化 int path; int used[10000];bool dfs(int *nums, int numsSize) {if (path numsSize - 1) {return true;}for (int i 1; i < nums[path]; i) {if (used[path i]) {continue;}path i;used[path] 1;if (dfs(nums, num…

ZYNQ之嵌入式开发03——按键中断实验

文章目录 按键中断控制LED的状态AXI GPIO实现按键中断使用多个AXI GPIO实现按键中断 GPIO的简图如下图所示。 GPIO对应的中断ID是52。 按键中断控制LED的状态 前面实验中已经做了按键控制LED状态的实验&#xff0c;但是LED的状态分为按键按下时和按键松开时的两种状态&…

00_STM32CubeMX如何新建一个工程

STM32CubeMX如何新建一个工程 STM32CubeMX如何新建一个工程以使用PA1口点亮LED为例子 STM32CubeMX如何新建一个工程 以使用PA1口点亮LED为例子 1.创建一个新工程 2.搜索芯片&#xff0c;然后双击 3.点击PA1引脚&#xff0c;设置为输出口 4.文件一定要保存到英文路径&#xff…

4. WPF应用程序中的未捕获异常处理

文章目录 一. 目标二. 技能介绍① UI未捕获异常的处理方式② 全局程序域抛出的未处理异常的捕获③ 异步Task任务中的异常捕获 三. 总结 一. 目标 理解和使用UI未捕获异常DispatcherUnhandledException的使用方法和触发方式.理解和使用程序域未捕获异常AppDomain.CurrentDomain.…

vs2022断点调试怎么看堆栈帧,找异常位置

打一个断点以后&#xff0c;会出现如图报错 我们要怎么找到报错的语句&#xff1f;鼠标点击->堆栈帧->上一行运行的位置->直到找到错误出错如图所示&#xff1a; 跳转到&#xff0c;我们手写的代码&#xff0c;执行出错的位置

【第十五届】蓝桥杯省赛C++b组

今年的蓝桥杯省赛已经结束了&#xff0c;与以往不同&#xff0c;今年又回到了8道题&#xff0c;而22&#xff0c;23年出现了10道题 大家觉得难度怎么样&#xff0c;欢迎进来讨论&#xff0c;博主今年没参加哈&#xff0c;大家聊聊&#xff0c;我听听大家的意见和看法哈 试题A:…

DSP笔记13-时间基准子模块Time base(TB)比较子模块Counter cpmpare(CC)

时间基准子模块Time base(TB) 同步&#xff0c;计数 CTR计数寄存器 PRD周期寄存器 CMP比较寄存器&#xff0c;占空比 EPWMA&#xff0c; EPWMB&#xff0c;两个比较寄存器&#xff0c;但只有以及计数寄存器以及一个周期寄存器 计数模式 计数时钟TBCLK HSPCLKDIVx x0,分…

HBuilderX 中开发vue,引入百度地图获取当前ip地址定位

实现功能&#xff1a;使用百度地图获取IP地址&#xff0c;定位到当前位置 参考文档地址&#xff1a;MapVGL | 快速入门 一、在有外网的情况下&#xff0c;常规引入百度地图的方法如下&#xff1a; 1、在index.html中引入 <script src"//api.map.baidu.com/api?v1.…

element问题总结之el-table使用fixed固定列后滚动条滑动到底部或者最右侧的时候错位问题

el-table使用fixed固定列后滚动条滑动到底部或者最右侧的时候错位 效果图前言解决方案纵向滑动滚动条滑动到底部的错位解决横向滚动条滑动到最右侧的错位解决 效果图 前言 在使用el-table固定行的时候移动滚动条会发现移动到底部或者移动到最右侧的时候会出现表头和内容错位或…

在 Flutter App 中使用 GPS 定位

现代手机上&#xff0c;不论是苹果 iPhone 还是安卓 Android&#xff0c;都配备了强大的定位能力。 定位主要通过卫星和地面基站提供的信号&#xff0c;获得不同精度的定位信息。 通过手机的操作系统&#xff0c;可以获取这些定位信息。这是手机操作系统给应用层提供的能力。…

Udio——革命性的AI音乐生成软件

Udio是一款革命性的AI音乐生成软件&#xff0c;由前谷歌DeepMind的顶尖AI研究人员和工程师共同创立&#xff0c;得到著名风险投资公司a16z的支持。它旨在为音乐爱好者和专业人士提供一个全新的音乐创作和分享平台。用户可以通过文本提示来生成音乐&#xff0c;支持广泛的音乐风…

numpy学习笔记(5),其他实用函数

8. 更多函数 8.1 随机数 8.1.1 常用随机数 8.1.1.1 numpy.random.rand(d0, d1, …, dn) 返回[0.0, 1.0)随机浮点数&#xff0c;即大于等于0.0&#xff0c;小于1.0。d0, d1, …, dn&#xff1a;返回的数组形状 # 使用numpy.random.rand函数 import numpy as np np.random.r…

百元内的运动蓝牙耳机哪个牌子好?五大高分品牌实测推荐

在追求健康生活的当下&#xff0c;运动已成为许多人日常生活的一部分&#xff0c;而音乐更是运动时的最佳伴侣&#xff0c;对于预算有限的学生党或普通消费者来说&#xff0c;如何在百元内挑选到一款性能优越、品质可靠的运动蓝牙耳机&#xff0c;确实是个不小的挑战&#xff0…

(六)C++自制植物大战僵尸游戏关卡数据讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 游戏关卡数据文件定义了游戏中每一个关卡的数据&#xff0c;包括游戏类型、关卡通关奖励的金币数量、僵尸出现的波数、每一波出现僵尸数量、每一波僵尸出现的类型等。根据不同的游戏类型&#xff0c;定义了不同的通…

ATA-214高压放大器用在哪些实验中使用的

高压放大器在科学实验和工程应用中扮演着关键角色。它是一种能够将低电压信号放大到高电压水平的设备。这种放大器通常用于需要处理高电压信号的实验和应用中。以下是高压放大器在各种实验中的应用范围。 粒子物理实验&#xff1a;在粒子物理实验中&#xff0c;科学家使用高压放…

【分享】3种方法取消Word文档的“打开密码”

我们知道&#xff0c;Word文档可以设置“打开密码”&#xff0c;防止文档被随意打开&#xff0c;那后续不需要密码保护了&#xff0c;要怎么取消呢&#xff1f;不小心把密码忘记了还可以取消吗&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 如果是Word文档不再需要密码…

Python Flask-Security- 构建安全而强大的Web应用

Flask-Security是一个基于Flask的安全扩展&#xff0c;为开发者提供了构建安全且强大的Web应用的工具。本文将深入探讨Flask- Security的核心功能、基本用法以及在实际应用中的一些高级特性&#xff0c;通过丰富的示例代码&#xff0c;助您更全面地了解和应用这一用于Web应用安…