当前位置: 首页 > news >正文

一文读懂中间件

前言:在程序猿的日常工作中, 经常会提到中间件,然而大家对中间件的理解并不一致,导致了一些不必要的分歧和误解。“中间件”一词被用来描述各种各样的软件产品,在不同文献中有着许多不同的中间件定义,包括操作系统(和/或网络)和应用程序之间的软件层,以及两个应用程序之间的“粘合剂”。它也被描述为一种重要的集成工具,或支持与分布式软件的模块化连接。一般而言中间件和框架的区别是,中间件是独立运行的用于处理某项专门业务的CS程序,会有配套的客户端和服务端,框架虽然也是处理某个专门业务的但是它不是独立程序,是寄宿在宿主程序进程内的一套类库。


一、中间件的概念

由于应用软件是在系统软件基础上开发和运行的,而系统软件又有多种,如果每种应用软件都要提供能在不同系统上运行的版本,开发成本将大大增加。因而出现了一类称为“中间件” (Middleware) 的软件,它们作为应用软件与各种操作系统之间使用的标准化编程接口和协议,可以起承上启下的作用,使应用软件的开发相对 独立于计算机硬件和操作系统,并能在不同的系统上运行,实现相同的应用功能。中间件是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处在操作系统、网络和数据库之上, 应用软件的下层,如图所示。也有人认为中间件应该属于操作系统中的一部分。

 中间件从诞生到现在,虽然仅有 10 多年时间,但发展极其迅速,是有史以来发展最快的软件产品,但在技术上还处于成长阶段,还没有统一的标准和模型,通常都是用 C++ 语言以面向对象的技术来实现的,但是它的特性已超出面向对象的表达能力,由于它属于可重用构件,目前趋向于用构件技术来实现。然而,中间件要涉及软件的所有标准 、 规范和技术,它有更多的内涵,因为它包括平台功能,自身具有自治性 、 自主性 、 隔离性 、 社会化 、 激发性 、 主动性 、 并发性 、 认识能力等特性,是近似于 Agent (代理)的结构。

   1.1、中间件特点

  • 满足大量应用的需要;

  • 运行于多种硬件和 OS 平台;

  • 支持分布计算,提供跨网络、硬件和 OS 平台的透明性的应用或服务的交互;

  • 支持标准的协议;

  • 支持标准的接口。

1.2、中间件的十大优越性

世界著名的咨询机构 Standish Group 在一份研究报告中归纳了:

  • 缩短应用的开发周期;

  • 节约应用的开发成本;

  • 减少系统初期的建设成本;

  • 降低应用开发的失败率;

  • 保护已有的投资;

  • 简化应用集成;

  • 减少维护费用;

  • 提高应用的开发质量;

  • 保证技术进步的连续性;

  • 增强应用的生命力。

        具体来说,首先,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少了程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。中间件带给应用系统的,不只是开发的简便 、 开发周期的缩短,也有系统的维护 、 运行和管理的工作量的减少,还减少了计算机总体费用的投入 。Standish 的调查报告显示,由于采用了中间件技术,应用系统的总建设费用可以减少 50% 左右。在网络经济 、 电子商务大发展的今天,从中间件获得利益的不只是 IT 厂商, IT 用户也同样是赢家,并且是更有把握的赢家。

        其次,中间件作为新层次的基础软件,其重要作用是将不同时期 、 在不同操作系统上开发的应用软件集成起来,彼此无缝地整体协调工作,这是操作系统 、 数据库管理系统本身做不了的。中间件的这一作用,使得在技术不断发展之后,人们以往在应用软件上的劳动成果仍然物有所用,节约了大量的人力 、 财力投入。

        最后,由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。对于应用软件开发,中间件远比操作系统和网络服务更为重要,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持中间件对外的接口定义不变,应用软件几乎不需任何修改,从而节省了企业在应用软件开发和维护中的重大投资。

1.3、中间件用途

  • 提供工具和函数以简化复杂应用程序的开发。

  • 提供高级抽象和接口,以促进应用程序的集成、重用和开发。

  • 隐藏底层平台和操作环境的异构性。

  • 隐藏基础环境中的分发机制和通信细节。

  • 促进基础设施的不同分布式组件之间的通信。

  • 为不同应用程序所需的通用功能提供共同服务,以减少开发工作和避免服务重复。

  • 提供一个公共体系结构来添加新的服务和特性,而不必更改应用程序。

  • 提供增值特性和非功能特性,如安全性、可靠性和 QoS。

  • 提供必要的工具,以增强分布式应用程序的性能并提高其稳定性和可伸缩性。


二、中间件分类

按照中间件在分布式系统中承担的职责不同,可以划分以下几类中间件产品。

1)通信处理(消息)中间件

正如,人们通过安装红绿灯,设立交通管理机构,制定出交通规则,才能保证道路交通  畅通一样,在分布式系统中,人们要建网和制定出通信协议,以保证系统能在不同平台之间  通信,实现分布式系统中可靠的、高效的、实时的跨平台数据传输,这类中间件称为消息中间 件,也是市面上销售额最大的中间件产品,目前主要产品有BEA  eLink、IBM 的 MQSeriesTongLINK 等。实际上, 一般的网络操作系统如Windows已包含了其部分功能。

2)事务处理(交易)中间件

正如城市交通中要运行各种运载汽车,以此来完成日常的运载工作,同时随时监视汽车的 运行,在出现故障时及时排堵保畅。在分布式事务处理系统中,经常要处理大量事务,特别是 OLTP中,每项事务常常要多台服务器上的程序按顺序协调完成, 一旦中间发生某种故障,不但 要完成恢复工作,而且要自动切换系统保证系统永不停机,实现高可靠性运行。要使大量事务 在多台应用服务器上能实时并发运行,并进行负载平衡的调度,实现与昂贵的可靠性机和大型 计算机系统的同等功能,为了实现这个目标,要求中间件系统具有监视和调度整个系统的功能。 BEA  Tuxedo 由此而闻名,它成为增长率最高的厂商。

3)数据存取管理中间件

在分布式系统中,重要的数据都集中存放在数据服务器中,它们可以是关系型的、复合文 档型、具有各种存放格式的多媒体型,或者是经过加密或压缩存放的,该中间件将为在网络上 虚拟缓冲存取、格式转换、解压等带来方便。

4)Web服务器中间件

浏览器图形用户界面已成为公认规范,然而它的会话能力差,不擅长做数据的写入任务, HTTP 协议的限制多等,就必须对其进行修改和扩充,因此出现了Web 服务器中间件,如  SilverStream 公司的产品。

5)安全中间件

一些军事、政府和商务部门上网的最大障碍是安全保密问题,而且不能使用国外提供的安 全措施(如防火墙、加密和认证等),必须用国产产品。产生不安全因素是由操作系统引起的, 但必须要用中间件去解决,以适应灵活多变的要求。

6)跨平台和架构的中间件

当前开发大型应用软件通常采用基于架构和构件技术,在分布式系统中,还需要集成各 结点上的不同系统平台上的构件或新老版本的构件,由此产生了架构中间件。功能最强的是 CORBA,  可以跨任意平台,但是其过于庞大;JavaBeans 较灵活简单,很适合用于浏览器,但运 行效率有待改善; COM+  模型主要适合Windows 平台,已在桌面系统广泛使用。由于国内新建 系统多基于UNIX (包括Linux)   Windows,   因此,针对这两个平台建立相应的中间件市场相 对要大得多。

7)专用平台中间件

专用平台中间件为特定应用领域设计领域参考模式,建立相应架构,配置相应的构件库和 中间件,为应用服务器开发和运行特定领域的关键任务(如电子商务、网站等)。

8)网络中间件

它包括网管、接入、网络测试、虚拟社区和虚拟缓冲等,也是当前最热门的研发项目。


三、中间件在微服务中的应用场景

微服务的建设中实现远程调用只是实现了20%的工作量(但是确实满足了80%的需求)。服务管理治理这块有大量的工作要做。这也就是实现自己RPC框架的好处,这是第一步,有了这第一步让数据流过我们自己的框架以后我们接可以做更多的事情,比如:

  • 服务发现和注册。查看服务的注册情况,服务手动上线下线,集群切换,压力分配干预。

  • 配置管理。配置服务端客户端线程池和队列的配置,超时配置等等。当然,这个也可以在配置系统中进行。

  • 全链路监控。能否记录整个微服务调用链路的情况,并且查看这个调用链。

  • 熔断限流。熔断和进行并发限流配置,服务权限黑白名单配置,安全方面的配置(信息加密,日志脱敏等)。

  • Service Store的概念。服务发布需要满足一定要求,有文档(比如可以通过注解方式在代码注释里提供),有信息(开发负责人、运维负责人,服务类型,提供的能力),满足要求后就可以以类似于苹果App Store发布程序的方式发布服务,这样我们就可以在统一的平台上查看服务的维护信息和文档。

  • 版本控制调用统计。对服务进行灰度升级,按版本路由,不同版本调用分析等等。类似于一些应用统计平台提供的功能(友盟、TalkingData)。

下图绿色部分代表了框架,红色部分代表了管理系统,紫色部分代表了中间件。本文会着重介绍管理系统和中间件部分。

(1)服务管理

服务能调用通是第一步,随着服务数量变多,部署方式的复杂化,依赖关系复杂化,版本的迭代,API的变更,开发人员和架构师其实急需有一套地图能够对服务能力的全貌进行整体的了解,运维也需要有系统能对服务进行观察和调配。服务治理的部分完全可以以iOS那套(开发符合时候需要符合标准+发布的时候需要有流程)方式来运作,常见的服务发现与注册有阿里的Nacos和 Netflix 公司的Eureka。

(2)配置管理

要实现一个功能完善的配置系统工作量还是相当大的,一个优秀的功能强大的配置系统可以节省很多开发的工作量,因为可配置部分的功能基本就是由配置系统直接实现了,无需在数据库中在搞大量的XXConfig表(不夸张的说,很多业务系统40%的工作量在这个上面,不但需要做这些配置表还需要配以配置后台)

比较知名的分布式配置服务和管理系统有阿里的Nacos和携程的apollo对于比较大型的互联网项目来说,因为业务繁杂,需求多变,往往各种系统都会有大量的配置,覆盖几个方面:

  • 针对系统内部技术层面的各种配置,各种池的大小、 队列的大小、日志级别、各种路径、批次大小、处理间隔、重试次数、超时时间等。

  • 针对业务运营层面的各种配置,活动的周期奖励、黑白名单、弹窗、广告位等。

  • 针对运维和发布层面的配置,灰度名单、注册中心地址、数据库地址、缓存地址、MQ地址等

(3)全链路监控

开源的实现有https://github.com/dianping/cat以及https://github.com/naver/pinpoint(上图)等等。对于微服务比较多的(主流程涉及8+微服务)系统,如果没有服务的全链路调用跟踪那么排查故障以及性能问题就会很困难了。一般完善的全链路监控体系不仅仅覆盖微服务,而且功能也会更丰富,实现下面的功能:

  • 以Log、Agent、Proxy或整合进框架的方式实现,尽可能少的侵入的情况下实现数据的收集。而且确保数据的收集不会影响到主业务,收集服务端宕机的情况下业务不影响。

  • 调用跟踪。涉及到服务调用、缓存调用、数据库调用,MQ调用,不仅仅可以以树的形式呈现每次调用的类型、耗时、结果,还可以呈现完整的根,也就是对于网站请求呈现出请求的完整信息,对于Job任务呈现出Job的信息。

  • JVM的信息(比如对于Java)。呈现每一个进程JVM层次的GC、Threads、Memory、CPU的使用情况。可以进行远程Stack的查看和Heap的快照(没有进程的内存信息,很多时候基于服务器层面粗粒度的资源使用情况的监控,基本不可能分析出根本原因),并且可以设定策略进行定期的快照。虚拟机的信息查看和调用跟踪甚至可以通过快照进行关联,在出现问题的时候能够了解当时虚拟机的状态对于排查问题是非常有好处的。

  • 依赖关系一览。有的时候我们做架构方案,第一步就是梳理模块和服务之间的依赖关系,只有这样我们才能确定影响范围重构范围,对于微服务做的比较复杂的项目来说,每个人可能只是关注自己服务的上下游,对于上游的上游和下游的下游完全不清楚,导致公司也没有人可以说的清楚架构的全貌。这个时候我们有全链路跟踪系统的话,可以对通过分析过去的调用来绘制出一张依赖关系的架构图。这个图如果对QPS做一些热点的话,还可以帮助我们做一些运维层面的容量规划。

  • 高级分析建议。比如在全链路压测后定位分析瓶颈所在。定时分析所有组件的执行性能,得出性能衰退的趋势,提早进行问题预警。分析JVM的线程和GC情况,辅助定位High CPU和Memory Leak的问题。退一万步说,即使没有这样的自动化的高级分析,有了调用跟踪的图和组件依赖关系图,至少在出问题的时候我们人能分析出来咋回事。

  • Dashboard。非必须,只要数据收集足够全面,如之前文章所示,我们可以用Grafana来进行各种个性化的图表配置。

  (4)熔断限流

比如客户端权限控制,黑白名单,限流,超时熔断,和调用链搭配起来的调用跟踪,全量操作的审计搜索,数据迁移辅助等等。常见的熔断限流有阿里开源的Sentinel。

(5)分布式事务

代理实现了分布式事务的功能(XA)。还可以实现代理层面的分布式悲观锁的功能。比如阿里来源的分布式事务中间件Seata。

(6)数据访问中间件

数据访问中间件是独立部署的数据库的透明代理,本身需要是以集群方式支持高可用,背后还需要对接多套数据库作为一个集群。常见的数据库中间件包括:ShardingSphere和MyCat。

一般而言会提供如下的功能:

  • 读写分离:包括负载均衡和故障转移的功能,自动在多个从库做负载均衡,通过可用性探测,在主库出现故障的时候配合数据库的高可用和复制做主库的切换。

  • 分库分表:随着数据量的增多需要分片功能。分片也就是Sharding,把数据按照一定的维度均匀分散到不同的表,然后把表分布在多个物理数据库中,实现压力的分散。这里写入的Sharding一般而言没有太多的差异,但是读取方面因为涉及到归并汇总的过程,如果要实现复杂功能的话还是比较麻烦的。由于分片的维度往往可能有多个,这方面可以采用多写多个维度的底层表来实现也可以采用维度索引表方式来实现。

  • SQL优化:随时进行SQL的Profiler,然后达到一定阈值后提供索引优化建议。类似https://github.com/Meituan-Dianping/SQLAdvisor。

(7)分布式缓存中间件

类似于数据库的Proxy,这里是以缓存服务作为后端,提供一些集群化的功能。比如以Redis为后端的开源的实现有https://github.com/CodisLabs/codis以及饿了么的https://github.com/eleme/corvus 等等。其实不采用Proxy方式做,开发一个缓存客户端在框架层面做也是完全可以的,但是之这两种方式各有优劣。代理方式的话更透明,如果有Java、Python、Go都需要链接Redis,我们无需开发多套客户端了。一般实现下面的功能:

  • 分布式。这是最基本的,通过各种算法把Key分散到各个节点,提供一定的容量规划和容量报警功能。

  • 高可用。配合Redis的一些高可用方案实现一定程度的高可用。

  • 运维方面的功能。比如客户端权限控制,黑白名单,限流,超时熔断,全量操作的审计搜索,数据迁移辅助等等。

  • 跟踪和问题分析。配合全链路监控实现一体化的缓存访问跟踪。以及更智能的分析使用的情况,结合缓存的命中率,Value的大小,压力平衡性提供一些优化建议和报警,尽早发现问题,缓存的崩盘往往是有前兆的。

  • 完善的管理后台,可以一览集群的用量、性能,以及做容量规划和迁移方案。

如果Redis集群特别大的话的确是有一套的自己的Proxy体系会更方便,小型项目一般用不到。

(8)分布式定时任务

分布式定时任务的方案,都是基于单点+集群的模式,即选中一个系统作为单点保证任务不会重复,其他服务执行任务确保系统高可用、低负载。常见的比如XXL-JOB和POWER-JOB

(9)消息队列中间件

消息中间件是在分布式系统中完成消息的发送和接收的基础软件。

消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。

消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。


四、中间件产品介绍

主流的中间件产品有 IBM MQSeries  BEA Tuxedo

(1)IBM    MQSeries

IBM公司的 MQSeries  IBM 的消息处理中间件。MQSeries 提供一个具有工业标准、安全、 可靠的消息传输系统,它用于控制和管理一个集成的系统,使得组成这个系统的多个分支应用 (模块)之间通过传递消息完成整个工作流程。MQSeries 基本由一个信息传输系统和一个应用 程序接口组成,其资源是消息和队列。

MQSeries 的关键功能之一是确保信息的可靠传输,即使在网络通信不可靠或出现异常时也 能保证信息的传输。MQSeries 的异步消息处理技术能够保证当网络或者通信应用程序本身处于 “忙”状态或发生故障时,系统之间的信息不会丢失,也不会阻塞。这样的可靠性是非常关键 的,否则大量的金钱和客户信誉就会面临极大的损害。

同时, MQSeries 是灵活的应用程序通信方案。MQSeries 支持所有的主要计算平台和通信 模式,也能够支持先进的技术(如Internet  Java),    拥有连接至主要产品(如LotusNotes   SAP/R3 等)的接口。

(2)BEA   Tuxedo

Tuxedo是BEA公司(现已被Oracle公司收购)的一个客户机/服务器的“中间件”产品,它在客户机和服务器之间进行调节,以保证正确地处理事务。它用C语言技术开发的并且有很高性能。Tuxedo 已经广泛地应用于金融、电信、制造业等各行各业的核心业务系统。

TUXEDO是在nternet 这样的分布式运算环境中开发和管理三层结构的客户/服务器型关键任务应用系统的强有力工具。它具备分布式事务处理和应用通信功能,并提供完善的各种服务来建立、运行和管理关键任务应用系统。开发人员能够用它建立跨多个硬件平台、数据库和操作系统的可互操作的应用系统。 

 Tuxedo 的主要作用是:屏蔽分布式环境中各种通信协议、硬件体系结构、操作系统、数据库和其它应用服务等方面的差异,使分布于网络节点上的应用程序的各个单元部件之间能够进行互操作,并协调操作的一致性和完整性,最大限度地节省系统资源,提高系统性能。

BEA公司的 Tuxedo 作为电子商务交易平台,属于交易中间件。它允许客户机和服务器参 与一个涉及多个数据库协调更新的交易,并能够确保数据的完整性。BEA Tuxedo一个特色功能 是能够保证对电子商务应用系统的不间断访问。它可以对系统构件进行持续的监视,查看是否 有应用系统、交易、网络及硬件的故障。 一旦出现故障, BEA Tuxedo 会从逻辑上把故障构件排 除,然后进行必要的恢复性步骤。

BEA Tuxedo 根据系统的负载指示,自动开启和关闭应用服务,可以均衡所有可用系统的负 载,以满足对应用系统的高强度使用需求。借助 DDR (数据依赖路由), BEA Tuxedo 可按照消 息的上下文来选择消息路由。其交易队列功能,可使分布式应用系统以异步“少连接”方式协 同工作。

BEA Tuxedo  LLE 安全机制可确保用户数据的保密性,应用/交易管理接口为50多种硬 件平台和操作系统提供了一致的应用编程接口。BEA Tuxedo 基于网络的图形界面管理可以简化 对电子商务的管理,为建立和部署电子商务应用系统提供了端到端的电子商务交易平台。


参考链接:

系统架构设计笔记(77)—— 中间件技术 - 掘金

互联网架构:常用基础中间件介绍_基础架构中间件-CSDN博客

一文读懂中间件-腾讯云开发者社区-腾讯云

相关文章:

一文读懂中间件

前言:在程序猿的日常工作中, 经常会提到中间件,然而大家对中间件的理解并不一致,导致了一些不必要的分歧和误解。“中间件”一词被用来描述各种各样的软件产品,在不同文献中有着许多不同的中间件定义,包括操…...

【编程基础心法】「设计模式系列」让我们一起来学编程界的“兵法”设计模式(序章)

一起来学编程界的“兵法”设计模式(序章) 设计模式是什么设计模式的概念设计模式的分类创建型模式(5种)结构型模式(7种)行为型模式(11种) 设计模式应用场景工厂模式的实现及应用单例…...

技术阅读周刊第第8️⃣期

技术阅读周刊,每周更新。 历史更新 20231103:第四期20231107:第五期20231117:第六期20231124:第七期 Prometheus vs. VictoriaMetrics (VM) | Last9 URL: https://last9.io/blog/prometheus-vs-victoriametrics/?refd…...

HTML程序大全(2):通用注册模版

一、正常情况效果 二、某项没有填写的效果 三、没有勾选同意项的效果 四、代码 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>注册</title><style>body {font-family: Arial, sans-serif;background-color…...

【循环结构 for、break、continue高级用法】

在 C++ 中,for 循环是一种常用的循环结构,它用于重复执行代码块直到满足指定的条件。for 循环的基础用法相对简单,而高级用法则涉及更复杂的控制结构和技术。让我们探讨这些用法,并通过一些示例来加深理解。 文章目录 基础用法高级用法实战示例注意事项结合 break 和 conti…...

JAVA网络编程——BIO、NIO、AIO深度解析

I/O 一直是很多Java同学难以理解的一个知识点&#xff0c;这篇帖子将会从底层原理上带你理解I/O&#xff0c;让你看清I/O相关问题的本质。 1、I/O的概念 I/O 的全称是Input/Output。虽常谈及I/O&#xff0c;但想必你也一时不能给出一个完整的定义。搜索了谷哥欠&#xff0c;发…...

Linux高级系统编程-3 进程

概念 进程与程序的区别 程序&#xff1a;一个可执行文件, 占磁盘空间&#xff0c;是静态的 进程&#xff1a;一个程序运行的过程, 占内存&#xff0c;动态的。 单道程序和多道程序 单道程序设计: 所有进程一个一个排队执行。若 A 阻塞&#xff0c; B 只能等待&#xff0…...

ES-ELSER 如何在内网中离线导入ES官方的稀疏向量模型(国内网络环境下操作方法)

ES官方训练了稀疏向量模型&#xff0c;用来支持语义检索。&#xff08;目前该模型只支持英文&#xff09; 最好是以离线的方式安装。在线的方式&#xff0c;在国内下载也麻烦&#xff0c;下载速度也慢。还不如用离线的方式。对于一般的生产环境&#xff0c;基本上也是网络隔离的…...

Excel 使用技巧

Excel 使用技巧 注意&#xff1a; excel 中设计计算的字符尽量使用英文。 拼接两段文字&#xff08;字符串拼接&#xff09; 方法一 在需要计算的单元格上,键入 点击 A1(点击需要拼接的单元格) & C1(点击需要拼接的单元格) 举例: 姓名栏想要拼接 姓 和 名 两列点击姓名这一…...

Hadoop学习笔记(HDP)-Part.03 资源规划

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...

一个最新国内可用的免费GPT4,Midjourney绘画网站+使用教程

一、前言 ChatGPT GPT4.0&#xff0c;Midjourney绘画&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GPT-4对普…...

深入了解Java8新特性-日期时间API之ZonedDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概19000多字&#xff0c;预计阅读时间长需要10分钟以上。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…...

使用Vue写一个日期选择器

在 Vue 中实现日期选择器的方法有很多&#xff0c;下面提供一个简单的实现方法。 首先&#xff0c;在需要使用日期选择器的组件中引用 Vue 和 date-fns 库&#xff0c;date-fns 库是一个轻量级的 JavaScript 时间日期工具库&#xff0c;可以方便地处理日期的格式化和计算。 &…...

19、pytest通过mark标记测试函数

官方实例 [pytest] markers slow:marks tests as slow(deselect with -m "not slow")serial# content of test_mark.py import pytestpytest.mark.slow def test_mark_function():print("test_mark_function was invoked")assert 0解读与实操 通过使用p…...

Linux环境变量与命令行参数

Linux环境变量与命令行参数 一.命令行参数1.语法2.应用1:简易计算器 二.环境变量1.环境变量的概念2.环境变量的作用3.进一步理解环境变量的作用4.常见环境变量5.导出环境变量(添加环境变量)6.环境变量的特性7.另一种获取环境变量的方式8.小功能:用于身份验证的代码9.补充:第三种…...

jQuery实现3D轮播图

通过CSS3的3D变换和jQuery Transit插件实现了一个3D旋转的图片轮播效果 HTML部分&#xff1a; div id“banner”&#xff1a;定义了一个id为"banner"的div标签&#xff0c;作为图片轮播的容器。 ul: 在"banner"中定义了一个无序列表&#xff0c;每个列表项…...

Java面试题(每天10题)-------连载(43)

目录 Spring篇 1、请举例说明Qualifier注解 2、构造方法注入和设值注入有什么区别&#xff1f; 3、Spring框架中有哪些不同类型的事件&#xff1f; 4、FileSystemResource和ClassPathResource有什么区别&#xff1f; 5、Spring框架中都用到了哪些设计模式&#xff1f; 6…...

Python高级数据结构——并查集(Disjoint Set)

Python中的并查集&#xff08;Disjoint Set&#xff09;&#xff1a;高级数据结构解析 并查集是一种用于处理集合的数据结构&#xff0c;它主要支持两种操作&#xff1a;合并两个集合和查找一个元素所属的集合。在本文中&#xff0c;我们将深入讲解Python中的并查集&#xff0…...

pytorch学习9-优化器学习

系列文章目录 pytorch学习1-数据加载以及Tensorboard可视化工具pytorch学习2-Transforms主要方法使用pytorch学习3-torchvisin和Dataloader的使用pytorch学习4-简易卷积实现pytorch学习5-最大池化层的使用pytorch学习6-非线性变换&#xff08;ReLU和sigmoid&#xff09;pytorc…...

MySQL之锁

MySQL之锁 锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制&#xff0c;MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性 MySQL锁可以按模式分类为&#xff1a;乐观锁与悲观锁。 按粒度分可以分为全局锁、表级锁…...

今日现货黄金最新建议

近期现货黄金价格再度逼近历史高位&#xff0c;很多本来在场外观望的投资者&#xff0c;都纷纷希望进场一试身手。然而大涨大跌的行情并不是很适合新手投资者参与&#xff0c;如果大家还没做好技术上的准备&#xff0c;可以多听听正规交易平台的专业人士的意见。 在正式入市之前…...

基于混沌算法的图像加密解密系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着信息技术的迅猛发展&#xff0c;图像的传输和存储已经成为现代社会中不可或缺的一部分。然而&#xff0c;随着互联网的普及和信息的快速传播&am…...

vscode插件离线下载

离线下载插件地址&#xff1a;https://marketplace.visualstudio.com/VSCode...

第二十一章总结

一、网络通信&#xff1a; 1.网络程序设计基础&#xff1a;网络程序设计编写的是与其他计算机进行通信的程序。 1.1局域网与互联网&#xff1a;为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机 2.网络协议&#xff1a;网络协议规定了计算机之间连接的…...

查看端口占用并杀死进程

1.安装查看工具 sudo yum install net-tools 2.查看占用情况 netstat -tunlp | grep 8089 3.杀死进程 kill -9 227...

前后端数据传输格式(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 作为后端&#xff0c;写…...

maven的package和install命令有什么区别以及Maven常用命令与GAV坐标与Maven依赖范围与Maven依赖传递与依赖排除与统一声明版本号

maven的package和install命令有什么区别以及Maven常用命令与GAV坐标与Maven依赖范围与Maven依赖传递与依赖排除与统一声明版本号 一: maven的package和install命令有什么区别 一般都与clean命令结合使用 mvn package 生成target目录&#xff0c;编译、测试代码&#xff0c;…...

【动手学深度学习】(六)权重衰退

文章目录 一、理论知识二、代码实现2.1从零开始实现2.2简洁实现 【相关总结】 主要解决过拟合 一、理论知识 1、使用均方范数作为硬性限制&#xff08;不常用&#xff09; 通过限制参数值的选择范围来控制模型容量 通常不限制偏移b 小的意味着更强的正则项 使用均方范数作为柔…...

动手学习深度学习-跟李沐学AI-自学笔记(3)

一、深度学习硬件-CPU和GPU 芯片&#xff1a;Intel or AMD 内存&#xff1a;DDR4 显卡&#xff1a;nVidia 芯片可以和GPU与内存通信 GPU不能和内存通信 1. CPU 能算出每一秒能运算的浮点运算数&#xff08;大概0.15左右&#xff09; 1.1 提升CPU利用率 1.1.1 提升缓存…...

3.2 Puppet 和 Chef 的比较与应用

Puppet 和 Chef 的比较与应用 文章目录 Puppet 和 Chef 的比较与应用Puppet 和 Chef 简介工作原理对比**模块化的重要性**&#xff1a; Puppet 和 Chef 简介 介绍 Puppet 和 Chef 这两个流行的配置管理工具的背景和用途。强调它们的共同目标&#xff1a;实现自动化的系统配置和…...

包头北京网站建设/淘宝seo优化是什么意思

例如&#xff1a;数据库中的STATE字段对应的数字是1与0&#xff0c;当要将1显示在gridview上&#xff0c;显示为‘是’&#xff0c;0显示为‘否’&#xff0c;可以通过下面的语句实现。BZZT是STATE的别名&#xff0c;gridview绑定的时候(fieldname)&#xff0c;要绑定到BZZT上。…...

网站建设服务哪个便宜/杭州网站建设

写在前面的话我这里&#xff0c;三个节点的bigdata集群。分别为master、slave1和slave2。1、Phoenix的下载我的HBase版本是hbase-0.98.19。下载地址&#xff1a;注意&#xff1a;(hbase的版本一定要与phoenix的版本保持一致&#xff0c;否则运行报错,hbase-0.99没有相关的版本下…...

minecraft做图网站/sem 推广软件

环境&#xff1a;阿里云服务器CentOS7&#xff0c;JDK8&#xff0c;SpringBoot2.0&#xff0c;网易163邮箱账号和授权码 application.yaml邮件配置 spring:mail:default-encoding: utf-8#邮箱服务器host: smtp.163.com#host: stmp.qq.com#邮箱授权码password: 你的授权码#邮箱u…...

网站运营需要哪些技术/海淀区seo引擎优化多少钱

Lecture 8 Additional Storage Linux上所有的存储设备都需要有一个设备文件对应&#xff0c;这些设备文件位于/dev/目录下。 USB&#xff0c;SCSI&#xff0c;SATA&#xff0c;iscsi设备以sd开头&#xff0c;IDE以hd开头。表示方式&#xff1a;/dev/sd[a-z]N。 这些设备文件由u…...

潍坊网站建设官网/福建seo快速排名优化

今天做form表单提交遇到了两个问题: 1.提交后不能跳转到指定页面 jsp代码 <form class"form-horizontal" role"form"><p class"task-title">新增</p><div id"field-list"><!--表单项--></div><…...

满城网站建设/如何制作网站教程

三子棋代码实现思路&#xff1a; 一.菜单&#xff08;是否开始游戏&#xff09;—->打印棋盘—–>玩家下&#xff08;电脑下&#xff09;—->判断输赢*** 二.我们需要创建头文件game.h, 源文件game.c 和test.h*** 1.game.h用于函数的定义 #define _CRT_SECURE_NO_…...