剖析容器运行时

news/2024/5/1 19:38:55/文章来源:https://blog.csdn.net/m0_57776598/article/details/126963904

特别说明:一部分转载自大佬文章:https://blog.csdn.net/weixin_39246554/article/details/120926174(不得不说大佬总结的真好啊!!!)
剩下的听老王公开课总结。

k8s官网关于运行时的说明:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/

1、容器运行时

1.Docker的发展历程
从 Docker 1.11 版本开始,Docker 容器运行就不是简单通过 Docker Daemon 来启动了,而是通过集成 containerd、runc 等多个组件来完成的。虽然 Docker Daemon 守护进程模块在不停的重构,但是基本功能和定位没有太大的变化,一直都是 CS 架构,守护进程负责和 Docker Client 端交互,并管理 Docker 镜像和容器。现在的架构中组件 containerd 就会负责集群节点上容器的生命周期管理,并向上为 Docker Daemon 提供 gRPC 接口。(说明:docker daemon(守护进程):相当就是一个代理了;)

(两张图看那个都行)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dp9JQpmP-1663687704101)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663683306533.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TmZw8iur-1663687704102)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663676898737.png)]

当我们要创建一个容器的时候,现在 Docker Daemon 并不能直接帮我们创建了,而是请求 containerd 来创建一个容器,containerd 收到请求后,也并不会直接去操作容器,而是创建一个叫做 containerd-shim 的进程,让这个进程去操作容器,我们指定容器进程是需要一个父进程来做状态收集、维持 stdin 等 fd 打开等工作的,假如这个父进程就是 containerd,那如果 containerd 挂掉的话,整个宿主机上所有的容器都得退出了,而引入 containerd-shim 这个垫片就可以来规避这个问题了。

注:这里的containerd-shim 和下面的docker-shim不是一个东西,docker-shim是为了专门填充CRI和Docker Engine之间的空白的。

containerd-shim:可以翻译成垫片或者中间件。
Containerd-shim可以认为是托管我们容器父进程的一个工具;
每一个容器起起来之后,都会有一个conatinerd-shim存在;
containerd-shim主要是来控制你的容器的;

然后创建容器需要做一些 namespaces 和 cgroups 的配置,以及挂载 root 文件系统等操作,这些操作其实已经有了标准的规范,那就是 OCI(开放容器标准),runc 就是它的一个参考实现(Docker 被逼无耐将 libcontainer 捐献出来改名为 runc 的),这个标准其实就是一个文档,主要规定了容器镜像的结构、以及容器需要接收哪些操作指令,比如 create、start、stop、delete 等这些命令。runc 就可以按照这个 OCI 文档来创建一个符合规范的容器,既然是标准肯定就有其他 OCI 实现,比如 Kata、gVisor 这些容器运行时都是符合 OCI 标准的。(说明:runc就是一个二进制命令;)所以真正启动容器是通过 containerd-shim 去调用 runc 来启动容器的,runc 启动完容器后本身会直接退出,containerd-shim 则会成为容器进程的父进程, 负责收集容器进程的状态, 上报给 containerd, 并在容器中 pid 为 1 的进程退出后接管容器中的子进程进行清理, 确保不会出现僵尸进程。

而 Docker 将容器操作都迁移到 containerd 中去是因为当前做 Swarm,想要进军 PaaS 市场,做了这个架构切分,让 Docker Daemon 专门去负责上层的封装编排,当然后面的结果我们知道 Swarm 在 Kubernetes 面前是惨败,然后 Docker 公司就把 containerd 项目捐献给了 CNCF 基金会,这个也是现在的 Docker 架构。

2.CRI

我们知道 Kubernetes 提供了一个 CRI 的容器运行时接口,那么这个 CRI 到底是什么呢?这个其实也和 Docker 的发展密切相关的。(说明:所谓接口,就是它定义了一个行为,你只要按我的行为来实现了,那么我就能支持你;)

在 Kubernetes 早期的时候,当时 Docker 实在是太火了,Kubernetes 当然会先选择支持 Docker,而且是通过硬编码的方式直接调用 Docker API,后面随着 Docker 的不断发展以及 Google 的主导,出现了更多容器运行时,Kubernetes 为了支持更多更精简的容器运行时,Google 就和红帽主导推出了 CRI 标准,用于将 Kubernetes 平台和特定的容器运行时(当然主要是为了干掉 Docker)解耦。

CRI(Container Runtime Interface 容器运行时接口)本质上就是 Kubernetes 定义的一组与容器运行时进行交互的接口,所以只要实现了这套接口的容器运行时都可以对接到 Kubernetes 平台上来。不过 Kubernetes 推出 CRI 这套标准的时候还没有现在的统治地位,所以有一些容器运行时可能不会自身就去实现 CRI 接口,于是就有了 shim(垫片), 一个 shim 的职责就是作为适配器将各种容器运行时本身的接口适配到 Kubernetes 的 CRI 接口上,其中 dockershim 就是 Kubernetes 对接 Docker 到 CRI 接口上的一个垫片实现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Vtccyuq-1663687704102)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663677001768.png)]

Kubelet 通过 gRPC 框架与容器运行时或 shim 进行通信,其中 kubelet 作为客户端,CRI shim(也可能是容器运行时本身)作为服务器。

CRI 定义的 API 主要包括两个 gRPC 服务,ImageService 和 RuntimeService,ImageService 服务主要是拉取镜像、查看和删除镜像等操作,RuntimeService 则是用来管理 Pod 和容器的生命周期,以及与容器交互的调用(exec/attach/port-forward)等操作,可以通过 kubelet 中的标志 --container-runtime-endpoint 和 --image-service-endpoint 来配置这两个服务的套接字。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6VfTM7mR-1663687704103)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663677011180.png)]

不过这里同样也有一个例外,那就是 Docker,由于 Docker 当时的江湖地位很高,Kubernetes 是直接内置了 dockershim 在 kubelet 中的,所以如果你使用的是 Docker 这种容器运行时的话是不需要单独去安装配置适配器之类的,当然这个举动似乎也麻痹了 Docker 公司。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epS18FsA-1663687704103)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663677019294.png)]

现在如果我们使用的是 Docker 的话,当我们在 Kubernetes 中创建一个 Pod 的时候,首先就是 kubelet 通过 CRI 接口调用 dockershim,请求创建一个容器,kubelet 可以视作一个简单的 CRI Client, 而 dockershim 就是接收请求的 Server,不过他们都是在 kubelet 内置的。

dockershim 收到请求后, 转化成 Docker Daemon 能识别的请求, 发到 Docker Daemon 上请求创建一个容器,请求到了 Docker Daemon 后续就是 Docker 创建容器的流程了,去调用 containerd,然后创建 containerd-shim 进程,通过该进程去调用 runc 去真正创建容器。

其实我们仔细观察也不难发现使用 Docker 的话其实是调用链比较长的,真正容器相关的操作其实 containerd 就完全足够了,Docker 太过于复杂笨重了,当然 Docker 深受欢迎的很大一个原因就是提供了很多对用户操作比较友好的功能,但是对于 Kubernetes 来说压根不需要这些功能,因为都是通过接口去操作容器的,所以自然也就可以将容器运行时切换到 containerd 来。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qAyz8nIZ-1663687704104)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663677026598.png)]

切换到 containerd 可以消除掉中间环节,操作体验也和以前一样,但是由于直接用容器运行时调度容器,所以它们对 Docker 来说是不可见的。 因此,你以前用来检查这些容器的 Docker 工具就不能使用了。

你不能再使用 docker ps 或 docker inspect 命令来获取容器信息。由于不能列出容器,因此也不能获取日志、停止容器,甚至不能通过 docker exec 在容器中执行命令。

当然我们仍然可以下载镜像,或者用 docker build 命令构建镜像,但用 Docker 构建、下载的镜像,对于容器运行时和 Kubernetes,均不可见。为了在 Kubernetes 中使用,需要把镜像推送到镜像仓库中去。

从上图可以看出在 containerd 1.0 中,对 CRI 的适配是通过一个单独的 CRI-Containerd 进程来完成的,这是因为最开始 containerd 还会去适配其他的系统(比如 swarm),所以没有直接实现 CRI,所以这个对接工作就交给 CRI-Containerd 这个 shim 了。

然后到了 containerd 1.1 版本后就去掉了 CRI-Containerd 这个 shim,直接把适配逻辑作为插件的方式集成到了 containerd 主进程中,现在这样的调用就更加简洁了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZOv0LU5O-1663687704105)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663677038271.png)]

与此同时 Kubernetes 社区也做了一个专门用于 Kubernetes 的 CRI 运行时 CRI-O,直接兼容 CRI 和 OCI 规范。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EcPQKgOQ-1663687704106)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663677046711.png)]

这个方案和 containerd 的方案显然比默认的 dockershim 简洁很多,不过由于大部分用户都比较习惯使用 Docker,所以大家还是更喜欢使用 dockershim 方案。

说明:据说,cri-o的性能没有containerd好,并且containerd是已经在生产里经受住了考验,至少目前不推荐使用cri-o,建议使用containerd;

但是随着 CRI 方案的发展,以及其他容器运行时对 CRI 的支持越来越完善,Kubernetes 社区在2020年7月份就开始着手移除 dockershim 方案了:https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2221-remove-dockershim,现在的移除计划是在 1.20 版本中将 kubelet 中内置的 dockershim 代码分离,将内置的 dockershim 标记为维护模式,当然这个时候仍然还可以使用 dockershim,目标是在 1.23/1.24 版本发布没有 dockershim 的版本(代码还在,但是要默认支持开箱即用的 docker 需要自己构建 kubelet,会在某个宽限期过后从 kubelet 中删除内置的 dockershim 代码)。

那么这是否就意味这 Kubernetes 不再支持 Docker 了呢?当然不是的,这只是废弃了内置的 dockershim 功能而已,Docker 和其他容器运行时将一视同仁,不会单独对待内置支持,如果我们还想直接使用 Docker 这种容器运行时应该怎么办呢?可以将 dockershim 的功能单独提取出来独立维护一个 cri-dockerd 即可,就类似于 containerd 1.0 版本中提供的 CRI-Containerd,当然还有一种办法就是 Docker 官方社区将 CRI 接口内置到 Dockerd 中去实现。

但是我们也清楚 Dockerd 也是去直接调用的 Containerd,而 containerd 1.1 版本后就内置实现了 CRI,所以 Docker 也没必要再去单独实现 CRI 了,当 Kubernetes 不再内置支持开箱即用的 Docker 的以后,最好的方式当然也就是直接使用 Containerd 这种容器运行时,而且该容器运行时也已经经过了生产环境实践的,接下来我们就来学习下 Containerd 的使用。

3、kubernetes调用runtime的变化(补充)

(1)蜜月期:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QIM1A8NX-1663687704107)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663683570590.png)]

最初期,kubernetes除了docker别无选择,所以kubernetes就内置了docker client,然后直接和docker Engine(或者是Docke服务端)直接相连。但是这种状态并没有持续太久,因为Google有野心,他不可能一辈子屈服于Docker,如果是这样做kubernetes就被Docker牵着鼻子走,因为docker一旦发生变化,kubernetes也需要发生一系列的改动。

(2)潜伏期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MeeZ9a18-1663687704107)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663683849515.png)]

kubernetes不甘心受控于docker,因此kubernetes发明了CRI(容器运行时接口),所谓的CRI接口就是kubernetes给出个公开的接口,接口尽可能保持稳定,但后一些运行时通过这个接口加入到kubernetes中去,从而实现kubernetes和docker的集成。但是当时的docker如日中天,docker不可能主动上贴kubernetes,docker不可能遵守kubernetes的CRI,所以kubernetes开发了dockershim,并且是为了注定兼容docker而发明的,dockershim可以理解为是个中间件,或者是个“垫片”,起作用就是使得kubernetes连接docker而发明的,kubernetes连接dockershim,dockershim连接docker,而从达到kubernetes集成docker的目的

由于dockershim是集成在kubernetes里面的,因此安装kubernetes是会默认自动安装dockershim组件。

(其实到这一步,kubernetes还是在附着于docker。然后kubernetes开始采取措施了)

(3)采取手段:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMGCXsup-1663687704108)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663684374174.png)]

看上图,kubernetes不在把dockershim集成到kubernetes里面了,而是把dockershim独立出来,dockershim是个独立的软件,和第二阶段不同的是,此时在安装kubernetes时,不会自动安装dockershim,虽然dockershim是独立的但是dockershim还是有kubernetes开发的。

(4)分道扬镳

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEdjFVUt-1663687704109)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663684718513.png)]

在v1.24版本发布后,宣布彻底废除dockershim,换就句话说就是kubernetes不再依附于docker了。此时的市场是容器编排技术就kubernetes一家独大,而容器技术去出现很多,比如:containerd,红帽的podman等等。因此kubernetes采取个狠毒的手段:kubernetes不在发布dockershim组件,那既然没有了dockershim,docker也就没办法通过CRI和kubernetes结合使用了,因此docker面对如此大的市场陷入了尴尬的场面。因此docker自身降低身段,自己发明了cri-dockerd组件,然后使用此组件并通过CRI主动贴近于kubernetes,从而和kubernetes集成使用。

因此在v1.24版本之前,我们部署kubernetes平台时,只需要把kubernetes装上,docker装上就行了,因为dockershim时安装k8s时自动安装的。

但是在v1.24版本之后想要部署k8s平台需要多安装个组件:cri-docker,就是需要安装k8s,docker,cri-dockerd才能搭建出kubernetes平台。不过cri-dockerd这个组件,docker官方帮我们开发出来了,我们需要在官网下载安装即可。

4、k8s将弃用docker!

在Kubernetes平台中,为了解决与容器运行时(例如Docker)集成问题,在早期社区推出了CRI(Container Runtime Interface,容器运行时接口),以支持更多的容器运行时。 当我们使用Docker作为容器运行时之后,架构是这样的,如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1YSxhXbX-1663687704109)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663677104430.png)]

Kubernetes 计划弃用就是kubelet中dockershim。即 Kubernetes kubelet 实现中的组件之一,它能够与 Docker Engine 进行通信。

为什么这么做?
• Docker内部调用链比较复杂,多层封装和调用,导致性能降低、提升故障率、不易排查
• Docker还会在宿主机创建网络规则、存储卷,也带来了安全隐患

如何应对?
在未来的 Kubernetes 版本彻底放弃 Docker 支持之前,引入受支持的容器运行时。
除了docker之外,CRI还支持很多容器运行时,例如:
• containerd:containerd与Docker相兼容,相比Docker轻量很多,目前较为成熟
• cri-o,podman:都是红帽(RedHat)项目,目前红帽主推podman

QA:k8s不支持docker了其实,现在docker已经在走标准的runc接口了。docker本身的问题:它有一个非常厚重的docker daemon,它本身的稳定性不是很好,所以现在既然它已经走了标准协议了,那么k8s所谓的不支持docker,其实,它可以通过,更轻量级,性能更好,更稳定的容器运行时,例如containerd来替换docker,即docker本身已经在k8s这里已经没有存在的必要了。
docker太重了,问题很多,切到containerd以后性能和稳定性都有提升;
k8s的价值就是在不影响业务的情况下,基础架构能升级了;使用docker,是Kubelet先通过dockershim调用docker,再通过docker调用containerd去运行镜像。使用Containerd,是由kubelet直接通过CRI调用containerd去运行镜像,相比docker,减少调用链,资源占用会也减少;相应的性能就提升了

3、总结
容器运行时是k8s底层的一个基础;

注意:关于容器运行时的一些概念很容易混淆,需要理清一点!

docker、docker daemon(守护进程)、containerd、containerd-shim(可以翻译成垫片或者中间件。)、runc(oci规范的一个实现)libcontainer:Docker 被逼无耐将 libcontainer 捐献出来改名为 runc 的;OCI、CRI–规范;cri-docker-shim符合CRI的容器运行时如下:
containerd:containerd与Docker相兼容,相比Docker轻量很多,目前较为成熟;部分大厂已经在向containerd这方面切了;
cri-o,podman:都是红帽(RedHat)项目,目前红帽主推podman;
kata;
gVisor;

6、V1.24之后安装kubernetes图解

以下三张图说明安装变化:

kubernetes-v1.20之前内置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5EVHgrNg-1663687704110)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663685437640.png)]

kubernetes-v1.20-24之间自行安装dockershim:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAl1b9VZ-1663687704110)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663685468644.png)]

kubernetes-v1.24之后,需要自行安装cri-dockerd。

整体部署方案图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhOViliv-1663687704111)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1663686095556.png)]

图解:

有三种容器运行时去部署kubernetes:docker、containerd、cri-o(红帽研发)。

但是发现无论是使用docker运行时还是containerd运行时都需要contaierd组件,containerd组件是docker开源给CNCF了。

就是有一条:使用docker我们可以安装docker-clinet,所以我们可以使用docker命令,但是如果使用containerd由于没有安装docker-clinet我们不可以使用docker命令,因此不可维护容器。

同时可以发现:containerd和docker需要使用containerd和runc组件,而cri-o需要使用runc组件,而containerd和runc组件都是docker开源的,因此kubernetes只是表面脱离docker,其实内部还是离不开docker的影响。

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

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

相关文章

Typora Mac版本安装Pandoc导出文件为word格式(windows可通用)

我们在用Typora时导出的格式常常为PDF格式,但是如果我们要将文件导出为word格式的时候却需要安装插件PanDoc,我目前使用的是Mac版本的Typora,给大家分享一下如何安装Pandoc以及导出word格式文件。 1.根据Typora中的说明进入GitHub下载Pandoc…

Maven安装配置

Maven安装配置一、下载 apache-maven-3.6.1Maven官网:https://maven.apache.org/download.cgi(或)直接下载maven-3.8.6:https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.zip解压到当前文件夹二、配置 maven 环境变量右键此电脑 - 属性 - 高级…

MySQL学习——执行计划

MySQL中可以通过explain关键字模拟优化器执行SQL语句,从而知道MySQL是如何处理SQL语句的,这将有利我们做代码的优化。 1、MySQL查询执行过程客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,若缓存中存在,则立刻返回存储在缓存中的结果。否则进入下一阶段 服务…

扫码挪车小程序源码专业版上线了

1 、做挪车码之前,先说一些我个人的观点,大家一起探讨学习交流。 2 、挪车码已经是普遍已久的项目,其核心主要在于解决了车主的隐私问题。 3 、观察过目前市面上所有的挪车码系统, 公司也购买了一套测试了完整流程,盈…

【图像分割】基于matlab萤火虫算法图像分割【含Matlab源码 2136期】

一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【图像分割】基于matlab萤火虫算法图像分割【含Matlab源码 2136期】 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏图像处理(Matlab) 备注: 点击上面蓝色字体付费专栏图像处理(Matlab),…

parted分区步骤

parted分区步骤概述 通常我们用的比较多的一般都是fdisk工具来进行分区,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大;而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘。但是现在的磁盘空间很多都已经是远远大于2T了,甚至达到2.5T和3T,那要怎么办能,有两…

路径规划总结(一)

第三讲 路径规划 ps:排版有一些问题,懒得改了,见Github 一、导航规划简介 导航规划:在给定环境的全局或局部知识以及一个或者一系列目标位置的条件下,使机器人能够根据知识和传感器感知信息高效可靠地到达目标位置。 导航规划类…

告别传统FTP!该了解一下替代FTP的新产品了

在某些情况下,需要从服务器上传(或下载)文件。多年来,最流行的文件传输方法是文件传输协议(FTP)。FTP的一大优点是它支持断点续传。FTP收获了方便性,却在安全性上有所欠缺。FTP未加密,这意味着格…

Cache-Augmented Inbatch Importance Resampling for Training Recommender Retriever

目录概符号说明启发本文方法BIR (inbatch importance resampling)XIR (Cache-Augmented Resampling)Chen J., Lian D., Li Y., Wang B., Zheng K. and Chen E. Cache-augmented inbatch importance resampling for training recommender retriever. In Advances in Neural Info…

一条sql了解MYSQL的架构设计

1 前言 对于一个服务端开发来说 MYSQL 可能是他使用最熟悉的数据库工具,然而,大部分的Java工程师对MySQL的了解和掌握程度,大致就停留在这么一个阶段:它可以建库、建表、建索引,然后就是对里面的数据进行增删改查,语句…

MacOS/OSX docker修改已运行容器参数的方法

比如我们刚刚docker run了一个容器,然后里面已经配置了一些信息,装了一些东西,然后我发现我忘记了挂载一个文件夹,怎么修改他们呢? 第一个方法: export容器为镜像再import这个镜像 第二个方法: 把现有的容器提交成镜像,然后重新运行. 以上两种方法都相当于你把一台电…

配置服务器入栈

配置服务器入栈 上回传送门 书接上回 登录我们的服务器管理页面 点击入站列表->点击号 配置如下 注意: 协议是vless 域名是cloudflare上我们设置的二级域名 公钥文件路径就是我们SHH工具上root 文件夹下cret 文件夹下面的证书 公钥名就是我们的证书路径 密钥…

Spring Cloud Alibaba现在还值不值学 ?

6年前面试最常问的并且可以顺利拿到高薪的技能是 Dubbo ,2年前面试,只要你简历上有 Spring Cloud 项目的相关经验,肯定会打动面试官,现在呢?恐怕简历上有Dubbo和简单的Spring Cloud技术和经验是无法让面试官高看你的。…

Eureka注册中心以及Ribbon负载均衡

Eureka注册中心 远程调用的问题 1、服务消费者改如何获取服务提供者的地址消息? 2、如果服务提供者有多个,消费者如何进行选择? 3、 消费者如何得知服务提供者的健康状态? Eureka的作用 服务每隔30s给Eureka发送心跳,…

一个技术创业者的自白:三条关于 “选择” 的建议

本文作者 Wyze CTO 刘天强。内容源自「声网开发者创业讲堂第一期」的演讲分享。创业方向:兴趣 VS 趋势 大家在创业的时候首先要选择的是 “做什么”?如何平衡个人特长、兴趣以及风口是创业者面临的难题。我在第一次创业的时候,做了一家主打图像识别 API 的公司 Orbeus,这家…

水电站生态流量下泄监测解决方案

水电站生态流量下泄监测解决方案   一些水电站因下泄生态流量不足造成部分河段减水、脱水甚至干涸的情况,使得群众的生产、生活以及河流的正常生态功能受到了一定程度的影响。计讯物联水电站生态流量下泄监测解决方案精准测量、实时监测、视频监控、预警提醒、及时…

JWT实现用户token令牌管理

以前的登录: 用户登录成功返回user对象 将user对象存储在session中 在拦截器中取出session中的user对象,判断是否已经登录,决定是否放行 token: 用户登录成功后,根据指定的用户信息生成一个token令牌 token令牌是…

Matlab论文插图绘制模板第49期—散点矩阵图(Plotmatrix)

在之前的文章中,分享了很多Matlab散点图的绘制模板: 这一次,再来分享一种特殊的散点图:散点矩阵图。 先来看一下成品效果: 本文主要展示带直方图的散点矩阵图的绘制方法,不带直方图的散点矩阵图的绘制方法…

【智能优化算法-水循环算法】基于蒸发的水循环算法求解用带约束的优化问题附matlab代码

1 内容介绍 2 部分代码 clear all; clc; close all; format long g objective_function=@fun; constraints=@Constraints; for k=1:1 % Number of independent runds %=====================================================================&#

半车(前后、左右)、整车悬架模型仿真分析

目录 前言 1.前后(Pitch)半车主动悬架模型 1.1 simulink前后半车悬架建模 1.1.2 搭积木法建模 1.1.3 S-Function建模(被动悬架为例) 1.2 仿真结果 2.左右(Roll)半车悬架模型(不含转向) 2.1 Simulink模型 2.2 仿真结果 3.整车悬架模型(不含转向) 3.1 整车7自由度主动悬架数…