深入理解分布式架构,构建高效可靠系统的关键
深入探讨分布式架构的核心概念、优势、挑战以及构建过程中的关键考虑因素。

- 引言
- 什么是分布式架构?
- 分布式架构的重要性
- 分布式系统的核心概念
- 节点和通信
- 数据分区与复制
- 一致性与一致性模型
- 负载均衡与容错性
- 常见的分布式架构模式
- 客户端-服务器架构
- 微服务架构
- 事件驱动架构
- 成功的分布式架构案例
- Amazon Web Services (AWS)
- Google Cloud Platform (GCP)
- 微软 Azure 6.4 Facebook的分布式数据存储
引言
什么是分布式架构?
分布式架构是一种计算机系统架构,其核心思想是将一个大型系统拆分成多个独立的子系统或组件,这些子系统可以分布在不同的计算机或服务器上,彼此之间通过网络进行通信和协作。分布式架构的设计旨在提高系统的可伸缩性、可靠性、性能和灵活性,以满足现代应用程序的需求。
在分布式架构中,各个子系统通常被称为节点,它们可以是物理服务器、虚拟机或容器化的应用程序。这些节点协同工作以执行系统的不同功能,可以分为以下几个关键特点和原则:
-
分布性: 分布式架构的核心特点是系统的各个组件分布在不同的地理位置或计算机节点上。这有助于分担负载、提高性能和可用性。
-
互联性: 节点之间通过网络连接,可以进行实时通信和数据交换。通信可以基于不同的协议和技术,如HTTP、TCP/IP等。
-
并发性: 分布式系统能够同时处理多个请求或任务,从而提高了系统的响应速度。这对于高流量和高负载的应用程序至关重要。
-
容错性: 分布式系统通常具有容错机制,以应对硬件故障、网络故障或其他意外情况。数据冗余、负载均衡和自动故障恢复是容错性的关键组成部分。
-
可伸缩性: 分布式架构允许根据需求扩展系统的容量。这意味着可以轻松地添加新的节点或资源,以适应不断增长的用户或数据量。
-
安全性: 分布式系统需要特别注意安全性,包括数据的加密、身份验证、访问控制等,以确保数据的机密性和完整性。
-
一致性: 在某些应用中,分布式系统需要保持数据的一致性,这意味着不同节点上的数据应该保持同步。分布式数据库和一致性协议(如Paxos和Raft)用于解决这个问题。
-
管理和监控: 由于分布式系统的复杂性,管理和监控变得至关重要。管理员需要能够追踪系统的性能、健康状态和故障。
分布式架构是一种在现代计算环境中广泛使用的架构范例,它旨在通过分割和分布系统的不同部分来提高系统的可用性和性能。然而,它也伴随着挑战,如数据一致性、通信延迟和安全性等问题,需要仔细的设计和管理来克服。分布式架构已成为构建大规模、高效、可靠系统的关键要素,适用于云计算、大数据处理、物联网和许多其他领域的应用。
分布式架构的重要性
分布式架构的重要性不可低估,它在现代计算领域扮演着至关重要的角色。
-
可用性和鲁棒性: 分布式架构通过将系统分解成多个独立的部分,并在不同的节点上运行,提高了系统的可用性和鲁棒性。即使某个节点或部分发生故障,系统仍然可以继续运行,确保用户体验不受影响。
-
性能和扩展性: 分布式架构允许系统在需要时水平扩展,通过增加节点来处理更多的负载。这种能力对于需要处理大量用户请求或大规模数据处理的应用至关重要,可以保持系统的高性能。
-
灵活性: 分布式架构使得系统的不同部分可以独立开发、测试和部署。这种灵活性使团队能够更快地推出新功能,修复错误,并进行持续的改进,而无需影响整个系统。
-
地理分布: 随着全球化的发展,许多应用需要在不同地理位置提供服务。分布式架构可以在各个地区部署节点,从而降低延迟并提供更好的用户体验。
-
容错能力: 分布式系统可以通过冗余和备份机制提高容错能力。即使部分节点不可用,系统仍然可以继续运行,避免单点故障。
-
资源共享: 不同部分的系统可以共享资源,如存储、计算和带宽,从而更有效地利用资源。
-
处理大数据: 处理海量数据对许多应用来说是一个挑战。分布式架构可以将数据分散存储和处理,以实现更快的数据分析和查询。
-
支持新技术: 分布式架构为集成新技术和工具提供了平台。它可以与容器化、微服务架构、大数据处理等现代技术无缝集成。
分布式架构在提供高可用性、高性能、灵活性和容错能力方面发挥着重要作用,对于满足现代应用程序的需求至关重要。
分布式系统的核心概念
节点和通信
当涉及到分布式架构中的节点和通信时,通常涉及多个计算节点或服务器之间的相互协作。节点是分布式系统中的个体,可以是物理服务器、虚拟机、容器等。通信是这些节点之间传递数据和消息的过程。下面是一个简单的示例,展示了如何使用Python的Socket库来实现基本的节点通信。
节点通信示例:
假设我们有两个节点,一个作为服务器,另一个作为客户端。服务器节点监听来自客户端的连接,并接收并发送消息。
服务器端代码:
import socket# 创建一个socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定IP和端口
server_address = ('localhost', 12345)
server_socket.bind(server_address)# 监听连接
server_socket.listen(1)print("等待连接...")# 等待客户端连接
client_socket, client_address = server_socket.accept()
print("连接来自:", client_address)# 接收和发送数据
data = client_socket.recv(1024)
print("接收到的数据:", data.decode())message = "Hello from server!"
client_socket.send(message.encode())# 关闭连接
client_socket.close()
server_socket.close()
客户端代码:
import socket# 创建一个socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服务器地址
server_address = ('localhost', 12345)# 连接到服务器
client_socket.connect(server_address)# 发送数据
message = "Hello from client!"
client_socket.send(message.encode())# 接收数据
data = client_socket.recv(1024)
print("接收到的数据:", data.decode())# 关闭连接
client_socket.close()
在这个示例中,服务器端和客户端分别通过socket建立通信连接。服务器端监听指定地址和端口,等待客户端连接。一旦连接建立,它可以接收来自客户端的消息,并发送回应。
实际的分布式系统可能涉及更复杂的通信协议、数据处理和容错机制。在实际应用中,可能会使用更高级的通信库、消息队列或RPC框架来处理分布式节点之间的通信。
数据分区与复制
数据分区和复制是分布式系统中重要的概念,用于管理数据的存储和访问。在不同的分布式存储系统中,实现数据分区和复制的方式可能会有所不同。通过一个示例来展示如何使用哈希函数进行数据分区和复制。
import hashlib# 假设有3个节点
num_nodes = 3
nodes = ['Node1', 'Node2', 'Node3']class DataPartitioner:def __init__(self, nodes):self.nodes = nodesdef get_node(self, key):# 使用哈希函数选择节点hash_value = hashlib.sha256(key.encode()).hexdigest()node_index = int(hash_value, 16) % len(self.nodes)return self.nodes[node_index]class DataReplicator:def __init__(self, nodes):self.nodes = nodesdef replicate_data(self, data, num_replicas):replicas = []for _ in range(num_replicas):replica_nodes = set()while len(replica_nodes) < num_replicas:node = self.nodes[hash(data + str(_)) % len(self.nodes)]replica_nodes.add(node)replicas.append(replica_nodes)return replicas# 创建数据分区器和数据复制器
partitioner = DataPartitioner(nodes)
replicator = DataReplicator(nodes)# 数据分区
key = 'some_key'
node = partitioner.get_node(key)
print(f"Data with key '{key}' is stored on {node}")# 数据复制
data = 'some_data'
num_replicas = 2
replica_sets = replicator.replicate_data(data, num_replicas)
for i, replica_nodes in enumerate(replica_sets):print(f"Replica {i+1} of data '{data}' is stored on nodes: {', '.join(replica_nodes)}")
实际的分布式系统会涉及更复杂的算法和机制来进行数据分区和复制,同时还需要处理故障转移、一致性等问题。对于不同的分布式存储系统,可能会使用一致性哈希、分片、副本管理等技术来实现数据分区和复制。在实际应用中,可能会使用现有的分布式存储系统或数据库,如Cassandra、Hadoop HDFS、Amazon DynamoDB等。
一致性与一致性模型
一致性在分布式系统中是指系统中的所有节点在任何时间点都具有相同的数据视图或状态。为了实现一致性,需要引入一致性模型,它定义了在何种条件下系统中的数据会达到一致状态。
一致性(Consistency): 一致性是指分布式系统中的各个节点在进行数据更新后,需要保证所有节点都能够看到更新后的数据。换句话说,一致性确保系统中的数据副本保持同步,所有节点都能够看到相同的数据变更。一致性是分布式系统中的一个重要概念,但在实现时需要权衡性能、可用性和一致性之间的关系。
一致性模型(Consistency Models): 一致性模型定义了在分布式系统中如何确保数据的一致性。不同的一致性模型对于数据的同步要求和读写操作的可见性有不同的规定。以下是一些常见的一致性模型:
-
强一致性(Strong Consistency): 在强一致性模型中,任何时刻所有节点都能够看到相同的数据状态。所有写操作都会立即反映在所有节点上,并且读操作总是返回最新的写操作结果。虽然强一致性能够保证数据的一致性,但通常会牺牲一部分性能和可用性。
-
弱一致性(Weak Consistency): 弱一致性模型允许数据在不同节点之间存在一定程度的延迟,因此节点之间可能在一段时间内看到不同的数据状态。这种模型通常更关注性能和可用性,适用于一些对数据一致性要求较低的场景。
-
最终一致性(Eventual Consistency): 最终一致性模型允许在某个时间点之后,所有节点最终都会达到一致的数据状态。这意味着系统在一段时间内可以存在不一致的状态,但最终会收敛到一致状态。最终一致性通常通过版本控制、向量时钟等机制来实现。
-
因果一致性(Causal Consistency): 因果一致性模型关注事件之间的因果关系,确保具有因果关系的事件在所有节点上的观察顺序保持一致。这种模型适用于一些需要保证因果关系的应用场景。
负载均衡与容错性
负载均衡(Load Balancing)是分布式系统中的一项关键技术,用于在多个服务器或节点之间分配和管理工作负载,以确保资源利用均衡,提高系统性能和可扩展性。负载均衡的主要目标是避免某些节点过载,同时保证所有节点都能够有效地参与工作。
-
轮询法(Round Robin): 请求按照顺序分配给每个服务器,确保每台服务器都有机会处理请求。
-
最小连接数法(Least Connections): 请求被分配给当前连接数最少的服务器,以确保已有连接的服务器不会被过度负载。
-
最短响应时间法(Least Response Time): 请求被分配给响应时间最短的服务器,以提供更快的响应速度。
-
基于权重的负载均衡(Weighted Load Balancing): 为每台服务器分配权重,根据权重比例来分配请求,适用于服务器性能不均衡的情况。
-
基于内容的负载均衡(Content-Based Load Balancing): 根据请求的内容或特征来选择合适的服务器进行处理,适用于特定类型的请求分发。
容错性(Fault Tolerance)是分布式系统中的另一个重要概念,指系统在面对节点故障、网络故障或其他异常情况时,仍能保持部分或全部功能的可用性和正确性。
-
冗余备份(Redundancy): 在系统中使用冗余组件或节点,以便在一个节点失效时,其他节点能够继续提供服务。这可以通过备份服务器、数据冗余存储等方式实现。
-
故障检测与自动恢复(Fault Detection and Automatic Recovery): 引入机制来监测节点故障,一旦故障发生,系统可以自动地进行恢复操作,例如重启服务、切换到备用节点等。
-
分布式一致性协议(Distributed Consensus Protocols): 使用协议如Paxos、Raft等来确保分布式系统中各节点之间的一致性,即使部分节点发生故障也能保持数据的一致性。
-
故障隔离(Fault Isolation): 确保一个节点或组件的故障不会影响到整个系统,通过隔离机制限制故障的扩散范围。
-
自适应性与动态重配置(Adaptability and Dynamic Reconfiguration): 系统能够根据当前的故障情况自动调整配置,以适应不同程度的故障或负载。
综上所述,负载均衡和容错性都是构建稳定、高性能分布式系统的关键要素。负载均衡确保资源合理分配,提高系统性能和可扩展性;容错性确保系统能够在故障情况下继续提供服务,保障系统的可用性和稳定性。在设计分布式系统时,需要综合考虑这两个方面的需求。
常见的分布式架构模式
客户端-服务器架构
客户端-服务器架构是一种常见的分布式系统架构,它基于客户端与服务器之间的相互协作,用于实现资源共享、数据交换以及服务提供等功能。在这种架构中,系统被拆分为两个主要组件:客户端和服务器。
客户端: 客户端是指用户或应用程序使用的界面或工具,用于与服务器进行通信并请求所需的服务或数据。客户端通常具有以下特点:
-
用户接口: 客户端提供了用户与系统交互的界面,可以是图形界面、命令行界面或移动应用界面,使用户能够方便地使用系统功能。
-
请求生成: 客户端生成请求,将请求发送给服务器以获取特定的数据或执行特定的操作。请求可以是诸如获取文件、提交表单、查询数据库等。
-
数据呈现: 客户端负责将从服务器获取的数据以用户可以理解的方式呈现,通常通过界面展示给用户。
服务器: 服务器是一个中央化的实体,负责处理客户端发送的请求并提供相应的服务。服务器通常具有以下特点:
-
请求处理: 服务器接收来自不同客户端的请求,根据请求的类型和内容,执行相应的操作。这可能涉及处理业务逻辑、访问数据库、计算等。
-
资源管理: 服务器负责管理系统的资源,包括存储、计算资源等,以满足客户端的请求。
-
数据存储: 服务器可能持有系统所需的数据,客户端可以通过请求来访问和操作这些数据。
-
响应生成: 服务器生成响应,将所请求的数据或执行的操作结果发送回客户端,以便客户端进行相应的展示或后续操作。
客户端-服务器架构的优点在于明确的职责划分和集中化的资源管理,使系统可以更好地维护、扩展和管理。然而,这种架构也可能存在单点故障和性能瓶颈的问题,需要根据实际需求进行设计和优化。
微服务架构
微服务架构是一种软件架构模式,它通过将应用程序拆分为小型、自治的服务来构建复杂的系统。每个微服务都专注于一个特定的业务功能,并且可以独立开发、部署和扩展。
-
服务拆分: 应用程序被拆分成多个独立的微服务,每个微服务负责一个明确定义的业务功能。这种拆分使得不同团队可以独立开发和维护各自的微服务,从而提高开发速度和灵活性。
-
自治性: 每个微服务都是自治的,意味着它可以有自己的数据库、业务逻辑和接口。这样的设计使得微服务可以独立部署和扩展,而不会影响其他微服务的正常运行。
-
通信机制: 微服务之间通过轻量级的通信机制进行交互,常用的通信方式包括 RESTful API、消息队列等。这种松耦合的通信方式使得系统更加灵活,并支持异步处理。
-
独立部署: 每个微服务可以独立进行部署,这意味着团队可以根据需要频繁地发布更新,而不会影响整个系统。
-
多语言支持: 微服务架构允许使用不同的编程语言和技术栈来实现不同的微服务,从而选择最适合特定任务的工具。
-
弹性和扩展性: 由于每个微服务都可以独立扩展,系统可以更好地应对变化的负载需求,提高了整体的弹性。
-
监控和治理: 由于系统由多个微服务组成,需要有效的监控和治理机制来确保各个微服务的正常运行和性能优化。
-
复杂性管理: 虽然微服务架构提供了灵活性,但也引入了一定的复杂性,包括分布式系统的挑战、服务发现、容错处理等问题。
微服务架构通过将复杂的应用拆分为小而自治的部分,提供了更高的灵活性、可维护性和扩展性。然而,采用微服务架构也需要权衡各种因素,包括团队的技术水平、系统的复杂性和管理成本等。
事件驱动架构
事件驱动架构是一种软件架构模式,它通过在系统中各个组件之间发送和接收事件来实现协同工作和信息传递。在事件驱动架构中,系统的各个部分通过事件进行通信,从而实现解耦、灵活性和可扩展性。
-
事件: 事件是系统内部或外部发生的事情,它可以是状态变化、用户操作、数据更新等。事件可以是一个简单的数据结构,包含有关事件本身和相关数据的信息。
-
发布-订阅模式: 在事件驱动架构中,常用的通信模式之一是发布-订阅模式。在这种模式下,组件可以发布事件,而其他组件可以订阅对特定事件的通知。这样,当事件发生时,订阅者将收到通知并可以采取相应的行动。
-
解耦和灵活性: 通过使用事件驱动架构,系统的各个组件可以相互解耦。这意味着一个组件的变化不会直接影响到其他组件,从而提高了系统的灵活性。新增、修改或删除某个组件时,只需要调整事件的发布和订阅关系,而不需要修改其他组件的代码。
-
松散耦合: 事件驱动架构促进了松散耦合,使得系统更容易维护和扩展。不同的组件可以独立开发、测试和部署,只要它们遵循共同的事件协议即可。
-
实时性和异步性: 事件驱动架构通常支持实时性和异步性。事件可以立即传播,也可以在需要时进行排队和处理。这对于处理大量事件和实现高性能系统至关重要。
-
事件处理器: 在事件驱动架构中,事件处理器负责接收、解析和处理事件。事件处理器可以根据事件的类型和内容执行不同的操作,如触发业务逻辑、更新数据库等。
-
事件网关: 事件网关是事件驱动架构中的重要组件,它负责管理事件的发布、订阅和路由。事件网关确保事件被正确地传递给相关的组件。
事件驱动架构是一种强大的架构模式,适用于需要解耦、可扩展和灵活的系统。它可以帮助构建具有高度响应性和适应性的应用程序,适用于各种领域,包括分布式系统、微服务架构、物联网等。
成功的分布式架构案例
Amazon Web Services (AWS)
亚马逊云服务(AWS)是一个广泛使用的云计算平台,通过提供多个不同的基础设施和应用程序服务,帮助用户在云上建立和管理他们的IT资源。
从分布式架构的角度来看,AWS采用了大规模、分散式的数据中心网络,以满足全球范围内用户的需求。它通过将计算、存储和数据库等服务分布到多个地理区域和可用区,实现高可用性和容错性。
在AWS架构中,用户可以利用弹性计算云服务(EC2)来创建虚拟机实例,并根据需要进行实例的扩展和缩减。此外,AWS还提供了一系列存储选项,如简单存储服务(S3),提供可靠、持久的对象存储,以及弹性块存储(EBS),提供持久块级别存储。
AWS还提供了无服务器计算服务(Lambda),使开发人员可以在云中运行代码片段,而无需维护完整的服务器。此外,AWS还提供了各种数据库选择,如关系型数据库服务(RDS)和高度可扩展的NoSQL数据库服务(DynamoDB)等。
通过使用这些服务,用户可以轻松构建和部署分布式应用程序,而无需关注硬件和基础架构的细节。AWS还提供了管理工具和服务,如自动化扩展组、负载均衡器和容器服务等,以帮助用户更好地管理和监控他们的应用程序。
从分布式架构的角度来看,AWS为用户提供了一个可靠、高性能的云平台,可以满足不同规模和类型的应用程序的要求,并通过具有弹性和可伸缩性的服务,使用户能够灵活使用计算和存储资源,以满足业务需求。
Google Cloud Platform (GCP)
GCP是一个提供云计算服务的平台,它基于全球范围的分布式架构设计。首先,GCP通过在多个地理位置建立数据中心来提供分布式计算能力。这些数据中心分布在不同的大陆和国家,让用户可以就近访问服务,并减少延迟。
GCP采用虚拟化技术,将物理资源抽象为虚拟资源,以便客户能够根据实际需求动态分配和调整资源。这种虚拟化技术使得计算、存储和网络服务都能够以弹性和可伸缩的方式进行扩展,满足不同规模和负载的应用需求。
GCP提供了一系列分布式服务和工具,帮助开发者构建和管理跨多个地理区域的应用程序。例如,GCP提供了谷歌全球负载均衡(Global Load Balancing)服务,可以将传入流量智能地分发到全球各地的数据中心,以实现高可靠和高性能的应用交付。
GCP还提供了跨数据中心复制和备份功能,确保数据的容灾和可靠性。开发者可以使用GCP的分布式对象存储服务(Cloud Storage)来存储大规模、持久性和可扩展的数据。
Google Cloud Platform (GCP)基于分布式架构设计和技术,为用户提供灵活、高性能和可靠的云计算服务,帮助他们构建和管理跨多地理区域的应用程序。
微软 Azure 6.4 Facebook的分布式数据存储
微软 Azure 6.4和Facebook都是使用分布式架构的系统,并且它们都采用了分布式数据存储来处理大规模的数据。
在分布式架构中,数据存储通常将数据分散存储在多个节点上,以实现高可用性、容错性和扩展性。这种存储方式可以有效减少单点故障和瓶颈,并提供良好的性能和可伸缩性。
对于微软 Azure 6.4,它是微软的云计算平台,提供了一种基于云的分布式架构解决方案。Azure 6.4采用了Azure Cosmos DB来实现其分布式数据存储。Azure Cosmos DB是一个全球分布式数据库服务,它使用多个副本存储数据,并通过自动重复与负载平衡来实现高可用性和性能。
Facebook也是一个使用分布式架构的社交媒体平台,它使用了分布式存储来处理海量用户生成的数据。Facebook的分布式数据存储系统主要依赖于Apache HBase和Apache Cassandra等开源技术。这些技术允许Facebook将数据分片和复制到多个服务器上,以实现高可用性和性能。
总结起来,微软 Azure 6.4和Facebook的分布式数据存储系统都采用了多副本、分片和复制等技术,以实现高可用性、容错性和扩展性。这些系统的设计目标是能够处理大规模的数据,并保证在面对故障或负载增加时系统能正常工作。
相关文章:

深入理解分布式架构,构建高效可靠系统的关键
深入探讨分布式架构的核心概念、优势、挑战以及构建过程中的关键考虑因素。 引言什么是分布式架构?分布式架构的重要性 分布式系统的核心概念节点和通信数据分区与复制一致性与一致性模型负载均衡与容错性 常见的分布式架构模式客户端-服务器架构微服务架构事件驱动…...

为什么选择elasticsearch分布式搜索引擎
文章目录 🔭什么是elasticsearch🌠ELK技术栈🌠elasticsearch和lucene🌠为什么不是其他搜索技术? 🔭总结 🔭什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎,具备非常…...

一百五十九、Kettle——Kettle9.2通过配置Hadoop clusters连接Hadoop3.1.3(踩坑亲测、附流程截图)
一、目的 由于kettle的任务需要用到Hadoop(HDFS),所以就要连接Hadoop服务。 之前使用的是kettle9.3,由于在kettle新官网以及博客百度等渠道实在找不到shims的驱动包,无奈换成了kettle9.2,kettle9.2的安装…...

渗透测试之逻辑漏洞
文章目录 一、支付漏洞1.修改附属值2.多重替换支付3.重复支付4.最小额支付5.最大值支付6.越权支付7.无限制试用8.多线程并发9.支付漏洞思路 二、密码找回漏洞1.本地验证绕过2.利用session重新绑定客户3.去掉验证参数绕过4.总结 三、短信验证码绕过1.短信验证码生命期限内可暴力…...
HTML class 中 CSS名称的顺序并不重要
的确是这样!我可以证明。让我们先来看一些CSS代码: .a {color: red; }.b {color: blue; }现在让我们看一些标记: <div class"a b">Here’s some text</div>文本会是蓝色的,因为.b 在CSS中是最后定义的,对吧ÿ…...
设计模式8:代理模式-静态代理
我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。 本文目录 静态代理的实例1. 售票代理2. 明星代理 静态代理的实例 1. 售票代理 售票服务 public interface TicketService {…...

运动耳机哪款好用、适合运动的耳机推荐
如今,蓝牙耳机不仅是手机的最佳伴侣,也成为了运动爱好者的必备装备。但是,在如此众多的蓝牙耳机中,你是否对选购感到困惑呢?实际上,选择适合运动的蓝牙耳机需要考虑许多因素,如舒适度、稳固性、…...

页面滑动到可视区域加载更多内容思维流程
页面滑动到可视区域加载更多内容思维流程...
Java Word转PDF(直接转和以图片形式转)、PDF转图片、图片转PDF
在淘宝上找了一家写代码的店铺写了一个工具类,再参考网上的代码,改了改 用到的类库: <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox --><!--word转pdf--><dependency><groupId>com.documents4…...

dockerfile编写LNMP
目录 1. 项目环境 2. 服务器环境 二、部署nginx(容器IP为192.168.158.26) 1、整个Dockerfile文件内容 编辑 2、配置nginx.conf文件 3、构建镜像 三、部署mysql 1、整个Docker文件内容 3、生成镜像 4、启动镜像容器 5、验证mysql 四、PHP部署 1…...

websocket + stomp + sockjs学习
文章目录 学习链接后台代码引入依赖application.ymlWebSocketConfigPrivateControllerWebSocketService WebSocketEventListenerCorsFilter 前端代码Room.vue 学习链接 WebSocket入门教程示例代码,代码地址已fork至本地gitee,原github代码地址ÿ…...
ApplicationListener , @EventListener 和 CommandLineRunner 启动顺序验证
一. 背景 排查线上问题, 发现一个重要功能的全局锁线程启动延迟很高. 服务启动40分钟之后, 才能拿到锁. 排查之后发现原因是因为代码引入了高优先级的ApplicationListener代码, 导致全局锁线程启动延迟. 二. 结论 启动顺序从高到底依次为: ApplicationListener , EventListe…...

网络编程基础(1)
目录 网络编程解决是跨主机的进程间通讯 1、网络 2、互联网 3、ip地址 (1)ipv4: (2)ipV6:1 (3)IP地址的组成: (4)Linux查看IP地址:ifconfig 4、mac地址 5、ping Ip地址 6…...

Linux驱动开发(Day4)
思维导图: 字符设备驱动分步注册:...

LVS负载均衡群集部署(LVS-NAT模型实例)
一、集群 1.1集群的含义 Cluster,集群、群集,为解决某个特定问题将多台计算机组合起来形成的单个系统。 由多台主机构成,但对外只表现为一个整体。 1.2群集的三种类型 1.2.1负载均衡群集 LB: Load Balancing,负载均衡&#x…...

【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进
访问html页面 如果我们想访问html页面其实就是将本地的html文件以流的方式响应给前端即可,下面我们对HttpResponseServlet这个类做一些改造 package com.tomcatServer.domain;import com.tomcatServer.utils.ScanUtil;import java.io.IOException; import java.io…...

stm32单片机/51单片机蜂鸣器不响(proteus模拟)
蜂鸣器不发生原因就1个:电压不够 所以需要提高蜂鸣器2端的电压:可以采用的方法有: 1提高蜂鸣器电阻,这样根据分压原理,可以提升蜂鸣器2段电压 2更改蜂鸣器的工作电压为更小的值,这个可以通过在proteus内…...

BERT、ERNIE、Grover、XLNet、GPT、MASS、UniLM、ELECTRA、RoBERTa、T5、C4
BERT、ERNIE、Grover、XLNet、GPT、MASS、UniLM、ELECTRA、RoBERTa、T5、C4 ELMOBERTERNIEGroverXLNetGPTMASSUniLMELECTRARoBERTaT5C4ELMO BERT...

主机防护的重要性和方式
01 主机防护的重要性 主机防护是网络安全的重要组成部分。在互联网时代,网络攻击成为了一种常见的威胁,而主机防护则是保护计算机系统免受网络攻击的重要手段。 主机防护可以防范各种网络攻击,如病毒、木马、黑客攻击等,从而保…...

聚观早报 | 抢先体验阿维塔11座舱;本田和讴歌采用NACS充电标准
【聚观365】8月21日消息 抢先体验阿维塔11鸿蒙座舱 本田和讴歌采用特斯拉NACS充电标准 华为秋季新品发布会将于9月12日举行 iQOO Z8即将到来 三星Galaxy S24系列外观或更改 抢先体验阿维塔11鸿蒙座舱 当前,智能座舱成了各大巨头跑马圈地的重要领域。根据毕马威…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...