容器编排器们的自我介绍

哈喽大家好,我是咸鱼

咸鱼在《一文带你了解容器技术的前世今生》有介绍过容器技术的由来以及Docker项目的发展

我们知道,Docker 及其他容器技术能够极大地简化应用程序的部署,做到了”开箱即用“

俗话说:”凡是具有两面性“。容器技术给我们带来便利的同时,一些问题也随之出现了

随着企业规模或者说业务规模的不断扩大,应用程序越来越多、而每个应用程序往往又由多个容器组成

例如想要实现一个简单的数据库 web 界面也可能需要为数据库服务器和应用程序运行单独的容器

于是容器的管理便成为了一个棘手的难题。工程师们为了解决这个问题,开发了一系列的容器编排器(container orchestrator),其中最有名的当属 kubernetes

容器编排器可以将一组容器作为一个基本单元去进行管理(例如 K8s 里的 pod),而且容器编排器可以在集群之间自动分配容器工作负载

那么今天,咸鱼将以自我介绍的形式来带大家了解三个容器编排器——Docker Compose、Swarm、Kubernetes

Docker Compose

大家好,我叫 Docker Compose 。我的爸爸是一个名叫 Docker 的公司

我的前身是一个叫 Fig 的项目,Fig 项目可是大有来头——因为它第一次提出了容器编排的概念

你只需要执行一条命令 fig up 就能够依次创建一系列容器,并且容器之间的关系及依赖性,都会自动帮你解决

当时它在 Github 上的热度可是比肩 Docker 的,后来我的爸爸秉承”打不过就加入“的理念,把 Fig 项目收购了

收购之后将名字改成了 Compose,于是我诞生了

我是根据一个 yaml 格式的配置文件来工作的,通常命名为 Docker-compose.yml

  • 首先我会去读取这个文件,然后通过 Docker API 创建这个文件声明的资源
  • 我还会为这些资源打上标签,方便我创建之后将它们分组管理

实际上我并不能够称得上是一个容器编排器,因为我实际上是通过 Docker 命令行接口(Docker command-line interface )去操作一组组容器的

举个例子,比如说在配置文件里有这三种类型的资源:

  • service:包含了要启动的容器的声明。里面的每一个条目都相当于一个 Docker run 命令
  • networks:包含了可以访问到容器的网络。里面的每个条目都相当于一个 Docker network create 命令
  • volumes:包含了可以访问到容器内部的容器卷(容器卷即能够挂载到容器内部的持久存储)。里面的每一个条目都相当于一个 Docker vloume create 命令

尽管如此,我依旧能够较好地管理容器之间的依赖关系,我还能够为容器创建一个共享网络和卷,使它们可以相互通信和共享数据

但是我不能够实现容器的高可用性,如果容器出现故障,需要手动进行恢复

Swarm

哈喽大家好,我叫 Swarm
在这里插入图片描述
Docker Compose 虽然为大家提供了一种方便的方式去管理容器,但他在一开始的时候只能在单台主机上工作

也就是说他创建的所有容器都在同一台机器上面运行,抛开性能不谈,如果所有应用都在一台服务器上,要是这台服务器宕了,后果可是不堪设想的

为了解决这个问题,早在 2014 年我的哥哥 Classic Swarm (http://github.com/Docker-archive/classicswarm)就已经开始提供跨主机运行容器的解决方案了,但不久之后我的爸爸就不管他了,在社区上不再维护

时间来到 2016 年,我诞生了

与我的哥哥 Classic Swarm 相比,我是直接被内置到了 Docker 当中

不但如此,我能够提供更强大的功能和更好的性能,支持服务发现、负载均衡、滚动更新等特性

创建集群的时候,我只需要在初始节点上执行 Docker swarm init 命令,然后在每个要添加进集群的其他节点上面执行 Docker swarm join 命令就可以了

怎么样,是不是非常方便

小伙伴们可能对我怎么管理集群比较关心,首先我会将集群中的节点分成两类:

  • 管理节点(Manager nodes)

管理节点提供了一个 API ,可以通过这个 API 来启动容器

而且管理节点之间使用基于 Raft 共识算法的协议相互通信,便于同步集群的状态,实现了高可用性和数据一致性

  • 工作节点(Worker nodes)

工作节点,顾名思义就是就负责干活的节点啦。它们负责执行实际的容器工作

而且我的爸爸跟我说管理节点最多只能设置七个,但工作节点数量不限制

别看我这么能干,其实我也有一些缺点,毕竟器无完器嘛

缺点一:集群里面不能够实现跨节点共享存储

虽然我支持集群里面跨节点网络通信(使用桥接方法),但是我不能够支持跨节点的共享存储。我必须依赖第三方的卷插件才能实现

缺点二:stack file 和 compose file 难以区分

自从我被集成到 Docker Engine 后,我发现我能够通过 compose 文件来部署服务了(部署 services、volumes等资源)

而你们也知道的,compose 文件一开始是给 Docker Compose 用的

我们来看下对比,可以看到用法是很相似的

Docker-compose -f Docker-compose up

Docker stack deploy -c Docker-compose.yml somestackname

但实际上我是通过 stack file 来进行集群部署的,stack file 也是 YML 格式的文件,它跟 compose file 极其相似

这样就会导致一些初学者在学习的时候不知道该用 stack file 还是 compose file ,可以看下下面这个 issue

http://stackoverflow.com/questions/43099408/whats-the-difference-between-a-stack-file-and-a-compose-file

PS:一般来讲,Stack file 和Compose file 的语法和功能非常相似,都可以用来定义和部署多个服务或容器

但是,Stack file 更加适合用来管理生产环境中的服务,而Compose file 更加适合用来管理开发和测试环境中的容器

此外,Stack file 还支持一些 Compose file 不支持的功能,如服务发现、负载均衡、滚动更新等

我的器生并非一帆风顺,我曾经可是 Docker Cloud 的支柱,但是 Docker Cloud 在 2018 年的时候就被关闭了

不但如此,随着对手 Kubernetes 的发展,我的地位不断地受到威胁。直到 2019 年,我的爸爸宣布停止对我的开发和维护,将重心转向 Kubernetes

可谓是:”跻攀分寸不可上,失势一落千丈强“

Kubernetes

哈喽大家好,我叫 Kubernetes。为了方便,你们可以叫我 K8s

想必大家都听说过我,作为迄今为止最受欢迎的容器编排器,我能够在多达数千个节点的集群上管理和分配资源

请允许我骄傲一下,我在容器编排器中地位相当于谷歌在搜素引擎中的地位,可以说是我主导了容器编排

但我能有今天,一方面归功于我的爸爸是谷歌,另一方面我得到了云原生计算基金会(Cloud Native Computing Foundation,CNCF)的支持

在 2014~2015 年间,整个容器社区可谓热闹非凡。但是热闹非凡的景象背后则是许多人的担忧和不满

那时候 Docker 项目已经成为 Docker 公司一个商业产品,当时我的爸爸找到了 Docker 公司,希望能够跟 Docker 合作,但是强硬的 Docker 觉得这会消弱自己的地位,拒绝掉了这个请求

而且 Docker 公司在 Docker 开源项目的发展上,始终保持着绝对的权威和发言权,并在多个场合用实际行动挑战到了其他玩家(比如,CoreOS、RedHat,甚至我爸爸和微软)的切身利益

于是这些开源基础设施领域巨头们联合我爸爸发起了一个名为CNCF(Cloud Native Computing Foundation)的基金会

这个基金会的目的就是希望以 Kubernetes 项目为基础,建立一个由开源基础设施领域厂商主导的、按照独立基金会方式运营的平台级社区,来对抗以 Docker 公司为核心的容器商业生态

于是在那个时候,我诞生了。我的前身是 Borg (一个谷歌内部工具)

如果你看过 Kubernetes 项目早期的 GitHub Issue 和 Feature 的话,就会发现它们大多来自于 Borg 和 Omega 系统的内部特性,这些特性落到 Kubernetes 项目上,就是 Pod、Sidecar 等功能和设计模式

我刚出生那会,因为操作太过复杂被很多人抱怨

如果你们想要配置集群,除了我本身,你们还需要选择和配置一些第三方组件。这就跟 Linux 内核需要跟 GNU 相结合才能构成一个完整的操作系统一样,我只是一个编排器,我需要跟其他软件结合才能构成一个完整的集群

还记得上面说过的 CNCF 基金会不,RedHat 也在里面,它把它的那一套玩法搬到了我的身上

跟 Linux 发行版本一样,我跟安装程序和其他精心挑选的第三方组件捆绑在一起,摇身一变就成了 K8s 发行版

有了 K8s 发行版,你们对我的抱怨就少了很多

不但如此,我的爸爸开始在 K8s 社区上大力推行”民主化“变革,即从 API 到容器运行时的每一层,Kubernetes 项目都为开发者暴露出了可以扩展的插件机制,鼓励用户通过代码的方式介入 Kubernetes 项目的每一个阶段

这个民主化变革带来的效果是巨大的,很快在整个容器社区中催生出了大量的、基于 Kubernetes API 和扩展接口的二次创新工作

随着我不断崛起不断扩大,Docker 公司也不得不面对自己即将失败的现实,从 2017 年开始,Docker 公司先是将 Docker 项目的容器运行时部分 Containerd 捐赠给 CNCF 社区

接着 10 月份的时候,Docker 公司出人意料地宣布,将我内置到它们的主打产品 Docker 企业版中,这标志着这场轰轰烈烈的”编排器之争“至此落下帷幕

如果当初 Docker 公司选择了跟我爸爸合作,那么如今的容器生态又会是一番怎样的景象呢?

本文参考链接:http://lwn.net/Articles/905164/#t

本文转载于网络 如有侵权请联系删除

相关文章

  • 【spring】AOP简介

    大家好,又见面了,我是你们的朋友全栈君。一.AOP原理AOP(AspectOrientedProgramming),即面向切面编程,可以说是OOP(ObjectOrientedProgramming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(crosscutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。AOP技术恰恰相反,它利用一种称为”横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为”Aspect”,即切面。所谓”切面”,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。使用”横切”技术,

  • VueUse scripts,他们都模仿过的脚本

    大家好,我是码农小余。今天…… 女同事问小余:你平时是怎么高效地积累这么多好用的第三方包? 小余:就没事多逛github,多点开package.json看看。今天我们就“单纯”地从VueUsescripts入手,从中探索我们后续也许会用上的第三方包库。scripts先总的看一下VueUse的script:"scripts":{ "build":"nrupdate&&esnoscripts/build.ts", "build:redirects":"esnoscripts/redirects.ts", "build:rollup":"cross-envNODE_OPTIONS=\"--max-old-space-size=6144\"rollup-c", "build:types":"tsc--emitDeclarationOnly&&nrtypes:fix"

  • 【Java Web_10】Servlet

    一、Tomcat1.概述①JavaEE Java在企业级开发中使用的技术规范的总和,一共规定了13项规范 ②常见的web服务器 *webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。 *webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。 *JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。 *Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。复制2.部署方式①直接将项目放到webapps目录下即可。 *将项目打成一个war包,再将war包放置到webapps目录下,war包会自动解压缩 ②配置conf/server.xml文件 在<Host>标签体中配置 <ContextdocBase="D:\hello"path="/hehe"/> *docBase:项目存放的路径 *path:虚拟目录 ③在conf\C

  • 彻底搞懂 etcd 系列文章(八):etcd 事务 API

    0专辑概述 etcd是云原生架构中重要的基础组件,由CNCF孵化托管。etcd在微服务和Kubernates集群中不仅可以作为服务注册与发现,还可以作为key-value存储的中间件。《彻底搞懂etcd系列文章》将会从etcd的基本功能实践、API接口、实现原理、源码分析,以及实现中的踩坑经验等几方面具体展开介绍etcd。预计会有20篇左右的文章,笔者将会每周持续更新,欢迎关注。1etcd的事务Transaction事务是键值存储中的原子If/Then/Else结构体。etcd提供了原语,用于将请求按原子块(即then/else)分组在一起,这些原子块(即分组)根据键值存储的内容来保护执行(即if)。事务可用于实现并发更新的一致性,构建CAS以及开发级别的并发控制。事务可以使得etcd服务端在单个请求中自动处理多个外部请求。对于键值存储库的修改,这意味着该存储库的修订版仅对事务增加一次,并且该事务生成的所有事件都将具有相同的修订版。需要注意的是,禁止在单个事务中多次修改同一key。事务中的每个比较都会检查存储中的单个key,类似于If操作,检查是否存在值,与给定值进行比较或检查键的修订

  • 利用GoAccess实时分析web服务日志

    1、GoAccess是什么2、为什么要用GoAccess3、GoAccess功能4、GoAccess特点5、安装GoAccess5.1、源码安装5.1、yum安装6、配置7、使用7.1、控制台模式7.2、HTML模式7.3、守护进程模式7.4、定时更新7.5、处理不断增长的日志7.6、其他使用1、GoAccess是什么GoAccess是一款开源的且具有交互视图界面的实时Web日志分析工具,通过你的Web浏览器或者*nix系统下的终端程序(terminal)即可访问。 能为系统管理员提供快速且有价值的HTTP统计,并以在线可视化服务器的方式呈现。 2、为什么要用GoAccessGoAccess被设计成快速的并基于终端的日志分析工具。其核心理念是不需要通过Web浏览器就能快速分析并实时查看Web服务器的统计数据(这对于需要使用SSH来对访问日志进行快速分析或者就是喜欢在终端环境下工作的人来说是超赞的)。 终端输出仅仅是默认的输出方式,GoAccess还支持生成完整的实时HTML报告(这对分析、监控以及数据可视化都是极好的),以及JSON和CSV格式的报告。 3、GoAccess功能GoAc

  • centos下使用shell脚本自动安装程序

    用shell安装程序非常方便,省得每一步都需要人为操作,在这里我自己尝试安装了PHP7到服务器,已经测试成功了我将我写的脚本分享出来,希望能帮助到一部分朋友!#!/bin/bash #PHP7.0安装脚本 #author Sindsun #date 2019年4月9日13:39:45 #:set ff=unix #先停止php-fpm if [ -f "/etc/init.d/php-fpm" ]; then /etc/init.d/php-fpm stop fi service php-fpm stop #添加新用户和组 groupadd nginx useradd -g nginx nginx #执行卸载 rm -rf /usr/local/php* rm -rf /usr/bin/php* rm -rf /usr/sbin/php* rm -rf /var/lib/php* rm -rf /usr/lib64/php* rm -rf /usr/share/php* #安装依赖 wget -P /usr/src http://nchc.dl.so

  • 犀牛鸟·学问 | 早稻田大学笠原副校长一行访问腾讯

    2019年11月5日上午,2018年度IEEEComputerSociety主席,早稻田大学副校长笠原博德教授及早稻田大学各位与会代表,同索尼、NEC、松下等企业界代表共20余人访问深圳腾讯总部滨海大厦。腾讯副总裁王巨宏女士等腾讯方领导,以及IEEE中国业务发展经理邓钟凯先生热烈欢迎代表团一行并参与交流。王巨宏女士向笠原博德教授赠送纪念品代表团首先参观了腾讯公司最新的产品和技术研发成果,以及腾讯的企业文化介绍,随后双方以圆桌会议形式展开讨论,聚焦“校企协作科研、协同育人”这一议题,对产业界和学术界如何更好地分工合作,以共同应对最前沿的科学研究问题与工程实践问题,并更有效地培养具备理论和实践综合能力的学生,开展了热烈的交流。会议结束后,王巨宏女士与笠原教授互赠纪念品。腾讯副总裁王巨宏女士致辞早稻田大学副校长笠原博德教授分享 腾讯高校合作总监刘婷婷女士分享IEEE中国业务发展经理邓钟凯先生致辞

  • Python-数据解析-正则表达式

    Python-数据挖掘-贴吧案例-下 在上几篇中,可以将整个网页的内容全部爬取下来。不过,这些数据的信息量非常庞大,而且大部分数据并不是所需要的。这就需要对爬取的数据进行过滤筛选,去掉没用的数据,留下有价值的数据。 要想过滤网页的数据,先要对服务器返回的数据形式做一些了解,这些数据一般可分为非结构化和结构化两种。 非结构化数据:数据结构不规则或不完整,没有预定义的数据模型,不方便使用数据库二维逻辑来表现的数据,包括所有格式的办公文档、文本、HTML、图像等。结构化数据:能用数据或统一的结构表示,具有模式的数据,包括XML和JSON等。Python支持一些解析网页的技术,分别为正则表达式、XPath、BeautifulSoup和JSONPath。①针对文本的解析,有正则表达式。②针对HTML/XML的解析,有XPath、BeautifulSoup、正则表达式。③针对JSON的解析,有JSONPath。区别:正则表达式基于文本的特征来匹配或查找指定的数据,它可以处理任何格式的字符串文档,类似于模糊匹配的效果。XPath和BeautifulSoup基于HTML/XML文档的层次结构来确定到达

  • R语言高级绘图命令(标题-颜色等)

    plot(x)          以x的元素值为纵坐标、以序号为横坐标绘图 plot(x,y)        x(在x-轴上)与y(在y-轴上)的二元作图 sunflowerplot(x,y)同上,但是以相似坐标的点作为花朵,其花瓣数目为点的个数 pie(x)饼图 boxplot(x)盒形图(“box-and-whiskers”) stripchart(x)把x的值画在一条线段上,样本量较小时可作为盒形图的替代 coplot(x~y|z)关于z的每个数值(或数值区间)绘制x与y的二元图 interaction.plot(f1,f2,y)如果f1和f2是因子,作y的均值图,以f1的不同值作为x轴, 而f2的不同值对应不同曲线;可以用选项fun指定y的其他的统计量(缺省计算均值,fun=mean)复制matplot(x,y)二元图,其中x的第一列对应y的第一列,x的第二列对应y的第二列,依次类推。 dotchart(x)如果x是数据框,作Cleveland点图(逐行逐列累加图) fourfoldplot(x)用四个四分之一圆显示2X2列联表情况(x必须是dim=c(2,2,k)的数组,或者

  • Windows之注册表介绍与使用安全

    [TOC]0x00快速入门1.入门基础PC机及其操作系统的一个特点就是允许用户按照自己的要求对计算机系统的硬件和软件进行各种各样的配置。 早期的图形操作系统,如Win3.x中对软硬件工作环境的配置是通过对扩展名为.ini的文件进行修改来完成的,但INI文件管理起来很不方便,因为每种设备或应用程序都得有自己的INI文件,并且在网络上难以实现远程访问。 为了克服上述这些问题,在Windows95及其后继版本中,采用了一种叫做“注册表”的数据库来统一进行管理,将各种信息资源集中起来并存储各种配置信息。 按照这一原则Windows各版本中都采用了将应用程序和计算机系统全部配置信息容纳在一起的注册表,用来管理应用程序和文件的关联、硬件设备说明、状态属性以及各种状态信息和数据等。注册表包含了每个计算机用户的配置文件,以及有关系统硬件、已安装的程序和属性设置的信息。 可以使用注册表编辑器检查并修改注册表。但是您不需要这么做而可以让Windows根据需要修改系统注册表,极力建议您不要自己编辑注册表设置。注册表的特点:a.注册表允许对硬件、系统参数、应用程序和设备驱动程序进行跟踪配置,这使得修改某些设置

  • Nacos 长轮询定时机制

    前言为方便理解与表达,这里把Nacos控制台和Nacos注册中心称为Nacos服务器(就是web界面那个),我们编写的业务服务称为Nacso客户端;由于篇幅有限,这里将源码分析分为上下两篇,其中上篇讲获取配置与事件订阅机制,下篇讲长轮询定时机制;在《微服务架构|2.2AlibabaNacos的统一配置管理》中提到一张Nacos动态监听的长轮询机制原理图,本篇将围绕这张图剖析长轮询定时机制的原理;ConfigService是Nacos客户端提供的用于访问实现配置中心基本操作的类,我们将从ConfigService的实例化开始长轮询定时机制的源码之旅;1.客户端的长轮询定时机制我们从上一篇文章的这里开始【断点步入】;NacosPropertySourceLocator.locate(); 1.1利用反射机制实例化NacosConfigService对象客户端的长轮询定时任务是在NacosFactory.createConfigService()方法中,构建ConfigService对象实例时启动的,我们接着1.1处的源码;进入NacosFactory.createConfigService

  • 移动前端开发之viewport的深入理解

    在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或响应各种不同分辨率的移动设备。一、viewport的概念通俗的讲,移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,在具体一点,就是浏览器上(也可能是一个app中的webview)用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域要大,也可能比浏览器的可视区域要小。在默认情况下,一般来讲,移动设备上的viewport都是要大于浏览器可视区域的,这是因为考虑到移动设备的分辨率相对于桌面电脑来说都比较小,所以为了能在移动设备上正常显示那些传统的为桌面浏览器设计的网站,移动设备上的浏览器都会把自己默认的viewport设为980px或1024px(也可能是其它值,这个是由设备自己决定的),但带来的后果就是浏览器会出现横向滚动条,因为浏览器可视区域的宽度是比这个默认的viewport的宽度要小的。下图列出了一些设备上浏览

  • 2017NOIP模拟赛三 A酱的体育课

      据说改编自$CodeM美团点评编程大赛初赛A轮$ 简单的水题。。。考试的时候没想到,xjb打了暴力。 显然,第$x$个人排在第$y$个位置的情况总数为$(n-1)!$,在这些情况中,第$x$人对答案的贡献是相同的,记为$p_{x,y}$。 总的情况数是$n!$,故答案为$$\frac{\sump_{x,y}}{n}$$ 看起来挺水的,结论出来逆元组合数什么的都不用求打上去就好了。 代码: 1#include<cstring> 2#include<cmath> 3#include<cstdio> 4#include<algorithm> 5#defineforu(i,x,y)for(inti=x;i<=y;i++) 6usingnamespacestd; 7 8constintN=1e6+10; 9doublev,u,c[N],d[N],ans; 10intn; 11intmain(){ 12freopen("pe.in","r",stdin);freopen("pe.out","w",stdout); 13sc

  • YUV采样及存储格式

      YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。   与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。   一、采集   YUV主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。下面用三个图来直观地表示采集的方式,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。   YUV4:4:4采样,每一个Y对应一组UV分量。  YUV4:2:2采样,每两个Y共用一组UV分量。  YUV4:2:0采样,每四个Y共用一组UV分量。   二、存储   YUV格式有两大类:planar和packed。  对于planar

  • UWP 解决Webview在Pivot里面无法左右滑动的问题

    //为了解决webview在PivotItem里面,阻止pivot左右滑动。 if(webView!=null) { rootGrid.Children.Remove(webView); webView.NavigationCompleted-=webView_NavigationCompleted; webView.NavigationFailed-=webView_NavigationFailed; webView.NavigationStarting-=webView_NavigationStarting; webView.DOMContentLoaded-=webView_DOMContentLoaded; webView.ScriptNotify-=webView_ScriptNotify; } webView=newWebView(WebViewExecutionMode.SameThread); webView.SetValue(Grid.RowProperty,2); webView.Visibility=Visibility.Collapsed; webView.N

  • DevOps系列——Gitlab私服

    Gitlab/GitHub是两兄弟,但GitHub本着共享技术的精神,私有库是要钱滴,而且代码放别人家里,晚上总是有点睡不踏实, 来个代码泄露或者突然被区别对待,比如GitHub断供来自伊朗、叙利亚的人民,就问你怕不怕,所以企业一般会自建Gitlab 私服,供内部使用,反正我没听过谁家上GitHub管理代码的,今天就来建一个自家的Gitlab,自己在家放心玩。 作者原创文章,谢绝一切转载,违者必究! 本文只发表在"公众号"和"博客园",其他均属复制粘贴!如果觉得排版不清晰,请查看公众号文章。  准备: VMwareWorkstation15Pro/RHEL8.0/Gitlab-ee-13.0.0 难度:新手--战士--老兵--大师 目标: 搭建Gitlab私服 1步骤 首先请设置Linux内存至少为4G,因为2G会非常卡顿! 1.安装HTTP,HTTPS和SSH,还有防火墙设置,这里使用的是DNF,DNF(DandifiedYum)是新一代的RPM软件包管理器,未来会取代yum: sudo dnf install -y curl&n

  • String类

    位置:java.lang.String 预备知识:java中的代码点和代码单元 一、基本介绍 String类代表字符串。Java程序中的所有字符串字面值都作为此类的实例实现。 字符串是常量,它们的值在创建之后不能更改。 因为String对象是不可变的,所以可以共享。 String类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写(大小写映射基于Character类指定的Unicode标准版) 提供处理Unicode代码点(即字符)和Unicode代码单元(即char值)的方法。  Java语言提供对字符串串联符号("+")以及将其他对象转换为字符串(toString())的特殊支持。 二、构造方法 简单粗暴 StringA="lalalalala";复制 常用 String(char[]value)  //以一个char数组初始化String String(char[]value,intoffset,intcount)  //以一个char数组的子数组初始化String(offset:子数组第一

  • IOS多线程实现多图片下载(一)

    在没有步入正文之前先给大家展示下效果图,如果大家觉得很满意请继续往下阅读全文。     大家可以看到这个界面很简单,其实就是UITableView的布局,但是难点是在于如何从网上下载这些图片,下载之后应如何进行存储! 我们一步一步进行解析,先从单线程(主线程)进行多图片下载我们布局上的文字及图片的地址从plist文件中进行读取   根据结构,我们自定义一个数据模型文件 DDZApp.h ? 1 2 3 4 5 6 7 8 9 10 #import<Foundation/Foundation.h> @interfaceDDZApp:NSObject //图标 @property(nonatomic,strong)NSString*icon; //名字 @property(nonatomic,strong)NSString*name; //下载量 @property(nonatomic,strong)NSString*download; +(instancetype)appWithDict:(N

  • 70.自定义异步任务

    1.抽象异步任务类:publicabstractclassYTAsyncTask<T>{privatestaticfinalHandlerThreadhandlerThread=newHandlerThread(YTAsyncTask.class.getName(),10);publicYTAsyncTask(){}protectedabstractvoidonPreExecute();protectedabstractTdoInBackground();protectedabstractvoidonPostExecute(Tparam);publicfinalYTAsyncTask<T>execute(){finalHandlermainHandler=newHandler(Looper.getMainLooper());HandlerbgHandler=newHandler(handlerThread.getLooper());this.onPreExecute();bgHandler.post(newRunnable(){publicvoidrun(){f

  • [IOI2008]Island

    基环树 找环,环外处理,环上处理 #include<bits/stdc++.h> #definerereturn #defineinc(i,l,r)for(inti=l;i<=r;++i) usingnamespacestd; template<typenameT>inlinevoidrd(T&x) { charc;boolf=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x; } #definelllonglong constintmaxn=1e6+5; intn,col,k; boolvis[maxn]; inthd[maxn],du[maxn],c[maxn],q[maxn<<1]; llf[maxn],d[maxn],a[maxn<<1],b[maxn<<1]; structnode

  • 我用STM32MP1做了个疫情监控平台4—功能完善界面重新设计

    @目录前言界面展示新增功能API接口说明多个接口数据的获取和解析FontAwesome字体图标库的使用代码下载系列教程 前言 之前我用STM32MP1和Qt实现了疫情监控平台,系列教程: 我用STM32MP1做了个疫情监控平台1—交叉编译环境搭建 我用STM32MP1做了个疫情监控平台2—Qt环境搭建 我用STM32MP1做了个疫情监控平台3—疫情监控平台实现 我用STM32MP1做了个疫情监控平台4—功能完善界面重新设计 有幸被【STM32单片机】官方公众号转发分享,感觉还是很有成就感的。 这周末又把功能进一步完善了一下,界面重新设计等。实际运行界面: 界面展示 原来的界面很简单,只有国内疫情数据展示: 现在的界面: STM32MP1开发板运行效果: 新增功能 UI重新设计,仿平板界面 新增海外疫情数据显示和国内零病例城市数据显示 新增疫情新闻显示,使用html模板文件的方式实现富文本的显示 5分钟自动更新,可通过开关选择是否开启 新增IP自动定位功能 FontAwesome字体图标库的使用 自定义标题栏按钮,可点击图标关闭窗口,手动更新等 API接口说明 所使用到

相关推荐

推荐阅读