Cert Manager 申请SSL证书流程及相关概念-三

中英文对照表

英文 英文 - K8S CRD 中文 备注
certificates Certificate 证书 certificates.cert-manager.io/v1
certificate issuers Issuer 证书颁发者 issuers.cert-manager.io
ClusterIssuer 集群证书颁发者 clusterissuers.cert-manager.io
certificate request CertificateRequest 证书申请 certificaterequests.cert-manager.io
order Order (证书)订单 orders.acme.cert-manager.io
challenge Challenge (证书)挑战 challenges.acme.cert-manager.io
SelfSigned 自签名 cert-manager Issuer 的一种
CA 证书颁发机构 Certificate Authority 的缩写;
cert-manager Issuer 的一种
Vault 金库 cert-manager Issuer 的一种,即 Hashicorp Vault
Venafi Venafi 在线证书办理服务,目前用的不多。
External 外部 cert-manager Issuer 的一种
ACME 自动证书管理环境 Automated Certificate Management Environment 的缩写;
cert-manager Issuer, 包括 HTTP01 和 DNS01

书接上回, 最后了解一下 cert-manager 的相关概念.

相关概念

cert-manager 相关 CRD

Issuer(证书颁发者)

IssuersClusterIssuers 是 Kubernetes CRD,代表证书颁发机构(CA),能够通过兑现证书签名请求来生成签名证书。所有 cert-manager 证书都需要一个被引用的签发者,该签发者处于准备就绪的状态,可以尝试兑现请求。

Issuer 类型的一个例子是 "CA"。一个简单的CA Issuer如下。

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: ca-issuer
  namespace: mesh-system
spec:
  ca:
    secretName: ca-key-pair

这是一个简单的Issuer,将根据私钥(私钥存储在 Secret 的ca-key-pair中)签署证书。

  • Issuer: 限定在一个 NameSpace 的资源;
  • ClusterIssuer: 可以用于在所有命名空间中颁发 "证书"。

Certificate(证书)

cert-manager 有 Certificate 的概念,定义了所需的 X.509 证书,它将被更新并保持最新。一个 Certificate 是一个 Kubernetes 的 CRD,它引用了一个 IssuerClusterIssuer,决定了什么将被授予证书请求。

当一个 Certificate 被创建时,一个相应的 CertificateRequest 资源由 cert-manager 创建,其中包含编码的 X.509 证书请求,Issuer reference,以及其他基于 证书 资源规范的选项。

这个 Certificate 将告诉 cert-manager 尝试使用哪个 Issuer 来获取域名的证书密钥对。如果成功,得到的 TLS 密钥和证书将被保存在一个 secret 中,Key 分别为tls.keytls.crt。这个 Secret 将与Certificate CRD 在同一个命名空间。示例如下:

保存证书密钥对的 Secret

当证书由中间 CA 签发,并且Issuer 可以提供签发的证书链时,tls.crt的内容将是请求的证书,后面是证书链。

此外,如果证书颁发机构是已知的,相应的 CA 证书将被存储在 Secret 中,密钥为ca.crt。例如,对于 ACME 发行者,CA 是不知道的,ca.crt将不存在于acme-crt-secret中。

cert-manager 有意避免在tls.crt中添加根证书,因为在安全进行 TLS 的情况下,这些证书是无用的。

当配置一个客户端连接到具有由私人 CA 签署的服务证书的 TLS 服务器时,你需要向客户端提供 CA 证书,以便它验证服务器。

dnsNames字段指定了与证书相关的 SAN 的列表。

证书生命周期

这张图显示了使用 ACME/Let's Encrypt Issuer 的名为cert-1的证书的生命周期。

证书生命周期

CertificateRequest(证书申请)

CertificateRequest是 cert-manager 中的一个 Kubernetes CRD,用于向 Issuer 申请 X.509 证书。该资源包含一个 Base64 编码的 PEM 编码的证书请求字符串,它被发送到被引用的签发者。一个成功的签发将返回一个基于证书签署请求的签名证书。CertificateRequests通常由控制器或其他系统消费和管理,不应该由人类使用 - 除非特别需要。

CertificateRequestspec内的所有字段,以及任何管理的 cert-manager 注释,都是不可改变的,创建后不能修改。

成功签发证书签署请求将导致对资源的更新,用签署的证书、证书的 CA(如果可用)设置状态,并将 Ready 条件设置为 True。如下图:

 Status

无论证书签署请求的签发是否成功,签发的重试都不会发生。管理CertificateRequests的逻辑和生命周期是其他控制器的责任。

条件

CertificateRequests 有一组强定义的条件,控制器或服务应该使用和依赖这些条件来决定下一步对资源采取什么行动。

Ready

每个准备好的条件由一对Ready--一个布尔值,和Reason--一个字符串组成。这组值和含义如下:

Ready Reason 条件含义
False Pending CertificateRequest目前正处于等待状态,等待其他操作的发生。这可能是由于Issuer'还不存在,或者Issuer'正在签发证书。
False Failed 证书未能被签发--要么是返回的证书未能被解码,要么是用于签名的参考签发者的实例失败。它的控制器将不会对CertificateRequest采取进一步行动。
True Issued 被引用的 Issuer 已成功签发了一份经签名的证书。

ACME Orders 和 Challenges

cert-manager 支持从 ACME 服务器请求证书,包括从 Let's Encrypt,使用 ACME Issuer。这些证书通常在公共互联网上被大多数计算机所信任。为了成功申请证书,cert-manager 必须解决 ACME challenge,完成这些 challenge 是为了证明客户拥有被申请的 DNS 地址。

为了完成这些 challenge,cert-manager 引入了两种 CRD 类型:OrdersChallenges

Orders (订单)

Orders资源被 ACME 发行者用来管理 ACME '订单' 的生命周期,以获得签名的 TLS 证书。关于 ACME 订单和域名验证的更多细节可以在 Let's Encrypt 网站 这里 找到。一个订单代表了一个单一的证书请求,一旦一个新的 CertificateRequest 资源引用 ACME 发行人,该订单就会自动创建。一旦 Certificate 资源被创建、规格改变或需要更新,CertificateRequest资源将由 cert-manager 自动创建。

作为终端用户,您将永远不需要手动创建一个 Order 资源。一旦创建,Order 不能被改变。相反,必须创建一个新的 Order资源。

Order 资源封装了该 "订单" 的多个 ACME Challenge,因此,将管理一个或多个 Challenge 资源。

Challenges (挑战)

Challenges 资源被 ACME 发行者用来管理 ACME challenge 的生命周期,为了完成对一个 DNS 名称/标识的 "认证",必须完成 challenge。

当一个 Order 资源被创建时,order 控制器将为每个正在被 ACME 服务器认证的 DNS 名称创建 Challenge资源。

作为终端用户,你永远不需要手动创建一个 Challenge 资源。一旦创建,Challenge就不能被改变。相反,必须创建一个新的 Challenge资源。

Challenge 生命周期

Challenges 资源被创建后,它最初将被排队处理。在 challenge 被 "安排" 开始之前,处理将不会开始。这种调度过程可以防止一次尝试太多的 challenge,或一次尝试对同一 DNS 名称的多个 challenge。

一旦 challenge 被安排,它将首先与 ACME 服务器进行 "同步",以确定其当前状态。如果 challenge 已经有效,它的 status 将被更新为 valid,并且还将设置status.processing = false以 "取消计划"。

如果 challenge 仍然 "pending",challenge 控制器将使用配置的解决方法(HTTP01 或 DNS01 之一)"present" challenge。一旦 challenge 被 "present",它将设置status.presented = true

一旦 "present",challenge 控制器将执行 "self check",以确保 challenge 已经 "propagated(已传播)"(即权威的 DNS 服务器已被更新以作出正确响应,或 ingress 资源的变化已被 ingress controller 观察到并正在使用)。

如果自检失败,cert-manager 将以固定的 10 秒重试时间间隔重试自检。没有完成自检的 challenge 将继续重试,直到用户通过重试 "订单"(通过删除 "订单 "资源)或修改相关的 "证书 "资源来解决任何配置错误进行干预。

一旦自检通过,与此 challenge 相关的 ACME "authorization(认证) "将被 "accepted(接受)"。

接受认证后的最终状态将被复制到 challenge 的status.state 字段,如果 ACME 服务器试图验证 challenge 时发生错误,也会复制 "error reason(错误原因)"。

一旦 challenge 进入 validinvalidexpiredrevoked (撤销)状态,它将设置 status.processing = false,以防止 ACME challenge 的任何进一步处理,如果有积压的 challenge 要完成,允许安排另一个 challenge。

Challenge 调度

cert-manager 并不试图一次处理所有的 challenge ,而是对 challenge 进行 "调度"。

这个调度器对同时进行的 challenge 的最大数量设置了上限,并且不允许对同一 DNS 名称和解算器类型(HTTP01DNS01)的两个 challenge 同时完成。

一次可以处理的最大 challenge 数量是 60 个,原因是 ddff78

系列文章

  • cert-manager TAG

?️ 参考文档

  • cert-manager - cert-manager Documentation
  • 使用 cert-manager 为 dnspod 的域名签发免费证书 | kubernetes 学习笔记 (imroc.cc)

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

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

相关文章

  • 使用 Office 打开下载的 xlsx 格式 Excel 文件报“文件已损坏,无法打开”错误问题处理

    概述在使用Office打开下载的xlsx格式Excel文件可能会出现报“文件已损坏,无法打开”错误的问题,出现这种问题的原因是因为Windows系统会锁定来自网络或其他计算机的xlsx文件,以阻止Office打开此文件,来保护操作系统不被侵害。解决方式一在网络上很容易搜到一种解决方式,是通过在Office软件的“信任中心设置”中取消“受保护的视图”,这种方式一劳永逸,但却降低了系统的安全性。解决方式二个人发现的另外一种解决方式,是通过修改下载的xlsx文件属性,来允许打开当前下载的文件,来解决“文件已损坏,无法打开”的问题。这样做唯一的缺点就是,打开每个下载的文件都需要单独去修改文件属性,打开多个文件时操作稍有繁琐,但却没有降低系统的安全性,保证了要打开的文件确实是自己信任的文件。操作步骤如下:右键下载的xlsx文件,点击“属性”选项: 勾选“解除锁定”,点击确定按钮即可: 内容声明标题:使用Office打开下载的xlsx格式Excel文件报“文件已损坏,无法打开”错误问题处理链接:https://zixizixi.cn/windows-office-open-download-xls

  • 自己动手写数据库系统:容灾恢复原理和容灾恢复日志的设计

    数据库系统有一个极其重要的功能,那就是要保持数据一致性。在用户往数据库写入数据后,如果数据库返回写入成功,那么数据就必须永久性的保存在磁盘上。此外作为一个系统,它必须具备自恢复功能,也就是如果系统出现意外奔溃,无论是内部错误,还是外部原因,例如突然断电等,系统都必须要保持数据的一致性。例如我们从数据库中订购一张机票,假设机票数量正确减一,但还没扣款,此时系统突然奔溃,如果系统没有预防措施就会导致数据出现不一致性,也就是机票出票数量和相应的支付款项不一致,没有容错性的数据库系统就不会有市场,本节的目的是设计恢复机制,确保数据在任何突如其来的意外情况下依然保持数据一致性。因此数据库系统必须遵守ACID原则,他们分别是atomicity,consistency,isolation,durability: atomicity:其意思是任何数据操作要不完全执行,要不就一点作用也没有。数据库中有一个叫“交易”的概念,也就是transation,它表示一系列必须全部完成的读写操作,必须是序列化的,也就是交易所给定的执行步骤在运行时不能被打断,或者是中间突然插入其他交易的步骤,所以它也叫原子化。con

  • python基础—生成器

    生成器复制生成器generator <ul> <li> 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 </li> </ul> </li> <li> 生成器函数 <ul> <li> 函数体中包含yield语句的函数,返回生成器对象 </li> <li> 生成器对象,是一个可迭代对象,是一个迭代器 </li> <li> next(generator)会从函数的当前位置向后执行到之后碰到的第一个yield语句,会弹出值,并暂停函数执行 </li> <li> 没有多余的yield语句能被执行,继续调用next函数,会抛出StopIteration </li> <li> 生成器对象,是延迟计算,惰性求值 </li> </ul> </li>复制先来对比

  • 用ABAP操作zip文件

    REPORTzbm_tst_zip. DATA:lo_zipTYPEREFTOcl_abap_zip. CREATEOBJECTlo_zip. DATA:l_file_pathTYPEstring. DATA:lt_xml_rawtableTYPEdcxmllines. DATA:lv_xstringTYPExstring. DATA:lv_upload_xstringTYPExstring. DATA:lv_upload_stringTYPEstring. TRY. CALLMETHODcl_salv_test_data=>select_file IMPORTING filename=l_file_path. CATCHcx_root. ENDTRY. CALLMETHODcl_gui_frontend_services=>gui_upload EXPORTING filename=l_file_path filetype='BIN' CHANGING data_tab=lt_xml_rawtable EXCEPTIONS OTHERS=1.

  • AVL树的代码实现 顶

    二叉平衡查找树又称AVL树,以及红黑树,其实就是在普通的二叉树结构里面不断加入规则。用程序来满足这些规则。/** *CreatedbyAdministratoron2018-02-23. */ publicclassAVLTree<AnyTypeextendsComparable>{ privatestaticfinalintALLOWED_IMBALANCE=1; privatestaticclassAvlNode<AnyType>{ AvlNode(AnyTypetheElement){ this(theElement,null,null); } AvlNode(AnyTypetheElement,AvlNode<AnyType>lt,AvlNode<AnyType>rt){ element=theElement; left=lt; right=rt; height=0; } AnyTypeelement; AvlNode<AnyType>left; AvlNode<AnyType>right; intheig

  • 行业 | 引入电子合同,旅游供应商合作签约不再困难

    关键词:企业应用企业管理电子签约旅游2018年,我国的旅游行业继续以高速增长的态势持续发展,仅上半年国内游旅客就达到了28.26亿人次。究其原因,国家发改委社会司有关负责人认为,这个结果和假日旅游持续增长、乡村旅游亮点纷呈、全域旅游成效显著这三点是密不可分的。而随着客户对个性化旅游的需求越来越旺、散客数量与比例日益增加、休闲度假型旅游的兴起,传统旅行社不断在“一体化”旅行团上的业务不断推陈出新,也开始从事起了专门为客户订购酒店、目的地交通工具、餐饮等“半自助游”的服务。旅游行业产品同质化程度高、准入门槛低,为了更好的提升旅行社自身的竞争力,树立良好的企业品牌形象,不少从业者已经早就选择了和旅游服务商、供应商建立战略性合作。但在供应商管理及合同签约的问题上,不少旅行社都面临着很多问题。旅游供应商合同签约难题一、供应商分布零散,签约难度大由于旅行供应商分布在全国乃至世界各地,无论是前期的沟通联系,还是后期的签约合作,都存在非常大的难度。相对于现在沟通工具越来越方便的情况,传统纸质合同签约则存在更多的问题,来回寄送时间长,无法确认签约人身份、容易在寄送过程中丢失、损坏。二、行业涉及环节多,流

  • 学习SVM,这篇文章就够了!

    1)关于拉格朗日乘子法 首先来了解拉格朗日乘子法,那么为什么需要拉格朗日乘子法?记住,有拉格朗日乘子法的地方,必然是一个组合优化问题。那么带约束的优化问题很好说,就比如说下面这个: 这是一个带等式约束的优化问题,有目标值,有约束条件。那么想想假设没有约束条件这个问题是怎么求解的呢? 是不是直接f对各个x求导等于0,,解x就可以了,可以看到没有约束的话,求导为0,那么各个x均为0吧,这样f=0了,最小。但是x都为0不满足约束条件呀,那么问题就来了。 这里在说一点的是,为什么上面说求导为0就可以呢?理论上多数问题是可以的,但是有的问题不可以。如果求导为0一定可以的话,那么f一定是个凸优化问题,什么是凸的呢?像下面这个左图: 凸的就是开口朝一个方向(向上或向下)。更准确的数学关系就是: 注意的是这个条件是对函数的任意x取值。如果满足第一个就是开口向上的凸,第二个是开口向下的凸。 可以看到对于凸问题,你去求导的话,是不是只有一个极点,那么他就是最优点,很合理。类似的看看上图右边这个图,很明显这个条件对任意的x取值不满足,有时满足第一个关系,有时满足第二个关系,对应上面的两处取法就是,所以这种问

  • JNI处理图片——黑白滤镜

    前言在Android的开发中,我们有时会遇到对性能要求比较高的模块。所幸Android通过NDK为我们提供了c++开发的方式。我们可以通过c++完成核心的耗时的计算,然后通过JNI的方式将处理完成的数据传给Java层。今天,我们就从一个很小的角度(Bitmap)的处理,来实践NDK开发的方式。开发一个小小的图片滤镜。准备新版本的AndroidStudio在新建工程时,就可以选择IncludeC++support当我们勾上这个选择后,AndroidStudio就会帮我们自动完成,c++开发目录的创建。我们先看一下CMakeLists.txt:#FormoreinformationaboutusingCMakewithAndroidStudio,readthe #documentation:https://d.android.com/studio/projects/add-native-code.html #SetstheminimumversionofCMakerequiredtobuildthenativelibrary. cmake_minimum_required(VERSIO

  • “大数据”还不等于“大智慧”

      技术开发商和媒体早早地为我们描绘了一个即将来临的“大数据时代”。“大数据”无所不知无所不能;有了“大数据”的支持,公司运行效率突飞猛进;“大数据”还能帮你做出最明智的决策,使你的公司所向披靡。简直不要太棒!但是在这里提醒各位,正如所有的高科技宣传一样,“大数据”也不可避免地被炒作夸大。于是,你还相信未来吗?  近几年以来,“大数据”已经传得沸沸扬扬。技术开发商和媒体记者铺天盖地式的宣传,你怎么可能不知道“大数据”?即使不知道也总会听说过。让我们来看看他们是怎么大力宣传所谓的“大数据”:“大数据”无所不知无所不能;有了“大数据”的支持,公司运行效率突飞猛进;“大数据”还能帮助你了解数据,做出最明智的决策,使你的公司时刻都充满了竞争优势。  多么具有诱惑力的宣传!当然我们不能百分之百地说报道违背了事实。只是人们对于高科技的宣传总是过于乐观超前。事实上,很多公司都发现以目前的条件实现“大数据”困难重重,理想很丰满,现实却很骨感。的确,在数据的收集和处理方面,可能具有可观的优势。但真正的使用这些数据、乃至借助这些制定更优化的决策则完全又是另一回事。那么问题出在哪里呢?多数公司表示在“大数据

  • ES7和ES8新特性介绍

    概述JavaScript,作为一门处于高速发展期的开发语言,正在变的越来越完善、稳定。我们必须拥抱这些变化,并且我们需要把ES8加入到我们的技术栈中。 ECMAScript是标准化的JavaScript语言,1997年发布了第一版,1998年和1999年发布了第二和第三个版本,之后沉寂了许多年,直到Ajax流行起来后标准工作才再次起步,2009年发布了第五个版本,自2015年起每年发布一个版本。现在为开发者所熟知的ES6就是2015年发布的。 ES7新增特性比较少,在这个版本中,ES7只增加了两种新特性:Array.prototype.includes和ExponentiationOperator(求冥运算)。而在最新的ES8版本中,新增的特性比较多,主要包括:Object.values/Object.entries、字符串填充、Object.getOwnPropertyDescriptor、尾随逗号、异步函数、共享内存和原子等。ES7新特性Array.prototype.includesArray.prototype.includes用法都容易和简单。它是一个替代indexOf,开发

  • 9.Go编程快速入门学习

    [TOC]0x00Go语言基础之Unit(单元)测试描述:日常开发中,测试是不能缺少的.通常国内的程序员都不太关注单元测试这一部分,俗话说不写测试的开发不是好程序猿,我认为每一位开发者都应该了解TDD(TestDrivenDevelopment-测试驱动开发),所以本章将主要介绍下在Go语言中如何做单元测试和基准测试。Tips:编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具(再次体现Go语言的优秀)。不过在介绍之前,我们先介绍一个Go语言的标准库为我们提供的单元测试与基准测试的辅助工具,有一个叫做testing的测试框架,可以用于单元测试和性能测试,它是和gotest命令一起使用的,它是一个按照一定约定和组织的测试代码的驱动程序。非常注意、非常注意在包目录内,所有以_test.go为后缀名的源代码文件都是gotest测试的一部分,不会被gobuild编译到最终的可执行文件中。在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。类型格式作用测试函数函数名前缀为Test测试程序的一些逻辑行为是否正确基准函数函数名前缀为Bench

  • ASP.NET Core路由中间件[4]: EndpointRoutingMiddleware和EndpointMiddleware

    针对终结点的路由是由EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协同完成的。应用在启动之前会注册若干表示终结点的Endpoint对象(具体来说是包含路由模式的RouteEndpoint对象)。如下图所示,当应用接收到请求并创建HttpContext上下文之后,EndpointRoutingMiddleware中间件会根据请求的URL及其他相关信息从注册的终结点中选择匹配度最高的那个。之后被选择的终结点会以一个特性(Feature)的形式附加到当前HttpContext上下文中,EndpointMiddleware中间件最终提供这个终结点并用它来处理当前请求。[更多关于ASP.NETCore的文章请点这里]目录 一、IEndpointFeature 二、EndpointRoutingMiddleware 三、EndpointMiddleware 四、注册终结点一、IEndpointFeatureEndpointRoutingMiddleware中间件选择的终结点会以特性的形式存放在当前HttpContext上下文中,这个用来封装终结

  • Android样式之selector

      日常开发当中,难免会出现这样一种情况,为一个按钮、TextView...设置一个点击状态的颜色改变,可能是background背景的改变,也可能是字体颜色的改变,简单点说:默认状态下,字体颜色或者背景是一种颜色,按下或者点击的时候,变成另一种颜色。   这里面有一些小坑,为了避免踩到,特此小结一下。本文参考了http://keeganlee.me/post/android/20150905。 (一)、selector做为drawable和color使用时的区别和注意事项 1、background的selector      结论:background的selector,item只能用drawable属性,不能用color属性,并且drawable还必须用引用的形式   2、textcolor的selector        结论:textcolor的selector,item不能使用drawable属性,只能用color属性,值可以直接指定,也可以引用指定。   总结:   1、selector作为drawable资源时,item必须使用an

  • pip安装使用详解

    原文地址:http://www.ttlsa.com/python/how-to-install-and-use-pip-ttlsa/  pip类似RedHat里面的yum,安装Python包非常方便。本节详细介绍pip的安装、以及使用方法。 1、pip下载安装 1.1pip下载   1 #wget"https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb"--no-check-certificate 1.2pip安装   1 2 3 #tar-xzvfpip-1.5.4.tar.gz #cdpip-1.5.4 #pythonsetup.pyinstall   2.pip使用详解 2.1pip安装包   1 2 3 #pipinstallSomePackage  [...]  Succe

  • Git初见

    1.起源(廖雪峰的官方网站) 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。 Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢? 事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码! 你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。 不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司

  • 解决uni-app微信小程序底部输入框,键盘弹起时页面整体上移 问题

    存在问题 做了一个记录页面(类似单方聊天页),输入框在底部;当弹出键盘时,页面整体上移,页面头信息会消失不见 需要实现效果: 比如一个记录页面,需要在键盘弹出时: 底部的输入框跟随键盘上弹 页面头固定在顶部不动 聊天信息区域(即内容区)调整高度,该区域局部滚动 解决方法 底部输入框fixed定位在底部,使用输入框的@focus获取键盘高度,更改输入框bottom;@blur时恢复bottom=0; 使用包含页面头和内容区 container的padding-bottom设置为输入框高度+输入框bottom,避免被输入框和键盘遮挡;并设置为flexcolumn布局 头部定高(如果不定高可以不设置); 内容区设flex-grow:1,overflow-y:auto;使其自适应高度并实现滚动; 实现代码 <template> <view> <viewclass="container":style="{'padding-bottom':`${52+inputBottom}px`}"> <viewclass="header">我是头部

  • 真正的inotify+rsync实时同步 彻底告别同步慢

    转载:http://www.ttlsa.com/web/let-infotify-rsync-fast/ 背景 我们公司在用inotify+rsync做实时同步,来解决分布式集群文件一致性的问题。但当web文件越来越多(百万级数量html,jpg等小文件),同步就越来越慢,根本做不到实时,按照网上的调优方法都尝试过,问题根本没有解决。经过我一翻细致研究,终于把慢的核心问题研究明白,先总结一句inotifywait响应不会有延迟,rsync也很快。大家同样有慢的烦恼,那是因为网上的inotify+rsync的教程都是坑。下面我们来分析。 inotifywait单独分析     1 /usr/local/bin/inotifywait-mrq--format'%Xe%w%f'-emodify,create,delete,attrib/data/ 执行上面命令,是让inotifywait监听/data/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%Xe%w%f的格式输出。 在/data/目录

  • LeetCode16. 最接近的三数之和

    题目 分析 和LeetCode15题差不多的思路,可以暴力搜索,但是时间复杂度太高,考虑用双指针降低时间复杂度 也和LeetCode11题差不多思路 https://leetcode-cn.com/problems/3sum-closest/solution/zui-jie-jin-de-san-shu-zhi-he-by-leetcode-solution/ 代码 1classSolution{ 2public: 3intthreeSumClosest(vector<int>&nums,inttarget){ 4//定义一下答案,因为要保存差值和答案,所以采用pair 5pair<int,int>res(INT_MAX,INT_MAX); 6 7sort(nums.begin(),nums.end()); 8 9for(inti=0;i<nums.size();i++){ 10for(intj=i+1,k=nums.size()-1;j<k;j++){ 11//试探法,k-1不与j重复并且三数之和依旧大于等于target,k就可以移动到k

  • Android开发手记之compileDebugAidl failed

    *Whatwentwrong:Executionfailedfortask':apps:compileDebugAidl'.>1exceptionwasraisedbyworkers:org.gradle.process.internal.ExecException:Aproblemoccurredstartingprocess'command'/opt/android-sdk/build-tools/28.0.3/aidl''   因为androidSDK是拷贝其他机器上的,所以没有执行权限 加下执行权限即可。

  • HashTable, HashMap,TreeMap区别

    1、HashTable线程同步,HashMap非线程同步。 2、HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。 3、HashTable使用Enumeration,HashMap使用Iterator。 4、HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。 5、TreeMap能够把它保存的记录根据键排序,默认是按升序排序。  

  • List的主要实现类

    //ArrayList:List的主要实现类 /* *List中相对于Collection,新增加的方法 *voidadd(intindex,Objectele):在指定的索引位置index添加元素ele booleanaddAll(intindex,Collectioneles) Objectget(intindex):获取指定索引的元素 Objectremove(intindex):删除指定索引位置的元素 Objectset(intindex,Objectele):设置指定索引位置的元素为ele intindexOf(Objectobj):返回obj在集合中首次出现的位置。没有的话,返回-1 intlastIndexOf(Objectobj):返回obj在集合中最后一次出现的位置.没有的话,返回-1 ListsubList(intfromIndex,inttoIndex):返回从fromIndex到toIndex结束的左闭右开一个子list List常用的方法:增(add(Objectobj))删(remove)改(set(intinde

相关推荐

推荐阅读