服务网络基础
服务网络基础
目录
前言
从今天开始我们将进入服务网格的学习,服务网格是微服务架构中的一种重要的技术,它可以解决微服务架构中的一些问题,比如服务发现、服务治理、服务监控等等,我们将从服务网格的基础开始,逐步深入,希望能够帮助大家理解服务网格。
1、应用架构的演进
要了解服务网格,我们需要从应用架构的演进说起。应用架构的演进过程就需要从单体应用开始说起,单体应用的优缺点,以及为什么需要拆分应用,拆分应用的优缺点,以及拆分应用的方式,最后引出服务网格的概念。
1.单体应用
在软件开发早期阶段,大家都在一个应用系统上开发。各个业务模块之间耦合也比较紧密。软件发布也是整体发布,或者对软件进行打包发布和部署,比如 java 可以打包成 war 部署。测试也很容易,因为代码都在一起,基本不需要引用外部的关联服务。
在软件开发早期,这种软件开发模式能适应业务的发展,软件应用也可以正常运行。如果你的业务发展良好,客户需求会变得越来越多,软件功能数也会随着客户的需求变多而变多。为了实现这些功能,你必须添加很多代码。而随着业务进一步发展,代码量势必也会越增越多。有可能 2 到 3 年后,软件代码量会变得非常巨大。那时软件就会变成一个非常庞大且复杂的单体应用。软件里面的功能多,代码错综复杂。
此时可能出现的问题:
- 打包编译会耗时很久,导致发布也很耗时。
- 代码可维护性变差,因为代码量大,逻辑复杂,只有少数老员工能全部理解。代码质量难以保证,复用性差等,代码腐化严重。
- 修改 BUG 和增加新功能会变得困难,可能牵一发而动全身。
- 软件扩展变得困难
- 软件可用性风险增加。可能一个 BUG 导致整个软件不可用。
那么应该如何解决上面的这些问题呢,俗话说:大事化小 - 拆字诀。
第一步可能想到的就是拆分应用。把一个大型的单体应用按照业务功能进行拆分。比如电商应用,可能拆分为商品应用、订单应用、用户应用、商铺应用等等相对比较小的应用功能。
当随着业务规模进一步的发展,我们可能还要继续把上面的应用做进一步拆分,变成更小的应用,以服务的形式对外提供应用服务。应用慢慢的拆分为了比较小的服务 - 微服务。
2.微服务应用
这样应用就变成了微服务应用,每个微服务都是一个独立的应用,它们之间通过**网络(restful api或者grpc)**进行通信。那么微服务的具体定义是什么呢?
grpc:进程间通信协议。
- 维基百科定义:微服务 (Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic) 的 API 集相互通信。
- AWS 的定义:微服务是一种开发软件的架构和组织方法,其中软件由通过明确定义的 API 进行通信的小型独立服务组成。这些服务由各个小型独立团队负责。微服务架构使应用程序更易于扩展和更快地开发,从而加速创新并缩短新功能的上市时间。
- Thoughtworks 首席科学家的定义:微服务架构是一种架构模式,它提倡将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立进程中,服务与服务之间通常采用轻量级的通信机制相互沟通。每个服务都围绕具体的业务进行构建,并且能独立部署到生产环境中。
resilience n.回弹性;恢复力;
可观测性也是微服务里一个很重要的方面。
虽然不同的组织对微服务的定义不是完全一致的,但是它们的核心能力是一致的,即将单体应用拆分为多个小型服务,每个服务都是一个独立的应用,它们之间通过网络进行通信,每个微服务都有自己的代码库、数据库和运行环境。
那么在具体的实践中,使用微服务架构有哪些优势和劣势呢?
优势
- 应用小,可快速编译部署
- 单个微服务维护性变高,修改容易,因为每个团队独立负责一块功能。新功能交付变快,可以快速开发交付
- 扩展性变高,根据业务规模可以随时缩减/增加服务器规模
- 可靠性变强,可以部署很多独立的服务
- 业务解耦,按照业务边界拆分为多个独立的服务模块
- 提升研发效率,业务拆分后,服务模块变小,在一个团队内就可以独立编写、测试、发布,加快研发效率。
拆分后,单个微服务比较小,它只专注于做好一件事情。拆分的指导原则:高内聚,低耦合。
单一微服务有点像软件设计中的单一职责原则,Martin 对单一职责有一个论述:把因相同原因而变化的东西聚合到一起,而把因不同原因而变化的东西分离开来。
虽然微服务有这么多的好处,但是也需要注意的是,微服务架构并不是银弹,它同样也带来了很多的劣势(问题)。
劣势
- 整体复杂度变高,从哪些方面来管理这种复杂度?
- 运维变得复杂:微服务变多,怎么监控所有微服务,保证服务稳定?出了问题,怎么定位问题?
- 服务管理:微服务变多,管理复杂度变高,治理变得复杂
- 测试方面的挑战:你需要结合其他的微服务来进行集成测试
- 分布式问题:分布式数据一致性、分布式事务 (尤其在做支付领域,这方面更加重要。)
- 服务可用性保障:一个服务出了问题,如何才能不影响其他服务?
根据上面微服务定义,这些服务都是由小型独立团队负责,那团队怎么划分?公司组织架构如何调整才能适应微服务的架构发展?这也给组织管理带来了变革的挑战。
例如:ddd:做微服务的划分。
还有微服务的微
,多微
才是好的微
?也就是微服务怎么划分,如何确定边界?等等这些都是微服务面临的问题和挑战。
所以我们在使用微服务架构时,需要权衡微服务的优势和劣势,任何事物都有正反面,就像一枚硬币一样,所以思考问题要多样化,不能只思考一点。当我们享受微服务给开发和产品带来好处的同时,本身也会带来一系列的问题,如何克服这些问题,才是实施好微服务的关键所在。
随着技术的发展,软件架构的不断升级调整,上面我们遇到的这些问题大部分是可以解决的。比如需要建立运维开发基础设施来加以保障才能让微服务顺利运行,比如需要建设以 CI/CD 为基础的自动化交付流水线,到最后建设成从开发、测试、预发布、上线、运维等整个研发流程自动化的 DevOps 为目标。因为随着微服务的逐步建设,服务数量增多,上线服务次数必然增多,交付频繁会带来故障次数增多,所以我们必须建设自动化的工具链,来帮助我们快速无误的交付服务,实施好微服务项目。
而为了解决其他方面的问题,比如微服务的服务发现、熔断、降级、限流等等服务治理方面的问题,也有专门的技术栈来解决,比如 Spring Cloud、Dubbo(阿里的) 等。
Spring Cloud 是在 Spring 基础上构建的,Spring 是一个全家桶,Spring Cloud 也是一个全家桶,它由很多技术框架组合而成,包括:
Circuit Breakers
断路器。
-
服务治理
-
服务注册和发现:Netflix Eureka
-
当然我们也有其他的选择,比如 consul、etcd、zookeeper 等
-
断路器:Hystrix
-
调用端负载均衡:Ribbon
-
REST 客户端:Feign
-
网关
-
API 网关:Zuul
-
当然我们也可以选择其他的,比如 Spring Cloud Gateway、kong、nginx+lua、apisix 等
-
分布式链路监控
-
Spring Cloud Sleuth:埋点和发送数据
-
当然还有其他的比如 zipkin、pinpoint、skywalking(java里面最流行的)、jaeger(golang开发的) 等
-
消息组件
-
Spring Cloud Stream
-
Spirng Cloud Bus
-
消息中间件的其他软件:RocketMQ、Kafka、RabbitMQ
-
配置中心
-
Spring Cloud Config
-
配置中心可以有其他的替代,比如 Apollo、Nacos (国内比较流行的2种方式) 等
-
安全控制
-
Spring Cloud Security
Spring Cloud 是一整套微服务体系,它是一个完整的微服务解决方案,Spring Cloud 社区强大,也很活跃,这也是现在比较主流的微服务技术栈。
但是 Spring Cloud 也有一些缺点,比如它是基于 Spring 的,所以它的技术栈都是基于 Java 的,如果你的团队不是 Java 的,那么你可能需要考虑其他的技术栈。另外,Spring Cloud 的技术栈比较多,学习成本也比较高,所以你需要考虑你的团队是否有能力学习和使用 Spring Cloud。Spring Cloud 微服务体系具体还有哪些缺点呢?
- 代码侵入性强 - 业务层中需要加入治理层代码,与治理层混淆在一起 (很多都是通过注释的方式加入)
- 组件多 - 组件多,学习成本就变高
- 治理功能不全 - 比如协议转换、动态请求路由、灰度发布等功能 (如果想做的话,可以把spring cloud部署到k8s里,k8s来做灰度等功能)
- 无法实现语言无关性 - 只能是一种语言或几种语言实现,无法做到与编程语言无关,这和微服务架构的初衷是相违背的
针对以上的一些问题,就出现了 服务网格(Service Mesh) 这种架构,它作为一个基础设施层,真正做到与业务解耦,与语言无关,解决复杂架构下微服务应用与微服务应用之间通信网络相关问题,做到与业务解耦,让开发者专注于业务开发,而不是服务治理相关的问题。
3.服务网格
服务网格是一种基础设施层,它由一组网络代理组成,这些代理负责管理和协调服务之间的通信。服务网格可以提供服务发现、负载均衡、故障恢复、流量控制、安全等功能,从而简化了微服务架构中的一些问题。
服务网格的代理通常是以 sidecar 的形式部署在每个服务实例旁边。这些 sidecar 代理可以拦截服务之间的通信,并提供一些额外的功能,例如负载均衡、故障恢复、流量控制等。服务网格还可以提供一些高级功能,例如 A/B 测试、金丝雀发 布、蓝绿部署等。
服务网格的一个重要特点是透明性。服务网格的代理可以自动处理服务之间的通信,而不需要服务本身进行任何修改。这意味着我们可以在不影响服务本身的情况下,对服务之间的通信进行管理和控制。
这里最重要的是一种思维转变,不再将代理看成孤立的组件,而是将其组成的网络视为一种有价值的实体。
TCP 协议催生了分布式系统,分布式系统催生了微服务,Service Mesh 就是下一代微服务技术的代名词,是微服务时代的 TCP 协议。Service Mesh 以 Sidecar 形式,将服务治理从业务逻辑中剥离,并拆解为独立进程,实现异构系统的统一治理和网络安全。
为了能够对这些代理进行管理和控制,服务网格演进出了统一的控制平面(control plane)和数据面板(data plane,即边车代理)。
控制平面
控制和管理数据平面中的 Sidecar 代理,完成配置分发、服务发现、流量路由、授权鉴权等功能,以达到对数据平面的统一管理。控制平面不会直接解析请求数据包,通常提供 API 或者命令行工具可用于配置版本化管理,便于持续集成和部署。
数据平面
由整个网格内的 Sidecar 代理组成,这些代理以 Sidecar 的形式和应用服务一起部署。 这些代理负责协调和控制应用服务之间的所有网络通信。每一个 Sidecar 会接管进入和离开服务的流量,并配合控制平面完成流量控制等方面的功能。
总结一下,Service Mesh 具有如下优点:
- 屏蔽分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控追踪、流量控制等等),服务只用关注业务逻辑
- 真正的语言无关,服务可以用任何语言编写,只需和 Service Mesh 通信即可
- 对应用透明,Service Mesh 组件可以单独升级
当然,Service Mesh 目前也面临一些挑战:
- Service Mesh 组件以代理模式计算并转发请求,一定程度上会降低通信系统性能,并增加系统资源开销
- Service Mesh 组件接管了网络流量,因此服务的整体稳定性依赖于 Service Mesh,同时额外引入的大量 Service Mesh 服务实例的运维和管理也是一个挑战
最后我们简单对比下 Spring Cloud 与服务网格的区别:
能力 | Spring Cloud 生态系统 | Service Mesh 生态系统 |
---|---|---|
服务注册与发现 | 开发简单方便,仅需一个简单的注解,支持多种注册中心。对开发人员来说,很容易在本地环境下完成编码和调试。 | **基于 K8s 的服务机制,并提供自己的注册中心。**开发人员需要理解 Kubernetes,而开发环境的设置并不容易。 |
故障容忍性 | Resilience4j 的官方整合提供了完整的故障容忍机制。但服务需要与 SDK 整合。 | 通过使用 sidecar 架构,它是一个非侵入式的故障容忍机制,对服务完全透明。 |
可观察性 | Spring Cloud 内置,例如 spring micro-meter、Zipkin 等。所有服务内部的指标、追踪和日志都可以轻松收集,对开发者完全透明。 | 通过 sidecar 机制,它可以监控进出通信。没有可观察的服务内部,服务追踪可能是不完整的。 |
流量调度 | Spring Cloud 仅有非常基础的流量调度,例如,它基于 Ribbon 的负载均衡(从上一版本中删除)。 | 更多的流量调度方案,如金丝雀部署、蓝绿部署都可以轻松完成。 |
🚩
k8s里,pod里多个容器是共享网络命名空间的。
2、微服务、Kubernetes 与服务网格
随着现在云原生技术的发展,Kubernetes 已经成为了云原生的标准,它是一个开源的容器编排平台,它可以自动化地部署、扩展和管理容器化的应用程序。Kubernetes 可以帮助我们管理微服务架构中的服务,例如自动化部署、负载均衡、故障恢复等。同样服务网格和 K8s 的结合可以提供更强大的功能,服务网格可以提供服务发现、负载均衡、故障恢复、流量控制、安全等功能,而 K8s 可以自动化地部署、扩展和管理容器化的应用程序。通过将服务网格和 K8s 结合起来,我们可以更轻松地管理和控制微服务架构中的服务。
虽然 K8s 可以帮助我们管理微服务架构中的服务,但是它并不能解决所有的问题。K8s 主要关注的是容器编排和管理,例如自动化部署、扩展和管理容器化的应用程序。而服务网格则关注于服务之间的通信,例如服务发现、负载均衡、故障恢复、流量控制、安全等。
微服务、云原生、Kubernetes 和服务网格是现代应用开发和部署的关键概念,它们之间有着密切的关系。微服务和云原生强调应用程序的可扩展性、可维护性和可部署性,Kubernetes 可以帮助我们自动化地部署、扩展和管理容器化的应用程序,服务网格可以提供服务发现、负载均衡、故障恢复、流量控制、安全等功能,从而简化了微服务架构中的一些问题。
3、服务网格主流对比
在 servicemesh.es 网站中详细的列出了主流服务网格的详细对比。
那么我们应该如何选择服务网格呢?
尽管服务网格对代码没有影响,但它们改变了操作流程,并需要熟悉新的概念和技术。因此,采用服务网格实现是一个长期决策,特别是在广泛支持服务网格之前。因此,应提前仔细比较和测试这些实现。
评估的目标是弄清楚哪些功能对你更重要,由于服务网格会影响延迟和资源消耗,这些不利因素也必须进行衡量。我们建议在决策过程中包括以下步骤:
- 作为团队,确定由服务网格解决的最重要的问题。
- 讨论你对简单性/易用性、性能和兼容性的要求。
- 根据你的功能和非功能要求,确定你的前两个或三个实现。
- 测试你的个别应用程序的延迟和资源开销。针对每个服务网格候选者,设置相同的测试环境并安装服务网格。设置一个额外的无网格环境。在所有环境中安装您的应用程序。使用 Locust 或 Fortio 等工具在所有环境中进行负载测试,并测量请求延迟、CPU 和内存消耗。
如果你没有对这些服务网格技术做详细的评估了解,那么你可以从 Istio 开始,它是一个开源的服务网格,它提供了一些强大的功能,例如流量管理、策略执行、服务间通信、可观察性等。Istio 是一个非常活跃的开源项目,它有一个非常活跃的社区,它的文档也非常丰富,可以帮助你快速上手 Istio,目前 Istio 是最好的选择。
4、Istio 基础架构
- isio官网
https://istio.io/
中文官网:
https://istio.io/latest/zh/
凭借 Kubernetes 良好的架构设计及其强大的扩展性,Google 围绕 Kubernetes 打造一个生态系统。Kubernetes 用于微服务的编排(描述一组微服务之间的关联关系,并负责微服务的部署、终止、升级、缩扩容等)。Istio 补充了 Kubernetes 生态圈的重要一环,是 Google 的微服务版图里一个里程碑式的扩张。
Istio 是一个开源服务网格,可以透明地分层到现有的分布式应用程序上。 Istio 的强大功能提供了一种统一且更有效的方式来保护、连接和监控服务。 Istio 是实现负载均衡、服务间身份验证和监控的途径 - 只需很少或无需更改服务代码。其强大的控制平面带来了重要的功能,包括:
- 通过 TLS 加密、基于身份的强大身份验证和授权,确保集群中服务间通信的安全
- HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡
- 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制
- 支持访问控制、速率限制和配额的可插入策略层和配置 API集群内所有流量的自动指标、日志和跟踪,包括集群入口和出口Istio 专为可扩展性而设计,可以满足各种部署需求。
Istio 的控制平面在 Kubernetes 上运行,您可以将部署在该集群中的应用程序添加到网格中,将网格扩展到其他集群,甚至连接在 Kubernetes 外部运行的虚拟机或其他端点。
但 Istio 在 1.5 版本之后架构发生了较大的变化,控制平面将之前版本中的多个组件整合为了一个单体结构的 istiod
组件,同时废弃了被诟病已久的 Mixer
组件,但是我们在理解架构的时候还是可以按照微服务的模式去理解,现在最新的版本已经是 1.19.x
版本了,所以这里我们直接为大家介绍最新的架构图,下图是 1.5 版本之后的架构图:
从图上可以看出整体上 Istio 同样也是包括数据面和控制面两个部分。
- 数据面由一组 Envoy 代理,代理部署为 sidecar,控制微服务之间所有的网络通信。
- 控制面负责管理和配置代理来路由流量,以及在运行时执行策略。
1.Envoy
数据平面核心的组件是 Envoy,它是一个用 C++ 开发的高性能代理,用于协调服务网格中所有服务的所有入站和出站流量。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。
Envoy 代理作为服务的 sidecar 进行部署,从逻辑上通过 Envoy 的许多内置功能增强服务,例如:
- 动态服务发现
- 负载均衡
- TLS 终止
- HTTP/2 和 gRPC 代理
- 断路器
- 健康检查
- 基于百分比的分阶段部署
- 故障注入
- 丰富的指标
这种 sidecar 部署允许 Istio 执行策略决策并提取丰富的遥测数据,这些遥测数据可以发送到监控系统以提供有关整个网格行为的信息。
遥测数据一般是指链路追踪里的tracing,metrics,日志。
sidecar 代理模型还允许您将 Istio 功能添加到现有部署服务中,而无需重新架构或重写代码。
Envoy 代理启用的一些 Istio 功能和任务包括:
- 流量控制功能:通过丰富的 HTTP、gRPC、WebSocket 和 TCP 流量路由规则实施细粒度的流量控制。
- 网络弹性功能:设置重试、故障转移、断路器和故障注入。
- 安全和身份验证功能:强制执行安全策略并强制执行通过配置 API 定义的访问控制和速率限制。
- 基于
WebAssembly
的可插拔扩展模型,允许针对网格流量执行自定义策略和遥测生成。
2.istiod
控制平面由一个核心的 istiod
组件提供服务,用于 Istiod 提供服务发现、配置和证书管理。我们可以将 istiod
做进一步的细分,包括了 Pilot
、Citadel
和 Galley
,它们在 1.5 版本之前是属于独立的微服务组件,它们的各自功能如下:
Pilot
:为 Envoy 提供了服务发现,流量管理和智能路由(比如 A/B 测试、金丝雀发布等),以及错误处理(超时、重试、熔断)功能。Citadel
:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议。Galley
:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。
整体上 Istiod
将控制流量行为的高级路由规则转换为特定的 Envoy 配置,并在运行时将它们传播到 sidecar。Pilot
抽象了特定于平台的服务发现机制,并将其合成为任何符合 Envoy API 的 sidecar 都可以使用的标准格式。因为 Istio 可以支持多种环境(例如 Kubernetes 或 VM)的发现。
我们可以使用 Istio 的流量管理 API 来指示 Istiod
优化 Envoy 配置,以对服务网格中的流量进行更精细的控制。
Istiod
安全性通过内置身份和凭证管理实现强大的服务到服务和最终用户身份验证。你可以使用 Istio 升级服务网格中的未加密流量。使用 Istio,运维人员可以根据服务身份而不是相对不稳定的第 3 层或第 4 层网络标识符来实施策略。此外,还可以使用 Istio 的授权功能来控制谁可以访问你的服务。
此外 Istiod
还充当证书颁发机构 (CA) 并生成证书以允许数据平面中的安全 mTLS 通信(双向通信)。
所以在正式开始学习 Istio 之前,我们非常有必要学习下 Envoy 的相关知识,Envoy 代理是唯一的数据面组件,当我们遇到相关问题的时候可以通过分析 Envoy 来定位问题,所以我们需要学习下 Envoy 的相关知识。
文章来源
【优点知识】istio实战训练营
https://youdianzhishi.com/web/course/1047
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。
🍀 微信公众号
《云原生架构师实战》
🍀 个人博客站点
http://onedayxyy.cn/
🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
🍀 知乎
https://www.zhihu.com/people/foryouone
最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!
相关文章:

服务网络基础
服务网络基础 目录 前言 从今天开始我们将进入服务网格的学习,服务网格是微服务架构中的一种重要的技术,它可以解决微服务架构中的一些问题,比如服务发现、服务治理、服务监控等等,我们将从服务网格的基础开始,逐步深…...

2016年亚太杯APMCM数学建模大赛C题影视评价与定制求解全过程文档及程序
2016年亚太杯APMCM数学建模大赛 C题 影视评价与定制 原题再现 中华人民共和国成立以来,特别是政治改革和经济开放后,随着国家经济的增长、科技的发展和人民生活水平的提高,中国广播电视媒体取得了显著的成就,并得到了迅速的发展…...

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四)
这篇博客是之前文章: Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (一)Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (二&a…...

YOLOv7优化:渐近特征金字塔网络(AFPN)| 助力小目标检测
💡💡💡本文改进:渐近特征金字塔网络(AFPN),解决多尺度削弱了非相邻 Level 的融合效果。 AFPN | 亲测在多个数据集能够实现涨点,尤其在小目标数据集。 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀…...

J2EE项目部署与发布(Windows版本)
🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 ,越幸运。 1.单机项目的部署 1.1们需要将要进行部署的项目共享到虚拟机中 在部署项目之前,我们先要检查一下…...

使用AWS Lambda函数的最佳实践!
主题 函数代码 函数配置 指标和警报 处理流 安全最佳实践 有关 Lambda 应用程序最佳实践的更多信息,请参阅 Serverless Land 中的 Application design。 函数代码 从核心逻辑中分离 Lambda 处理程序。这样您可以创建更容易进行单元测试的函数。在 Node.js 中…...

【计算机毕设小程序案例】基于SpringBoot的小演员招募小程序
前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 👉IT源码社-SpringBoot优质案例推荐👈 👉IT源码社-小程序优质案例…...

老年少女测试媛入职感想
作为一枚从事通信行业测试的老年少女测试媛,入职离职也有两三次了。现在又在一家企业入职了。虽然心里也清楚离职和入职,无非也就是从一个公司的坑里跳出来,再跳到另外一个公司的坑里罢了,明明知道老东家的坑是填不完的了…...

StreamSaver.js入门教程:优雅解决前端下载文件的难题
本文简介 点赞 关注 收藏 学会了 本文介绍一个能让前端优雅下载大文件的工具:StreamSaver.js ⚡️ StreamSaver.js GitHub地址⚡️ 官方案例 StreamSaver.js 可用于实现在Web浏览器中直接将大文件流式传输到用户设备的功能。 传统的下载方式可能导致大文件的加…...

element-ui vue2 iframe 嵌入外链新解
效果如图 实现原理 在路由中通过 props 传值 {path: /iframe,component: Layout,meta: { title: 小助手, icon: example },children: [{path: chatglm,name: chatglm,props: { name: chatglm,url: https://chatglm.cn },component: () > import(/views/iframe/common),me…...

win10 + VS2017 编译libjpeg(jpeg-9b)
需要用到的文件: jpeg-9b.zip win32.mak 下载链接链接:https://pan.baidu.com/s/1Z0fwbi74-ZSMjSej-0dV2A 提取码:huhu 步骤1:下载并解压jpeg-9b。 这里把jpeg-9b解压到文件夹"D:\build-libs\jpeg\build\jpeg-9b" …...

如何实现公网远程桌面访问Ubuntu?VNC+cpolar内网穿透!
文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…...

SpringMvc接收参数
接受参数:1.路径设置RequestMapping(value"地址",method"请求方式") 类|方法GetMapping PostMapping 方法2.接受参数[重点]param直接接收---handler(类型 形参名) 形参名请求参数名注解指定---handler(RequestParam(name"请求参…...

计算机网络文章荟萃
脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?-网络编程/专项技术区 - 即时通讯开发者社区! 1.什么是 socket - 掘金2.socket 的实现原理 - 掘金本文讲述了 socket 在 linux 操作系统下的数据结构,以及阻塞 IO 利用…...

C# Socket通信从入门到精通(4)——多个异步TCP客户端C#代码实现
前言: 在之前的文章C# Socket通信从入门到精通(3)——单个异步TCP客户端C#代码实现我介绍了单个异步Tcp客户端的c#代码实现,但是有的时候,我们需要连接多个服务器,并且对于每个服务器,我们都有一些比如异步连接、异步发送、异步接收的操作,那么这时候我们使用之前单个…...

GitHub为自己的仓库(Repository)设置默认代码缩进(tabsize)
无意中发现GitHub默认显示tab为8个空格的大小,十分不适,故想改成四个字节的缩进 流程 GitHub是支持EditorConfig的。所有只需在Repository根目录下(注意不是.git文件夹下)新建文件 .editorconfig vim .editorconfig内容如下 # top-most EditorConfig…...

Tomcat的动静分离
一、动态负载均衡 3、台虚拟机模拟: 代理服务器:51 tomcat动态页面:53,54 关闭防火墙和安全机制 配置代理服务器,由于做的是七层代理,所以要在http模块配置 配置前端页面 <!DOCTYPE html> <html> <…...

Chimera:混合的 RLWE-FHE 方案
参考文献: [HS14] S. Halevi and V. Shoup. Algorithms in HElib. In Advances in Cryptology–CRYPTO 2014, pages 554–571. Springer, 2014.[HS15] S. Halevi and V. Shoup. Bootstrapping for HElib. In Advances in Cryptology–EUROCRYPT 2015, pages 641–6…...

MySQL 连接出现 Authentication plugin ‘caching_sha2_password的处理方法(使用第二种)
出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种,一种是升级navicat驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password. 1. 升级MySQL版本 较早的MySQL版本可能不…...

设置Ubuntu 20.04的静态IP地址(wifi模式下)
一、引言 自己家用的Ubuntu的,重启后ip地址经常会改变,这个时候就需要我们手动配置静态IP了。 二、优点 给Ubuntu设置一个静态IP地址有以下几个好处: 持久性:静态IP地址是固定不变的,与设备的MAC地址绑定。这意味着…...

Qt界面实现中英文切换
要实现的效果,是下拉列表切换中文和English实现按钮文本中英文内容切换。 实现步骤: 1.在VS中鼠标对Translation Files文件右击,选择“添加”--->“模块”. 在弹窗的窗口中选择“Qt”--->“Qt Translation File”。 添加Translation_e…...

Python 编写确定个位、十位以上方法及各数位的和程序
Python 编写确定数字位方法 Python 编写确定个位、十位Python 编写确定个位、十位、百位方法解析:Python 各数位的和程序 利用%(取余符号)、//(整除)符号。 Python 编写确定个位、十位 num 17 a num % 10 b num /…...

AI 引擎系列 1 - 从 AI 引擎工具开始(2022.1 更新)
AI 引擎系列 1 - 从 AI 引擎工具开始(2022.1 更新) AI 引擎系列简介 在这篇题为 Versal 自适应 SoC AI 引擎入门的文章中,我介绍了一些 Versal™ 自适应 SoC 器件中存在的 AI 引擎 (AIE) 阵列。本系列是全新的 AI 引擎系列博文,我…...

Android Kotlin 协程初探 | 京东物流技术团队
1 它是什么(协程 和 Kotlin协程) 1.1 协程是什么 维基百科:协程,英文Coroutine [kəru’tin] (可入厅),是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被…...

MySQL-DQL【数据查询语言】(图码结合)
作者:chlorine 专栏:数据库_chlorine5的博客-CSDN博客 MySQL——DDL:DDL ——数据定义语言 MySQL——DML:DML——数据操作语言 目录 一.DQL的定义 二.DQL—语法 三.DQL—基础查询(SELECT.. FROM) 👉查询多个字段 👉设置别名 …...

HTTP 响应状态码介绍
HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。响应被归为以下五大类: 1xx 信息响应 (100–199) 2xx 成功响应 (200–299) 3xx 重定向消息 (300–399) 4xx 客户端错误响应 (400–499) 5xx 服务端错误响应 (500–599)1xx 信息响应 100 Continue 这个临时响应…...

vtk 绘制等高线
使用 VTK 也可以实现等高线绘制,在地图、气象、地质等领域中,经常需要将数据以多个等高线的形式进行展示。在VTK(Visualization Tookt) 中,有专门的AP何以支持简便地实现这一功能。 我们还可以根据算法操作的数据类型或生成的数据类型对算法…...

N-129基于springboot,vue学生宿舍管理系统
开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vuevue-element-admin 服务端技术:springboot,mybatis…...

力扣每日一题70:爬楼梯
题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 …...

分布式合集
1.Spring 的事务 Spring框架为应用程序提供了强大的事务管理功能。它通过将事务逻辑与业务逻辑分离,使得开发者可以专注于业务逻辑的实现,而不必过多关注事务的管理。Spring事务的核心是基于AOP(面向切面编程)的声明式事务管理&a…...