【云原生】服务网格(Istio)如何简化微服务通信

🐇明明跟你说过:个人主页
🏅个人专栏:《未来已来:云原生之旅》🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、微服务架构的兴起
2、Istio:服务网格的佼佼者
二、服务网格的基本原理
1、服务网格的定义
2、代理模式与数据平面
3、控制平面与API
三、Istio简介
1、Istio的核心组件
1.1 Envoy代理
1.2 Pilot
2、Istio的功能特性
2.1 流量管理
2.2 安全性
四、Istio如何简化微服务通信
1、流量路由与负载均衡
2、服务发现与弹性伸缩
3、安全通信与身份验证
一、引言
1、微服务架构的兴起
微服务架构近年来迅速兴起,成为现代软件开发的重要趋势。其主要推动力包括业务需求的复杂性增加、敏捷开发和持续交付的需求,以及云计算和容器技术的发展。
微服务架构的定义
微服务架构是一种软件架构风格,将应用程序拆分为一组小的、独立部署的服务。每个服务运行在自己的进程中,并通过轻量级的通信机制(通常是 HTTP/REST)进行交互。每个微服务围绕某个业务能力构建,并可以独立部署和扩展。
微服务架构的兴起原因
1. 业务复杂性和灵活性:
- 随着业务需求的不断变化和复杂性增加,单体架构难以适应快速的变化。
- 微服务架构允许开发团队围绕具体的业务能力构建服务,使得每个团队可以独立工作,快速响应业务需求的变化。
2. 敏捷开发和持续交付:
- 微服务架构支持敏捷开发方法,使得开发、测试和部署更加频繁和快速。
- 各个微服务可以独立部署,不会影响整个系统的稳定性,有助于实现持续集成和持续交付(CI/CD)。
3. 技术异构性和多样性:
- 微服务架构允许不同的服务使用不同的技术栈和编程语言,这使得团队可以选择最适合具体需求的技术。
- 各个服务可以独立演化和升级,而不会影响其他服务。
4. 云计算和容器技术:
- 云计算提供了弹性扩展的基础设施,微服务架构可以充分利用云计算的优势,实现按需扩展。
- 容器技术(如 Docker 和 Kubernetes)简化了微服务的部署、管理和扩展,提高了开发和运维的效率。
5. 可伸缩性和可靠性:
- 微服务架构允许各个服务独立伸缩,满足高并发和大流量的需求。
- 通过服务隔离,即使某个服务出现故障,也不会影响整个系统的可用性,从而提高系统的可靠性。

2、Istio:服务网格的佼佼者
Istio 是一个开源的服务网格解决方案,被认为是服务网格领域的佼佼者。它提供了一套完整的功能集,用于管理微服务应用的网络流量、安全、可观测性和弹性。以下是关于 Istio 的详细介绍。
什么是 Istio?
Istio 是一个独立于平台的服务网格,旨在通过透明的网络代理,简化和统一微服务之间的通信。Istio 的核心组件包括:
- Envoy 代理:一个高性能的代理,作为边车(sidecar)容器部署在每个服务实例旁边,拦截进出服务的所有网络流量。
- 控制平面:负责管理和配置 Envoy 代理,控制平面主要包括以下几个组件:
- Pilot:服务发现和配置管理。
- Mixer:策略和遥测数据收集。
- Citadel:提供服务到服务的认证和密钥管理。

二、服务网格的基本原理
1、服务网格的定义
服务网格是一个用来管理和优化微服务之间通信的工具,就像一个聪明的交通警察,确保每辆车(微服务)在路上(网络)安全、高效地行驶。
为什么需要服务网格?
想象一下你有一个大型购物中心,每个商店都是一个微服务。这些商店需要互相沟通,比如顾客在支付时,支付服务需要联系库存服务来确认商品是否有货。随着商店(微服务)的数量增加,管理这些通信变得越来越复杂。服务网格就是为了解决这个问题而诞生的。
服务网格做了什么?
1. 流量管理:
- 负载均衡:就像在繁忙的购物中心,顾客不会都挤在一家店里,而是被引导到有空位的店铺,确保每个店铺都能高效服务。
- 流量路由:如果商店有新产品上线,会先在部分店铺进行测试,服务网格可以控制这些测试产品的流量。
2. 安全性:
- 身份验证和授权:确保只有授权的服务才能互相通信,就像只有持有有效通行证的人才能进入特定区域。
- 数据加密:所有的通信都是加密的,防止数据在传输过程中被窃取或篡改。
3. 可观测性:
- 分布式追踪:跟踪每个请求的路径,就像在购物中心的每个角落都装有监控摄像头,可以看到顾客从进入到离开的全过程。
- 日志记录和指标监控:记录所有活动并生成报告,帮助你了解哪个店铺(服务)工作正常,哪个店铺需要改进。
4. 弹性和容错:
- 重试和超时:如果一个店铺暂时无法响应,系统会重试或将请求转到其他店铺,确保顾客总能得到服务。
- 降级处理:如果某个店铺出现问题,系统会提供备选方案,确保购物中心整体正常运转。
服务网格的工作方式
服务网格由两个主要部分组成:
1. 数据平面:
- 边车代理:在每个微服务旁边部署一个小助手(边车),这个小助手负责处理所有进出微服务的流量,确保流量按规则执行。
2. 控制平面:
- 管理控制中心:类似于购物中心的管理办公室,负责制定和下达各种规则和策略,并收集所有店铺的运行数据。
简单例子
假设你有一个在线购物网站,有三个微服务:用户服务、订单服务和支付服务。用户服务接收用户请求并传递给订单服务,订单服务处理订单后通知支付服务进行支付。
在没有服务网格的情况下,如果订单服务遇到问题,你可能需要手动调试代码、查看日志,甚至联系开发团队。而有了服务网格,系统会自动记录每个请求的详细信息,帮助你快速定位问题,并自动提供备用方案,确保用户体验不受影响。
服务网格就像一个聪明的交通警察,帮助微服务高效、安全地通信。它自动处理复杂的通信问题,提供全面的监控和管理,让开发和运维人员可以更加专注于业务逻辑,而不是纠结于网络问题。

2、代理模式与数据平面
服务网格的基本原理主要依赖于代理模式和数据平面这两个核心概念。
代理模式(Proxy Pattern)
代理模式是一种设计模式,它通过代理(代理服务器)来控制访问某个对象。在服务网格中,每个微服务旁边都会有一个代理,这个代理负责处理所有进出该微服务的流量。
举个例子:
想象一下你是一位大公司总裁,你的办公室门口有一个秘书。任何人想见你,都必须先经过秘书。秘书会决定是否让这个人进来、什么时候进来、以及是否需要告诉你某些重要的信息。秘书就是你的代理。
在服务网格中,这个秘书代理被称为边车代理(sidecar proxy)。每个微服务(相当于总裁)都有自己的边车代理(秘书),处理所有的网络流量。
数据平面(Data Plane)
数据平面是由所有这些边车代理组成的网络层,它负责处理服务之间的所有通信流量。
举个例子:
想象一下在一个大型购物中心里,每家店(微服务)门口都有一个保安(边车代理)。所有的顾客(请求)必须先经过保安的检查(代理处理),才能进入商店。这些保安组成了一个安全网络层(数据平面),确保整个购物中心的安全和秩序。

服务网格的工作原理
1. 流量管理:
- 代理模式:每个微服务的边车代理会拦截所有进出的流量,按照预定义的规则进行处理,比如负载均衡、重试和限流等。
- 数据平面:所有边车代理共同工作,确保流量在微服务之间高效、安全地传递。
2. 安全性:
- 代理模式:边车代理负责加密和解密通信数据,进行身份验证和授权,确保只有合法的服务可以通信。
- 数据平面:通过所有代理的协同工作,提供统一的安全策略,防止数据泄露和未经授权的访问。
3. 可观测性:
- 代理模式:边车代理会记录所有通信数据,包括请求的详细信息和响应时间,提供可观测性。
- 数据平面:所有代理的数据汇集在一起,形成一张完整的通信监控图,帮助运维人员了解系统的运行状态。
4. 弹性和容错:
- 代理模式:边车代理可以配置重试策略和超时设置,确保请求在遇到问题时能够自动重试或快速失败。
- 数据平面:所有代理共同实现请求的重试、故障切换和降级处理,保证系统的高可用性。
服务网格通过代理模式和数据平面来管理和优化微服务之间的通信:
- 代理模式:在每个微服务旁边部署一个边车代理,负责处理所有流量。
- 数据平面:所有边车代理组成一个统一的网络层,协同工作处理服务间的通信。
3、控制平面与API
服务网格的另一个重要部分是控制平面,它与数据平面一起协同工作,使服务网格具备强大的功能和灵活性。
控制平面(Control Plane)
控制平面是服务网格的“大脑”,负责管理和配置整个服务网格的行为。它为数据平面提供规则和策略,监控服务网格的运行状态,并进行动态调整。
举个例子:
想象一个大型购物中心,控制平面就像购物中心的管理办公室。管理办公室制定购物中心的规则,如安全检查、营业时间、促销活动等,并通过广播或保安(代理)将这些规则传达给各个商店(微服务)。
控制平面的主要功能:
1. 配置管理:
- 控制平面负责将配置和策略分发到各个边车代理。这些配置包括负载均衡策略、限流规则、重试机制等。
- 例子:如果购物中心要改变营业时间,管理办公室会通知所有保安,确保他们在新的时间点开关门。
2. 服务发现:
- 控制平面维护服务注册表,记录所有微服务的可用实例和地址。当某个微服务需要与另一个微服务通信时,控制平面会告诉它如何找到对方。
- 例子:购物中心的管理办公室有一本所有商店的详细目录,任何店铺想联系其他店铺,可以向管理办公室查询。
3. 安全策略:
- 控制平面定义安全策略,如身份验证、授权和加密,确保只有经过授权的服务才能通信,并且通信内容是加密的。
- 例子:管理办公室为购物中心制定安全检查规则,确保只有持有有效通行证的人能进入某些特定区域。
4. 监控和日志:
- 控制平面收集所有边车代理的运行数据,包括流量统计、错误日志和性能指标,帮助运维人员监控系统健康状况。
- 例子:管理办公室通过监控摄像头和日志记录,了解每家店铺的运营情况,及时发现和解决问题。

API(应用程序接口)
API是服务网格与外部系统(如开发人员、运维工具)交互的接口。控制平面通常提供一组API,用于管理和监控服务网格。
API的主要作用:
1. 配置和管理:
- 开发人员和运维人员可以通过API向控制平面提交配置和策略,控制平面再将这些策略分发到数据平面。
- 例子:购物中心的管理办公室提供一个电话热线(API),商店经理可以通过电话提交新的规则和要求。
2. 监控和诊断:
- 运维人员可以通过API查询服务网格的运行状态、监控数据和日志,进行故障诊断和性能优化。
- 例子:商店经理可以通过电话(API)向管理办公室查询当天的客流量和销售数据,了解运营情况。

三、Istio简介
1、Istio的核心组件
1.1 Envoy代理
什么是 Envoy 代理?
Envoy 代理是一个高性能的、由 Lyft 开发的开源边车代理,负责处理微服务之间的所有网络流量。它被设计成轻量级和高效的代理,适用于各种规模的微服务架构。
举个例子:
想象你在一个大型快递公司工作,每个包裹(网络请求)在被递送到目的地(微服务)之前,都会经过一个快递站(Envoy 代理)。快递站负责检查、记录并确保包裹按照最佳路径安全送达。
Envoy 代理的主要功能:
1. 流量管理:
- 负载均衡:Envoy 可以根据预定义的策略,将请求分配到多个服务实例,确保负载均衡。
- 流量路由:它能够基于请求的内容(如路径、头部信息)将流量路由到不同的服务。
- 举个例子:快递站决定每个包裹(请求)应该送到哪个分站(服务实例),以防某个分站过载。
2. 服务发现:
- Envoy 与服务发现系统集成,能够动态更新服务实例的地址,确保请求总能找到可用的服务。
- 举个例子:快递站实时获取各个分站的最新地址,确保包裹能够被正确递送。
3. 安全性:
- Envoy 提供 mTLS(双向传输层安全协议)加密,确保服务之间的通信是安全的。
- 举个例子:快递站对每个包裹进行扫描和加密,确保在运输过程中包裹不会被篡改。
4. 可观测性:
- Envoy 收集和报告详细的指标、日志和追踪信息,帮助运维人员监控和调试系统。
- 举个例子:快递站记录每个包裹的运输路径、时间和状态,便于追踪和查询。
5. 故障恢复:
- Envoy 提供重试机制、超时设置和熔断器,确保在某个服务不可用时,系统仍能保持稳定。
- 举个例子:如果某个分站无法接受包裹,快递站会自动重试或将包裹发送到其他可用的分站。
Envoy 在 Istio 中的角色
在 Istio 中,Envoy 被部署为每个服务实例的边车代理(Sidecar Proxy),即每个微服务旁边都有一个 Envoy 实例,处理所有进出的流量。这种方式有以下好处:
1. 透明拦截:
- 微服务不需要修改代码,所有的网络流量自动通过 Envoy 代理处理。
- 例子:所有包裹在运输过程中自动经过快递站,无需特别通知各个分站。
2. 集中管理:
- Istio 的控制平面(如 Pilot)集中管理和配置所有 Envoy 代理,实现统一的流量管理和安全策略。
- 例子:快递公司的总部(Istio 控制平面)统一管理和配置各个快递站(Envoy 代理)的操作规则。
3. 增强功能:
- Envoy 提供的丰富功能,如负载均衡、服务发现和安全性,使得 Istio 能够高效地管理微服务间的通信。
- 例子:快递站不仅能路由包裹,还能提供加密、监控和重试等额外服务,确保快递过程高效安全。
1.2 Pilot
什么是 Pilot?
Pilot 是 Istio 的控制平面组件之一,它负责管理和配置数据平面的 Envoy 代理。它通过将服务发现信息和流量管理策略分发给 Envoy 代理,确保微服务之间的通信是高效且安全的。
举个例子: 想象你在一个大型物流公司工作,每个分站(微服务)都有一个调度员(Envoy 代理),负责处理包裹(请求)的转发和管理。而总部的调度中心(Pilot)负责将所有分站的信息和操作规则传达给各个调度员,确保整个物流网络高效运行。
Pilot 在 Istio 中的角色
在 Istio 架构中,Pilot 扮演着中央控制器的角色,负责从服务发现系统获取服务信息,并将流量管理和安全策略分发给 Envoy 代理。

2、Istio的功能特性
2.1 流量管理
Istio 是一个功能强大的服务网格平台,提供了一系列工具来管理微服务之间的流量。这些工具不仅提高了系统的灵活性,还增强了其可靠性和可观测性。
1. 流量路由(Traffic Routing)
Istio 允许用户通过丰富的规则和策略来控制微服务之间的流量路径。这些规则和策略包括:
- 流量分割(Traffic Splitting):将流量按比例分配到多个服务版本上。这对于 A/B 测试和金丝雀发布非常有用。
- 例子:你可以将 90% 的流量发送到旧版本的服务,将 10% 的流量发送到新版本,以逐步验证新版本的稳定性。
- 请求重试(Retries):在请求失败时自动重试,增加成功的概率。
- 例子:如果一个请求由于临时的网络问题失败,Istio 可以自动重试该请求,以提高请求成功的几率。
- 超时设置(Timeouts):设置请求的最大等待时间,防止请求无限期地等待。
- 例子:如果一个请求超过了设定的 2 秒时间限制,Istio 会终止该请求并返回错误,以避免客户端长时间等待。
- 熔断器(Circuit Breakers):在服务异常时阻止更多的请求,防止连锁故障。
- 例子:如果某个服务的错误率过高,熔断器可以暂时停止发送请求给该服务,从而保护其他服务免受影响。

2. 流量镜像(Traffic Mirroring)
流量镜像允许你将生产环境的流量复制一份到新版本的服务进行测试,而不会影响实际的生产流量。这对于测试新版本的服务在真实流量下的表现非常有帮助。
- 例子:你可以将实际用户请求的流量复制一份发送到新版本的服务,监控新版本在真实流量下的表现,同时确保用户的请求仍然由稳定的旧版本服务处理。
3. 请求路由(Request Routing)
Istio 支持基于请求属性的路由规则,使得流量可以根据请求的内容(如 HTTP 头、路径、参数等)路由到不同的服务版本。
- 例子:你可以将所有包含特定用户标识的请求路由到某个服务版本,以便为这些用户提供定制化的服务。
4. 负载均衡(Load Balancing)
Istio 提供多种负载均衡策略,确保流量在服务实例之间均匀分布,以优化资源使用和响应时间。这些策略包括:
- 轮询(Round Robin):依次将请求分配到每个服务实例。
- 随机(Random):随机选择服务实例处理请求。
- 最少请求(Least Request):将请求分配到当前处理请求最少的服务实例。
- 例子:你可以选择轮询策略,确保每个服务实例依次接收请求,从而均衡负载。
5. 服务发现(Service Discovery)
Istio 通过与底层平台(如 Kubernetes)的集成,自动发现并管理服务实例。这使得流量管理规则能够动态适应服务实例的变化。
- 例子:当一个新的服务实例启动时,Istio 会自动将其添加到流量管理规则中,无需手动配置。
6. 请求故障注入(Fault Injection)
Istio 允许你注入故障(如延迟、错误响应等)到服务请求中,以测试系统的健壮性和故障恢复能力。
- 例子:你可以模拟一个服务的高延迟,观察系统的整体响应和恢复能力,以验证故障处理机制的有效性。
7. HTTP 重写和重定向(HTTP Rewrite and Redirect)
Istio 支持根据预定义规则重写或重定向 HTTP 请求路径和主机名。
- 例子:你可以将所有对旧 URL 结构的请求重定向到新的 URL 结构,确保 URL 重构对用户透明。

2.2 安全性
1. 身份验证(Authentication)
Istio 支持双向 TLS(mTLS)和 JWT(JSON Web Token)认证,确保服务之间和用户与服务之间的通信是安全的和经过认证的。
- 双向 TLS(mTLS):自动加密服务之间的通信,防止中间人攻击。双方服务都需要验证对方的身份,确保只有经过认证的服务可以通信。
- 例子:当服务 A 与服务 B 通信时,双方都需要验证对方的证书,确保通信是安全和可信的。
- JWT 认证:支持基于 JWT 的用户认证,确保用户请求是由经过认证的用户发出的。
- 例子:在用户请求访问某个服务时,Istio 会验证请求中的 JWT 令牌,以确保用户的身份是合法的。
2. 授权(Authorization)
Istio 提供细粒度的访问控制策略,可以基于多种属性(如服务、用户、路径、方法等)定义访问控制规则。
- 基于角色的访问控制(RBAC):根据用户或服务的角色定义访问权限,确保只有具备特定角色的用户或服务可以访问资源。
- 例子:你可以定义规则,只有管理员角色的用户才能访问某个敏感的服务或 API。
- 基于属性的访问控制(ABAC):基于请求的属性(如 HTTP 头、请求路径、方法等)定义更灵活的访问控制规则。
- 例子:你可以定义规则,只有特定 IP 地址范围内的请求才能访问某个服务。

四、Istio如何简化微服务通信
1、流量路由与负载均衡
- 动态配置:无需修改服务代码,通过 Istio 的配置即可动态调整流量路由和负载均衡策略。
- 精细控制:可以根据具体业务需求灵活定义路由规则和负载均衡策略,精确控制流量分配。
- 提高可靠性:通过重试、超时、故障注入等机制,提高服务的稳定性和可靠性。
- 简化部署:在不影响生产环境的情况下,通过流量镜像和拆分进行新版本的验证和灰度发布,降低发布风险。
- 提升性能:通过智能负载均衡优化资源利用,确保系统性能和响应时间。

2、服务发现与弹性伸缩
通过服务发现和弹性伸缩,Istio 显著简化了微服务通信的管理:
- 动态服务发现:无需手动管理服务实例,Istio 自动进行服务注册和注销,确保服务目录的准确性。
- 透明的服务调用:通过 DNS 服务发现机制,服务可以直接使用名称进行通信,避免手动配置 IP 地址。
- 自动扩展和缩减:根据实际负载动态调整服务实例数量,优化资源利用,确保服务性能和响应时间。
- 发布管理:通过金丝雀发布和蓝绿部署,降低新版本上线的风险,确保平稳过渡。
- 故障隔离:通过熔断器和速率限制机制,防止单点故障和过载问题,提高系统的稳定性和可靠性。

3、安全通信与身份验证
- 自动化配置:Istio 自动配置 mTLS 和证书管理,无需开发人员手动干预,大大简化了安全配置的复杂度。
- 透明加密:Istio 代理自动处理数据加密和解密,对应用代码透明,无需修改现有代码即可实现安全通信。
- 集中管理:通过 Citadel 实现证书的集中管理和轮换,确保证书始终有效和安全,降低证书管理的运维负担。
- 双重身份验证:结合 JWT 和 mTLS,实现多层次的身份验证,确保只有经过认证和授权的请求可以访问服务。
- 安全策略:Istio 支持定义和应用细粒度的安全策略(如访问控制、流量加密策略),提高系统的安全性和灵活性。
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于云原生的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!
相关文章:
【云原生】服务网格(Istio)如何简化微服务通信
🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、微服务架构的兴起 2、Istio:服务网格的佼…...
spring boot 整合 sentinel
注意版本问题 我这是jdk11 、spring boot 2.7.15 、 alibaba-sentinel 2.1.2.RELEASE <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><…...
蜜雪冰城小程序逆向
app和小程序算法一样 小程序是wasm...
pbootcms提交留言成功后跳转到指定的网址
pbootcms在线留言表单提交成功后,如何跳转到指定的网址,默认提交留言后留在原来的页面,如果提交后需要跳转到指定网址,我们需要对文件进行修改。首先我们打开/core-/function/helper.php文件找到第162行左右代码: ech…...
16、matlab求导、求偏导、求定积分、不定积分、数值积分和数值二重积分
0)前言 在MATLAB中,对函数进行不同形式的求导、求积分操作是非常常见的需求,在工程、科学等领域中经常会用到。以下是关于求导、求积分以及数值积分的简介: 求导:在MATLAB中可以使用diff函数对函数进行求导操作。diff…...
MySQL 9.0创新版发布!功能又进化了!
作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…...
后端系统的安全性
后端系统的安全性 后端系统的安全性是任何Web应用或服务的核心组成部分,它涉及保护数据、用户隐私以及系统免受恶意攻击。以下是后端安全的一些关键点: 认证和授权:确保只有经过身份验证的用户才能访问特定资源。这通常包括使用用户名/密码…...
.net 百度翻译接口核心类
百度翻译api :http://developer.baidu.com/wiki/index.php?title帮助文档首页/百度翻译/翻译AP 核心翻译类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json; using System.Net; using System.I…...
安卓应用开发学习:通过腾讯地图SDK实现定位功能
一、引言 这几天有些忙,耽误了写日志,但我的学习始终没有落下,有空我就会研究《 Android App 开发进阶与项目实战》一书中定位导航方面的内容。在我的手机上先后实现了“获取经纬度及地理位置描述信息”和“获取导航卫星信息”功能后&#x…...
iptable精讲
SNAT策略 SNAT策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet SNAT策略的原理 源地址转换,Source Network Address Translantion 修改数据包的源地址 部署SNAT策略 1.准备二台最小化虚拟机修改主机名 主机名:gw 主机名࿱…...
2024 年如何构建 AI 软件
人工智能 (AI) 是当今 IT 行业最热门的话题,受到大型科技公司、大型企业和投资者的青睐。如果有人不参与 AI,他们就出局了。虽然“AI 泡沫”一词尚未公开使用,但街上的每个人都可能听说过 AI 将取代我们的工作(可能不会࿰…...
Python实战,桌面小游戏,剪刀石头布
注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python项目开发实战_桌面小游戏-剪刀石头布_编程案例解析实例详解课程教程.pdf 创建一个基于Python的桌面小游戏“剪刀石头布”是一个很好的编程实践…...
Hadoop权威指南-读书笔记-01-初识Hadoop
Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 第一章—初识Hadoop Tips: 这个引例很有哲理嘻嘻😄,道出了分布式的灵魂。 1.1 数据!数据! 这一小节主要介绍了进入大数据时代,面…...
HttpServletResponse设置headers返回,发现headers中缺少“Content-Length“和“Content-Type“两个参数。
业务中需要将用httpUtils请求返回的headers全部返回,塞到HttpServletResponse中,代码如下: HttpServletResponse response;// 返回headers Arrays.stream(httpResponse.getHeaders()).forEach(header -> response.setHeader(header.getNa…...
GraphPad Prism生物医学数据分析软件下载安装 GraphPad Prism轻松绘制各种图表
Prism软件作为一款功能强大的生物医学数据分析与可视化工具,其绘图功能尤为突出。该软件不仅支持绘制基础的图表类型,如直观明了的柱状图、展示数据分布的散点图,以及描绘变化趋势的曲线图,更能应对复杂的数据呈现需求,…...
7/1 uart
uart4.c #include "uart4.h"//UART4_RX > PB2 //UART4_TX > PG11char rebuf[51] {0}; //rcc/gpio/uart4初始化 void hal_uart4_init() {/********RCC章节初始化*******///1.使能GPIOB组控制器 MP_AHB4ENSETR[1] 1RCC->MP_AHB4ENSETR | (0x1 << 1)…...
zdppy_api+vue3+antd开发前后端分离的预加载卡片实战案例
后端代码 import api import upload import timesave_dir "uploads"async def rand_content(request):key api.req.get_query(request, "key")time.sleep(0.3)return api.resp.success(f"{key} " * 100)app api.Api(routes[api.resp.get(&qu…...
别小看手机导航,这些隐藏功能大部分人可能都不知道
在科技日新月异的今天,手机导航已经成为我们日常生活中不可或缺的一部分。它不仅仅是指引我们前往目的地的工具,更隐藏着许多黑科技功能,极大地丰富了我们的出行体验。 今天,让我们一起探索手机导航中那些鲜为人知却大有用处的隐…...
Lua实现链表(面向对象应用)
Lua实现面向对象 面向对象核心三要素Lua面向对象大致原理面向对象示例继承与多态示例 面向对象核心三要素 1.封装:对一个事物的抽象为一些属性和行为动作的集合,封装将属性和行为动作(操作数据的方法)绑定在一起,并隐藏…...
每隔一个小时gc一次的问题
原文地址https://www.cnblogs.com/jiangxinlingdu/p/7581064.html 设置一下这个 -XX:ExplicitGCInvokesConcurrent 或 -XXExplicitGCInvokesConcurrentAndUnloadsClasses 并且检查一下,并下面的值设置变大 java.rmi.dgc.leaseValue sun.rmi.dgc.client.gcInterv…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
