在 520 这天,竟然有人把 Docker讲清楚了? | 原力计划

作者 | 夏目 "

责编 | 王晓曼

头图 | CSDN下载自东方IC

出品 | CSDN博客


简介


1、了解Docker的前生LXC

LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。

与传统虚拟化技术相比,它的优势在于:

(1)与宿主机使用同一个内核,性能损耗小

(2)不需要指令级模拟

(3)不需要即时(Just-in-time)编译

(4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制

(5)避免了准虚拟化和系统调用替换中的复杂性

(6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享

总结:Linux Container是一种轻量级的虚拟化的手段。

LinuxContainer提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像Chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为LXC是一种操作系统层次上的资源的虚拟化。

2、LXC与Docker什么关系?

Docker并不是LXC替代品,Docker底层使用了LXC来实现,LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够课哦内阁制各进程的资源分配。

在LXC的基础之上,Docker提供了一系列更强大的功能。

3、什么是Docker

Docker是一个开源的应用容器引擎,基于Go语言开发并遵循了Apache2.0协议开源。

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux服务器,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。

4、Docker官方文档

https://docs.docker.com/

5、为什么Docker越来越受欢迎

官方话语:

  • 容器化越来越受欢迎

  • 灵活:即使是最复杂的应用也可以集装箱化

  • 轻量级:容器利用并共享主机9内核

  • 可互换:您可以即时部署更新和升级

  • 便携式:您可以在本地构建,部署到云,并在任何地方运行

  • 可扩展:您可以增加并自动分发容器副本

  • 可堆叠:您可以垂直和即时堆叠服务

镜像和容器(Contalners)

通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。

容器是镜像的运行实例,当被运行时有镜像状态和用户进程,可以使用Docker PS 查看。

容器和虚拟机

容器时在Linux上本机运行,并与其他容器共享主机的内核,它运行的一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。

虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。


6、Docker版本

DockerCommunity Edition(CE)社区版

EnterpriseEdition(EE) 商业版

7、Docker和Openstack的几项对比


8、容器在内核中支持2种重要技术

Docker本质就是宿主机的一个进程,Docker是通过Namespace实现资源隔离,通过Cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500G并不是实际占用物理磁盘500G)。

1)Namespaces 名称空间


2)Control Group 控制组

Cgroup的特点是: 

  • Cgroup的API以一个伪文件系统的实现方式,用户的程序可以通过文件系统实现Cgroup的组件管理

  • Cgroup的组件管理操作单元可以细粒度到线程级别,另外用户可以创建和销毁Cgroup,从而实现资源载分配和再利用

  • 所有资源管理的功能都以子系统的方式实现,接口统一子任务创建之初与其父任务处于同一个Cgroup的控制组

四大功能

  • 资源限制:可以对任务使用的资源总额进行限制

  • 优先级分配:通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级

  • 资源统计:可以统计系统的资源使用量,如CPU时长,内存用量等

  • 任务控制:Cgroup可以对任务执行挂起、恢复等操作

9、了解Docker三个重要概念

1)Image镜像

Docker镜像就是一个只读模板,比如,一个镜像可以包含一个完整的centos,里面仅安装apache或用户的其他应用,镜像可以用来创建Docker容器,另外Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下周一个已经做好的镜像来直接使用。

2)Container容器

Docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台,可以吧容器看做是要给简易版的Linux环境(包括Root用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序。

3)Repostory仓库

仓库是集中存储镜像文件的沧桑,Registry是仓库主从服务器,实际上参考注册服务器上存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为两种,公有参考,和私有仓库,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下周,国内的Docker Pool,这里仓库的概念与Git类似,Registry可以理解为Github这样的托管服务。

10、Docker的主要用途

官方就是Bulid 、Ship、Run anyapp/any where,编译、装载、运行、任何App/在任意地放都能运行。

就是实现了应用的封装、部署、运行的生命周期管理只要在Glibc的环境下,都可以运行。

运维生成环境中:Docker化。

  • 发布服务不用担心服务器的运行环境,所有的服务器都是自动分配Docker,自动部署,自动安装,自动运行

  • 再不用担心其他服务引擎的磁盘问题,CPU问题,系统问题了

  • 资源利用更出色

  • 自动迁移,可以制作镜像,迁移使用自定义的镜像即可迁移,不会出现什么问题

  • 管理更加方便了

11、Docker改变了什么

  • 面向产品:产品交付

  • 面向开发:简化环境配置

  • 面向测试:多版本测试

  • 面向运维:环境一致性

  • 面向架构:自动化扩容(微服务)

Docker架构

1、总体架构

  • Distribution负责与Dockerregistry交互,上传洗澡镜像以及V2 registry 有关的源数据

  • Registry负责Docker registry有关的身份认证、镜像查找、镜像验证以及管理Registry mirror等交互操作

  • Image负责与镜像源数据有关的存储、查找,镜像层的索引、查找以及镜像TAR包有关的导入、导出操作

  • Reference负责存储本地所有镜像的Repository和tag名,并维护与镜像Id之间的映射关系

  • Layer模块负责与镜像层和容器层源数据有关的增删改查,并负责将镜像层的增删改查映射到实际存储镜像层文件的Graphdriver模块

  • Graghdriver是所有与容器镜像相关操作的执行者

2、Docker架构2

如果觉得上面架构图比较乱可以看这个架构:


从上图不难看出,用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。

而Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;而后Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。

Job的运行过程中,当需要容器镜像时,则从DockerRegistry中下载镜像,并通过镜像管理驱动Graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动Networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Execdriver来完成。

而Libcontainer是一项独立的容器管理包,Networkdriver以及Execdriver都是通过Libcontainer来实现具体对容器进行的操作。当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。

3、Docker架构3

再来看看另外一个架构,这个个架构就简单清晰指明了server/client交互,容器和镜像、数据之间的一些联系。


这个架构图更加清晰了架构:

Dockerdaemon就是Docker的守护进程即server端,可以是远程的,也可以是本地的,这个不是C/S架构吗,客户端Docker Client 是通过Nest Api进行通信。

Dockercli 用来管理容器和镜像,客户端提供一个只读镜像,然后通过镜像可以创建多个容器,这些容器可以只是一个RFS(Root File System根文件系统),也可以ISHI一个包含了用户应用的RFS,容器再Docker Client中只是要给进程,两个进程之间互不可见。

用户不能与Server直接交互,但可以通过与容器这个桥梁来交互,由于是操作系统级别的虚拟技术,中间的损耗几乎可以不计。

Docker架构2各个模块的功能(完善)


主要的模块有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、Libcontainer以及Docker Container。

1、Docker Client

DockerClient 是Docker架构中用户用来和Docker Daemon建立通信的客户端,用户使用的可执行文件为Docker,通过Docker命令行工具可以发起众多管理container的请求。

DockerClient可以通过一下三宗方式和Docker Daemon建立通信:tcp://host:port;unix:path_to_socket;fd://socketfd,Docker Client可以通过设置命令行Flag参数的形式设置安全传输层协议(TLS)的有关参数,保证传输的安全性。

DockerClient发送容器管理请求后,由Docker Daemon接受并处理请求,当Docker Client 接收到返回的请求相应并简单处理后,Docker Client 一次完整的生命周期就结束了,当需要继续发送容器管理请求时,用户必须再次通过Docker可以执行文件创建Docker Client。

2、Docker Daemon

DockerDaemon 是Docker架构中一个常驻在后台的系统进程,功能是:接收处理Docker Client发送的请求。该守护进程在后台启动一个server,server负载接受Docker Client发送的请求;接受请求后,server通过路由与分发调度,找到相应的handler来执行请求。

DockerDaemon启动所使用的可执行文件也为Docker,与Docker Client启动所使用的可执行文件Docker相同,在Docker命令执行时,通过传入的参数来判别Docker daemon与Docker Client。

DockerDaemon的架构可以分为:Docker Server、Engine、Job、Daemon

3、Docker Server

DockerServer在Docker架构中时专门服务于Docker Client的server,该server的功能时:接受并调度分发Docker Dlient发送的请求,架构图如下:


在Docker的启动过程中,通过包Gorilla/Mux(Golang的类库解析),创建了一个Mux.Router,提供请求的路由功能。在Golang中,Gorilla/Mux是一个强大的URL路由器以及调度分发器。该Mux.Router中添加了众多的路由项,每一个路由项由HTTP请求方法(PUT、POST、GET或DELETE)、URL、Handler三部分组成。

若Docker Client通过HTTP的形式访问Docker Daemon,创建完Mux.Router之后,Docker将Server的监听地址以及Mux.Router作为参数,创建一个httpSrv=http.Server{},最终执行httpSrv.Serve()为请求服务。

在Server的服务过程中,Server在Listener上接受Docker Client的访问请求,并创建一个全新的Goroutine来服务该请求。在Goroutine中,首先读取请求内容,然后做解析工作,接着找到相应的路由项,随后调用相应的Handler来处理该请求,最后Handler处理完请求之后回复该请求。

需要注意的是:Docker Server的运行在Docker的启动过程中,是靠一个名为”serveapi”的Job的运行来完成的。原则上,Docker Server的运行是众多job中的一个,但是为了强调Docker Server的重要性以及为后续Job服务的重要特性,将该”serveapi”的Job单独抽离出来分析,理解为Docker Server。

4、Engine

Engine是Docker架构中的运行引擎,同时也Docker运行的核心模块。它扮演Docker Container存储仓库的角色,并且通过执行Job的方式来操纵管理这些容器。

在Engine数据结构的设计与实现过程中,有一个Handler对象。该Handler对象存储的都是关于众多特定Job的Handler处理访问。举例说明,Engine的handler对象中有一项为:{“create”: daemon.ContainerCreate,},则说明当名为”create”的job在运行时,执行的是Daemon.ContainerCreate的Handler。

5、Job

一个Job可以认为是Docker架构中Engine内部最基本的工作执行单元。Docker可以做的每一项工作,都可以抽象为一个Job。例如:在容器内部运行一个进程,这是一个Job;创建一个新的容器,这是一个Job,从Internet上下载一个文档,这是一个Job;包括之前在Docker Server部分说过的,创建Server服务于HTTP的API,这也是一个Job,等等。

Job的设计者,把Job设计得与Unix进程相仿。比如说:Job有一个名称,有参数,有环境变量,有标准的输入输出,有错误处理,有返回状态等。

6、Docker Registry

DockerRegistry是一个存储容器镜像的仓库。而容器镜像是在容器被创建时,被加载用来初始化容器的文件架构与目录。

在Docker的运行过程中,Docker Daemon会与Docker Registry通信,并实现搜索镜像、下载镜像、上传镜像三个功能,这三个功能对应的Job名称分别为”search”,”pull”与 “push”。

其中,在Docker架构中,Docker可以使用公有的Docker Registry,即大家熟知的Docker Hub,如此一来,Docker获取容器镜像文件时,必须通过互联网访问Docker Hub;同时Docker也允许用户构建本地私有的Docker Registry,这样可以保证容器镜像的获取在内网完成。

7、Graph

Graph在Docker架构中扮演已下载容器镜像的保管者,以及已下载容器镜像之间关系的记录者。一方面,Graph存储着本地具有版本信息的文件系统镜像,另一方面也通过GraphDB记录着所有文件系统镜像彼此之间的关系。

Graph的架构如下:

其中,GraphDB是一个构建在SQLite之上的小型图数据库,实现了节点的命名以及节点之间关联关系的记录。它仅仅实现了大多数图数据库所拥有的一个小的子集,但是提供了简单的接口表示节点之间的关系。

同时在Graph的本地目录中,关于每一个的容器镜像,具体存储的信息有:该容器镜像的元数据,容器镜像的大小信息,以及该容器镜像所代表的具体Rootfs。

8、Driver

Driver是Docker架构中的驱动模块。通过Driver驱动,Docker可以实现对Docker容器执行环境的定制。由于Docker运行的生命周期中,并非用户所有的操作都是针对Docker容器的管理,另外还有关于Docker运行信息的获取,Graph的存储与记录等。因此,为了将Docker容器的管理从Docker Daemon内部业务逻辑中区分开来,设计了Driver层驱动来接管所有这部分请求。

在Docker Driver的实现中,可以分为以下三类驱动:Graphdriver、Networkdriver和Execdriver。

Graphdriver主要用于完成容器镜像的管理,包括存储与获取。即当用户需要下载指定的容器镜像时,Graphdriver将容器镜像存储在本地的指定目录;同时当用户需要使用指定的容器镜像来创建容器的Rootfs时,Graphdriver从本地镜像存储目录中获取指定的容器镜像。

在Graphdriver的初始化过程之前,有4种文件系统或类文件系统在其内部注册,它们分别是Aufs、Btrfs、Vfs和Devmapper。而Docker在初始化之时,通过获取系统环境变量”DOCKER_DRIVER”来提取所使用Driver的指定类型。而之后所有的Graph操作,都使用该Driver来执行。

Graphdriver的架构如下:


Networkdriver的用途是完成Docker容器网络环境的配置,其中包括Docker启动时为Docker环境创建网桥;Docker容器创建时为其创建专属虚拟网卡设备;以及为Docker容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。Networkdriver的架构如下:


Execdriver作为Docker容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。在Execdriver的实现过程中,原先可以使用LXC驱动调用LXC的接口,来操纵容器的配置以及生命周期,而现在Execdriver默认使用Native驱动,不依赖于LXC。

具体体现在Daemon启动过程中加载的ExecDriverflag参数,该参数在配置文件已经被设为”native”。这可以认为是Docker在1.2版本上一个很大的改变,或者说Docker实现跨平台的一个先兆。Execdriver架构如下:


9、Libcontainer

Libcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的API。

正是由于Libcontainer的存在,Docker可以直接调用Libcontainer,而最终操纵容器的Namespace、Cgroups、Apparmor、网络设备以及防火墙规则等。这一系列操作的完成都不需要依赖LXC或者其他包。Libcontainer架构如下:


另外,Libcontainer提供了一整套标准的接口来满足上层对容器管理的需求。或者说,Libcontainer屏蔽了Docker上层对容器的直接管理。又由于Libcontainer使用Go这种跨平台的语言开发实现,且本身又可以被上层多种不同的编程语言访问,因此很难说,未来的Docker就一定会紧紧地和Linux捆绑在一起。而于此同时,Microsoft在其著名云计算平台Azure中,也添加了对Docker的支持,可见Docker的开放程度与业界的火热度。

暂不谈Docker,由于Libcontainer的功能以及其本身与系统的松耦合特性,很有可能会在其他以容器为原型的平台出现,同时也很有可能催生出云计算领域全新的项目。

10、Docker Container

DockerContainer(Docker容器)是Docker架构中服务交付的最终体现形式。

Docker按照用户的需求与指令,订制相应的Docker容器:

  • 用户通过指定容器镜像,使得Docker容器可以自定义Rootfs等文件系统

  • 用户通过指定计算资源的配额,使得Docker容器使用指定的计算资源

  • 用户通过配置网络及其安全策略,使得Docker容器拥有独立且安全的网络环境

  • 用户通过指定运行的命令,使得Docker容器执行指定的工作


版权声明:本文为CSDN博主「夏目"」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wuzhiwei549/article/details/106032491

 

推荐阅读

  • 如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!

  • 对不起,我把APP也给爬了

  • 震惊!阿里的程序员竟被一个简单的 SQL 查询难住了!

  • 如何告别“芯繁魂乱”难题?这个 OS 来支招!

  • 我佛了!用KNN实现验证码识别,又 Get 到一招!

  • 加密价格更新周期:看似杂乱无章,实际内藏玄机

  • 如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!

真香,朕在看了!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么它有典型FaaS能力,却是非典型FaaS架构?

阿里妹导读:FaaS—Function as a service,函数即服务。它是2014年由于亚马逊的AWS Lambda的兴起,而被大家广泛认知。FaaS能力是NBF中的一项非常重要的能力,NBF是一个非典型的FaaS架构,但是具备了典型的FaaS能力。文章将…

如何解决90%的问题?10位阿里大牛公布方法

世界在变,技术在变,需求在变。 唯一不变的是变化。 面对变化,技术人如何在不确定性的世界中寻找最优解? 查理芒格说:“掌握一定数量的思维模型,能解决这世上90%的问题。”与其在重复的“增、删、改、查”…

Hadoop集群安装部署_分布式集群安装_01

文章目录1. 分布式集群规划2. 数据清理3. 基础环境准备4. 配置ip映射5. 时间同步6. SSH免密码登录完善7. 免密登录验证1. 分布式集群规划 伪分布集群搞定了以后我们来看一下真正的分布式集群是什么样的 看一下这张图,图里面表示是三个节点,左边这一个是…

今天,Python信息量很大!

小白程序员Python自学之痛:第一周找学习资源,第二周入门到放弃,第三周怀疑自己。明明10元钱就能搞定的事情,为什么要反反复复折磨自己呢?为了让用户用更优惠的价格买到优质的课程,CSDN和老师反复争取&#…

闲鱼如何利用端计算提升推荐场景的ctr

背景 闲鱼作为一个电商场景的app,最丰富的部分就是作为商品宝贝浏览承载的feeds,比如首页下面的宝贝信息流,搜索结果页以及详情页下面的猜你喜欢,这些feeds场景都少不了推荐算法在背后的支撑。 传统的推荐算法是依托于云上沉淀的…

Hadoop集群安装部署_分布式集群安装_02

文章目录一、上传与 解压1. 上传安装包2. 解压hadoop安装包二、修改hadoop相关配置文件2.1. hadoop-env.sh2.2. core-site.xml2.3. hdfs-site.xml2.4. mapred-site.xml2.5. yarn-site.xml2.6. workers2.7. 修改启动脚本三、同步初始化3.1. 安装包同步3.2. 主节点格式化HDFS3.3.…

重要的节日那么多,要及时「缓存」你们的珍贵时光

作者 | 后端学长责编 | Carol出品 | 程序员 cxuan缓存概述在很久很久以前人类和洪水作斗争的过程中,水库发挥了至关重要的作用 : 在发洪水时可以蓄水,缓解洪水对下游的冲击;在干旱时可以把库存的水释放出来以供人们使用。这里的水库就起着缓存…

我和面试官之间关于操作系统的一场对弈 | 原力计划

作者 | Guide哥责编 | 伍杏玲出品 | CSDN博客大家好,我是 Guide 哥!很多读者抱怨计算操作系统的知识点比较繁杂,自己也没有多少耐心去看,但是面试的时候又经常会遇到。所以,我带着我整理好的操作系统的常见问题来啦&am…

LaTex中参考文献引用

一、引用参考文献 这里我们使用的是BibTeX的引用格式,因此文件中应包括两个文件(.bib-参考文献 和 .bst-文献格式)。 有了这两个文件后,我们在bib文件中创建参考文献:(注意,作者的名字是逗号前…

如何在Flutter上实现高性能的动态模板渲染

背景 最近小组在尝试使用一套阿里dinamicX的DSL,通过动态模板下发,实现Flutter端的动态化模板渲染;本来以为只是DSL到Widget的简单映射和数据绑定,但实际跑起来的效果出乎意料的差,列表卡顿严重,帧率丢失严…

稀疏数组(数据结构)

稀疏数组(数据结构) 需求:编写五子棋游戏中,有存盘和续上盘的功能 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 …

揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?

本文为 Apache Flink 新版本重大功能特性解读之 Flink SQL 系列文章的开篇,Flink SQL 系列文章由其核心贡献者们分享,涵盖基础知识、实践、调优、内部实现等各个方面,带你由浅入深地全面了解 Flink SQL。 1. 发展历程 今年的8月22日 Apache…

阿里面试官整理的JVM面试要点,99%的你都不知道!

最近网上出现一个面试题:“一个线程OOM后,其他线程还能运行吗?”网上出现了很多答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。在面试时被问到这个问题你是会哑口无言还…

6 个 K8s 日志系统建设中的典型问题,你遇到过几个?

作者 | 元乙 阿里云日志服务数据采集客户端负责人,目前采集客户端 logtail 在集团百万规模部署,每天采集上万应用数 PB 数据,经历多次双 11、双 12 考验。 导读:随着 K8s 不断更新迭代,使用 K8s 日志系统建设的开发者…

如何加快 Node.js 应用的启动速度

我们平时在开发部署 Node.js 应用的过程中,对于应用进程启动的耗时很少有人会关注,大多数的应用 5 分钟左右就可以启动完成,这个过程中会涉及到和集团很多系统的交互,这个耗时看起来也没有什么问题。 目前,集团 Serve…

技术人看《长安十二时辰》的正确姿势是?

阿里妹导读:从“叉手礼”、“水盆羊汤”、“酒晕妆”这些唐朝人的生活细节,到精美的坊间造型、充满意境的诗词歌赋,《长安十二时辰》不仅以缜密剧情赢得赞誉,更还原了一个真实的大唐长安。在精良制作之上,技术人如何让…

我们已经不用AOP做操作日志了! | 原力计划

来源 | JAVA葵花宝典责编 | 王晓曼、Carol 头图 | CSDN下载自东方IC前言用户在操作我们系统的过程中,针对一些重要的业务数据进行增删改查的时候,我们希望记录一下用户的操作行为,以便发生问题时能及时的找到依据,这种日志就是业务…

会向业务“砍需求”的技术同学,该具备哪6点能力?

阿里妹导读:“会”砍需求,并不是件容易的事情,这涉及到工程师的商业头脑,要会判断技术和业务的关系。技术与业务好比“两条腿”,相互配合才能走得更远。如何具备business sense就是我们今天的课题。 论工程师的商业头…

(进阶篇)Redis6.2.0 集群 主从复制_原理剖析_02

文章目录一、主从复制流程1. 主从复制流程图2. 主从复制日志二、主从复制信息剖析2.1. 主节点信息剖析2.2. 从节点信息剖析三、关键术语3.1. 复制功能开启3.2. 全量复制场景3.3. 主从复制异步性3.4. 过期key的处理3.5. 加速复制一、主从复制流程 1. 主从复制流程图 第一条线&a…

如何抢占云栖大会C位?史上最强强强攻略来了

如何抢占云栖大会C位?史上最强强强攻略来了 原文链接 本文为云栖社区原创内容,未经允许不得转载。