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

uniapp之ios开发及支付整体流程爬坑记录

前言

在写这篇记录的时候,关于ios的支付已经对接的差不多了,下一步就是测试好了直接发版,总共花了好几周的时间,从0到1对于首次做ios支付来说,确实很多坑。

其实业务层面很简单,甚至比安卓支付还简单,因为支付的整体流程uniapp那边已经提供好了,甚至可以直接套模板。主要坑在于不了解ios内购这套东西,及其细节处理。

该APP使用的是uv-ui组件库,uv-ui 破釜沉舟之兼容vue3+2、nvue、app、h5、小程序等多端基于uni-app和uView2.x的生态框架,支持单独导入,开箱即用,利剑出击。

准备工作

最重要的就是准备证书、描述文件等环节。现在uniapp开发ios没有这两样东西,不能真机运行。还需要区分测试证书和正式证书,本地真机运行只能使用测试证书,正式证书只能打包上传后台到TestFlight中下载测试或提App Store审核(即时到了这步,内购也只能使用沙箱环境支付,非正式支付。只有App Store审核通过后才能走真实支付,这里建议开发灰度测试功能,后续会详细讲解)。

注册账号及创建APP等准备工作都是产品去做的,所以对此流程可能会有遗漏,所以只记录大概我所了解。

  1. 创建你的 Apple ID:https://developer.apple.com/account
  2. 创建一个App应用:
    • 登录iTunes Store,点击我的App
    • 新建一个App(如果App已经创建,直接点击App进入就行了)
    • 填写App的基本信息
  3. 创建证书、描述证书等(Certificates, Identifiers & Profiles):Apple后台、uniapp申请证书引导
    • 需要mac电脑
    • 证书及描述文档要分别创建开发版(Development)和发行版(Distribution),参考uniapp申请证书引导
    • 本地调试使用Development,打包上线审核使用Distribution
  4. 最终需要的东西:
    • Bundle ID(AppID)- 创建证书的时候会填写,类似安卓的证书名(推荐反域名+app标识
    • 证书 - xx.p12文件
    • 描述文件 - xx.mobileprovision文件
    • 证书私钥密码 - 创建证书的时候填写的密码
  5. 首次运行需要进行基座签名
    • 我是使用的 爱思助手 进行的基座签名
    • 具体使用请参考uniapp提供的基座签名指南,描述的很详细,跟着操作就OK
  6. 如果有ios内购项目,添加内购项目:
    • 点击我的App进入App Store
    • 选择功能/App内购买项目
    • 创建App内购买项目:类型、产品 ID等信息
    • 最后须知:ios内购的模式是充值,只能是创建固定的金额进行支付,并且平台抽成30%
  7. 添加沙盒账号
    • 回到iTunes Store首页,点击用户和访问权限 进入 用户和访问
    • 点击沙箱测试员
    • 添加沙箱测试账号信息:沙箱账号的邮件地址是需要没有注册过Apple ID的邮箱,知道这点很重要
    • 总结:沙箱测试账号的作用,在后面测试支付的时候会让输入账号和密码,这时候就需要用到这个沙箱账号了,否则其他账号密码是没用的

真机运行

  1. 完成上面的所有准备,就可以直接使用hbuilderX运行到苹果手机上面
  2. 总之,在使用hbuilderX运行到真机的时候,提示缺什么,我们就需要按照上面的方法准备什么

正式开发

业务开发
  1. 使用app-nvue技术开发ios,90%的代码与安卓都是通用的,毕竟多平台跨端开发,只是有些兼容性问题,需要单独处理而已,具体问题具体分析。
  2. 具体开发的内容就不做详细的介绍,接下来把ios内购买项目做简单的记录。
ios内购开发
  1. 参考文档:uniapp之苹果应用内支付,在开发之前一定要对该文档进行通读和了解,很多开发代码合流程都在这里面。
  2. 后端需要准备两个接口:
    • 接口1:生成业务订单号,前端需要获取后做相关关联
    • 接口2:最后一步,在服务器端请求苹果服务器验证票据
  3. 前端开发步骤:
    • 写好充值页面
    • 创建公共文件iap.js,封装的支付相关处理逻辑,方便后续调用,代码是现成的,直接到示例代码复制
    • 确认充值相关逻辑,完整示例代码,该示例里面需要完善两个接口的逻辑。注意:示例代码可能造成丢单情况,需要配合本地缓存进行处理,参考下面的完整示例。
    • 为了方便理解,我把开发中的完整代码贴在下面:

充值页面混入pay.ios.js:

import { Iap, IapTransactionState } from "@/common/js/iap.js"
export default {data() {return {title: "iap",loadingIOS: false,disabled: true,productId: "",productList: [],isError: false}},methods: {async payInitIOS() {uni.showLoading({mask: true,title: '苹果验证中,请稍等'});this.isError = false;// 创建实例this._iap = new Iap({products: [this.productId] // 苹果开发者中心创建})try {// 初始化,获取iap支付通道await this._iap.init();// 从苹果服务器获取产品列表this.productList = await this._iap.getProduct();this.productList[0].checked = true;this.productId = this.productList[0].productid;// 填充产品列表,启用界面this.disabled = false;} catch (e) {this.isError = true;uni.showModal({title: "init",content: e.message,showCancel: false});} finally {if (this._iap._ready && !this.isError) {this.restore();} else {uni.hideLoading();}}},async restore() {// 检查上次用户已支付且未关闭的订单,可能出现原因:首次绑卡,网络中断等异常// 在此处检查用户是否登陆// uni.showLoading({// 	mask: true,// 	title: '苹果验证中,请稍等'// });try {// 从苹果服务器检查未关闭的订单,可选根据 username 过滤,和调用支付时透传的值一致const transactions = await this._iap.restoreCompletedTransactions({username: ''});if (!transactions.length) {return;}// 开发者业务逻辑,从服务器获取当前用户未完成的订单列表,和本地的比较// 此处省略for (let i = 0; i < transactions.length; i++) {const transaction = transactions[i];switch (transaction.transactionState) {case IapTransactionState.purchased:this.isError = true;// 用户已付款,在此处请求开发者服务器,在服务器端请求苹果服务器验证票据uni.showLoading({mask: true,title: '您有一笔订单正在处理中...'})const order_sn = transaction.payment.username || uni.getStorageSync('IOSPAYORDERID');if(!order_sn) {this.isError = false;return await this._iap.finishTransaction(transaction);}let result = await this.validatePaymentResult({product_id: transaction.payment.productid,order_sn: order_sn,receipt: transaction.transactionReceipt, // 不可作为订单唯一标识transactionIdentifier: transaction.transactionIdentifier}, 0);// 验证通过,交易结束,关闭订单if (result) {await this._iap.finishTransaction(transaction);}break;case IapTransactionState.failed:this.isError = false;// 关闭未支付的订单await this._iap.finishTransaction(transaction);break;default:break;}}} catch (e) {// 为了兼容高版本机型在取消订单时候出现的错误,重启后不存在if(e.code == -100 && e.errMsg.indexOf("本地没有响应要移除的事务")>-1){this.isError = false;return;}this.isError = true;uni.showModal({title: `restore${e.errCode}`,content: e.message,showCancel: false});} finally {if (!this.isError) {this.paymentIOS();} else {uni.hideLoading();}}},async paymentIOS() {if (this.loadingIOS == true) {return;}this.loadingIOS = true;uni.showLoading({mask: true,title: '支付处理中...'});try {// 从开发者服务器创建订单const orderId = await this.createOrder({productId: this.productId});// orderId存在本地,防止丢失uni.setStorageSync('IOSPAYORDERID', orderId);// 请求苹果支付const transaction = await this._iap.requestPayment({productid: this.productId,username: orderId,manualFinishTransaction: true,quantity: 1});// 在此处请求开发者服务器,在服务器端请求苹果服务器验证票据await this.validatePaymentResult({product_id: this.productId,order_sn: transaction.payment.username || orderId,receipt: transaction.transactionReceipt, // 不可作为订单唯一标识transactionIdentifier: transaction.transactionIdentifier});// 验证成功后关闭订单await this._iap.finishTransaction(transaction);// 支付成功this.paySccuess();} catch (e) {uni.$uv.toast('支付取消或失败');} finally {this.loadingIOS = false;uni.hideLoading();}},createOrder({ productId }) {return new Promise((resolve, reject) => {this.getOrderInfo({ product_id: productId }).then(res => {resolve(res.order_no);})})},/*** 充值,e.code = 201 或 then返回均代表 处理成功* @param {Object} data 订单数据*/validatePaymentResult(data, type = 1) {return new Promise((resolve, reject) => {const fn = (loading = 1) => {this.validatePayment(data, loading).then(res => {// 处理成功uni.hideLoading();if (type == 0) {this.successTip();}resolve(true);}).catch(e => {if (e.code == 201) { //处理成功-订单已更新this.successTip();uni.hideLoading();resolve(true);} else {setTimeout(() => {fn(0);}, 3000)}})}fn(type == 0 ? 0 : 1);});},applePriceChange(e) {this.productId = e.detail.value;},successTip() {uni.showModal({title: '温馨提示',content: '您的待处理订单已经处理成功,充值金额已到您的账户余额中,请注查收!',showCancel: false,confirmText: '我知道了'});}}
}

测试支付

  1. 其实ios内购在整个业务逻辑并不复杂,不需要像其他支付进行轮询监听等逻辑,ios内部已经做好了这些事情。
  2. 开始测试就需要对ios这个后台有所了解,我也是第一次接触,所以更多的时间是摸索后台怎么设置,我就讲讲我到底经历了哪些问题:
    • 第一步实例化支付就失败了,后来发现是内购项目未创建,必须先创建购买项目,代码中需要使用产品ID。
    • 购买项目创建好后,实例化等逻辑可以走通了,支付之前会弹出一个让输入账号密码的弹窗。一开始我以为是输入自己的AppleID和密码,试了下输入后提交就失败了。在这里也卡了不少时间,后来发现这里是输入沙箱账号,后来创建了沙箱账号成功支付。
    • 测试过程中,发现有丢单情况,可能是由于网络或者后端验证失败等其他原因,导致最后断单了,只有重启APP才能补单,但是有些机型发现请求苹果支付this._iap.requestPayment传的username参数也会丢失,导致补单的时候和我们的订单关联不上,所以后端无法做最后的验证票据,我们的处理方式是配合本地缓存进行处理,如果只是单个订单支付,就可以这样处理,这里的坑在后面专门进行说明,上述完整示例代码中也有体现。
    • 沙箱环境测试通过,接下来想使用正式支付。开始使用TestFlight测试(测试人员可以在这个软件上安装app进行测试);后来发现在发布App Store审核上线之前,都只能进行沙箱环境支付,这个确实有点坑。经过咨询官方给的解决方案:设置几个账号进行灰度测试,以前没有这个概念,现在终于明白了,灰度测试是这样使用的,经过商量就开发了灰度测试功能,就是固定几个账号才能在上线后支付,等支付没问题后,再放开所有账号支付权限。

开发过程中遇到的坑

首次开发ios及其内购买项目,遇到坑是正常的,感谢这次机会,至少让我得到了成长,接下来就讲讲整个ios开发遇到了哪些坑:

坑一:本地没有响应要移除的事务

如果输入沙箱账号和密码支付后未完成后续验证,杀掉APP进程,重启APP进行补单。这时候肯定会检测到未支付的订单,就需要手动关闭订单this._iap.finishTransaction。但是某些苹果机型一直反馈错误信息:undefined.Payment_appleiap:本地没有响应要移除的事务,https://ask.dcloud.net.cn/article/282

原因分析:在6s机型没有这问题,在7等机型会有这个问题,导致支付流程不能往下执行

解决方案:捕捉到此错误,然后就当正确的逻辑处理,在上述完整示例代码中也有体现

catch (e) {// 为了兼容高版本机型在取消订单时候出现的错误,重启后不存在if(e.code == -100 && e.errMsg.indexOf("本地没有响应要移除的事务")>-1){this.isError = false;return;}
<!--后面的逻辑在省略-->
坑二:不能真实支付

本地只能沙箱账号进行支付测试,怎么办?

解决方案:根据uni官方的回复,灰度测试,设置几个固定账号进行上线后测试,其他账号暂不支持支付。官方回答:https://ask.dcloud.net.cn/question/179074?notification_id-1321394__rf-false__item_id-254173#!answer_254173

坑三:丢单+补单

输入密码支付过程中,杀掉进程,会造成丢单情况

原因分析:由于网络或者用户主动关闭APP等情况,支付流程断掉,如果根据username进行订单关联,可能有些机型在补单的时候丢失该值,最终导致丢单,这在ios是正常情况

解决方案:

  1. 根据业务需求,配合本地缓存将订单记录,在补单的时候好做对应
  2. 可以不使用订单号,据说ios没得订单号的概念,直接后端进行验证,这种方案我们没试过
  3. 这里有个keep客户端开发也遇到丢单的情况,经过多次测试修改,最终的流程和我们的处理方案一致,这个很有参考意义:根治顽疾:Keep客户端 In-App Purchase 掉单踩坑指南
坑四:打包上传

打包上传到iTunes Store,versionCode每次上传都得高于上一次,versionName可以不变

上传到iTunes Store的工具推荐(必须mac):通过 Transporter App 上传 App 的二进制文件

坑五:打开APP苹果手机发烧严重

同一套代码,在安卓机没问题。但是在ios发现发烧很严重,打开APP就开始发烧。

原因分析:1. 开始以为是本地基座的问题,其实仔细想想不会是这个问题,uniapp不会这么拉胯;2. 经过代码排查,发现是因为image标签使用了@load,我们APP中恰好有很多图片展示,这应该是ios这边的机制比较耗CPU,导致发热严重。

解决方案:去掉image上的@load,取消图片加载效果,只做图片失败效果

坑六:uniapp打包提示:打包时未添加OAuth模块

原因分析:代码中使用了uni.preLogin相关,但是ios并未涉及相关模块,所以在ios端屏蔽掉就OK了。

解决方案:参考文档:http://www.codingwhy.com/view/12174.html

坑七:审核多次驳回
  1. 后续补充

相关文章:

uniapp之ios开发及支付整体流程爬坑记录

前言 在写这篇记录的时候&#xff0c;关于ios的支付已经对接的差不多了&#xff0c;下一步就是测试好了直接发版&#xff0c;总共花了好几周的时间&#xff0c;从0到1对于首次做ios支付来说&#xff0c;确实很多坑。 其实业务层面很简单&#xff0c;甚至比安卓支付还简单&…...

AutoDL百川大模型体验

文章目录 镜像克隆模型下载测试效果AutoDL自定义服务 感谢AutoDL和CodeWithGPU这两个平台&#xff0c;让我们能低成本&#xff0c;低门槛地部署体验这些大模型 镜像克隆 我是在CodeWithGPU上克隆的这个镜像 模型下载 codewithgpu有介绍 注意这三个文件都需要下载 把那个&quo…...

蓝桥杯每日一题2023.10.8

题目描述 七段码 - 蓝桥云课 (lanqiao.cn) 题目分析 所有的情况我们可以分析出来一共有2的7次方-1种&#xff0c;因为每一个二极管都有选择和不选择两种情况&#xff0c;有7个二极管&#xff0c;但是还有一种都不选的情况需要排除&#xff0c;故-1 枚举每个方案看是否符合要…...

jmeter,性能测试,Locust

一。性能测试的概念 1.性能&#xff1a;就是软件质量属性中的 “ 效率 ” 特性 2.效率特性&#xff1a; 时间特性&#xff1a;指系统处理用户请求的响应时间 资源特性&#xff1a;指系统在运行过程中&#xff0c;系统资源的消耗情况 CPU 内存 磁盘IO&#xff08;磁盘的写…...

opencv图像的直方图,二维直方图,直方图均衡化

文章目录 opencv图像的直方图&#xff0c;二维直方图&#xff0c;直方图均衡化一、图像的直方图1、什么是图像的直方图&#xff1a;2、直方图的作用&#xff1a;3、如何绘制图像的直方图&#xff1a;&#xff08;1&#xff09;cv::calcHist()函数原型&#xff1a;英文单词 calc…...

c++中的map和set

文章目录 1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用 3.2 map3.2.1 map的介绍3.2.2 map的使用 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用 3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用 1. 关联式容器 在初阶…...

Swagger使用详解

目录 一、简介 二、SwaggerTest项目搭建 1. pom.xml 2. entity类 3. controller层 三、基本使用 1. 导入相关依赖 2. 编写配置文件 2.1 配置基本信息 2.2 配置接口信息 2.3 配置分组信息 2.3.1 分组名修改 2.3.2 设置多个分组 四、常用注解使用 1. ApiModel 2.A…...

ToBeWritten之车联网安全中常见的TOP 10漏洞

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

软考-密码学概述

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 密码学基本概念 密码学的主要目的是保持明文的秘密以防止攻击者获知&#xff0c;而密码分…...

windows 2003、2008远程直接关闭远程后设置自动注销会话

1、2003系统&#xff1a; 按开始—运行—输入“tscc.msc”&#xff0c;打开“终端服务配置”。 单击左边窗口的“连接”项&#xff0c;右边窗口中右击“RDP-TCP”&#xff0c;选择“属性”。 单击“会话”项&#xff0c;勾选“替代用户设置”&#xff0c;在“结束已断开的会话”…...

iOS BUG UIView转UIImage模糊失真

iOS BUG UIView转UIImage模糊失真 ##UIView转成Image - (UIImage *)capture {UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0);[self.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *img UIGraphicsGetImageFromCurrentImageContext(…...

如何在10分钟内让Android应用大小减少 60%?

一个APP的包之所以大&#xff0c;主要包括一下文件 代码libso本地库资源文件&#xff08;图片&#xff0c;音频&#xff0c;字体等&#xff09; 瘦身就主要瘦这些。 一、打包的時候刪除不用的代码 buildTypes {debug {...shrinkResources true // 是否去除无效的资源文件(如…...

网络代理技术:保障隐私与增强安全

在当今数字化的世界中&#xff0c;网络代理技术的重要性日益凸显。无论您是普通用户还是网络工程师&#xff0c;了解如何使用代理技术来保护隐私和增强网络安全都是至关重要的。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和隐私保护中的关键作用。 1. Socks5代理&am…...

数据结构 | (二) List

什么是 List 在集合框架中&#xff0c; List 是一个接口&#xff0c;继承自 Collection 。 Collection 也是一个接口 &#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterable 也是一个接口&#xff0c;表示实现该接口的类是可以逐个…...

[NewStarCTF 2023 公开赛道] week1 Crypto

brainfuck 题目描述&#xff1a; [>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<-]>>>>>>>.>----.<-----.>-----.>-----.<<<-.>>..…...

C语言中文网 - Shell脚本 - 0

教程目录如下&#xff1a; 第1章 Shell基础&#xff08;开胃菜&#xff09; 1. Shell是什么&#xff1f;1分钟理解Shell的概念&#xff01; 2. Shell是运维人员必须掌握的技能 3. 常用的Shell有哪些&#xff1f; 4. 进入Shell的两种方式 5. Linux Shell命令的基本格式 6.…...

Transformer预测 | Pytorch实现基于Transformer 的锂电池寿命预测(CALCE数据集)

文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…...

2023年【通信安全员ABC证】找解析及通信安全员ABC证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 通信安全员ABC证找解析参考答案及通信安全员ABC证考试试题解析是安全生产模拟考试一点通题库老师及通信安全员ABC证操作证已考过的学员汇总&#xff0c;相对有效帮助通信安全员ABC证考试总结学员顺利通过考试。 1、【…...

前端框架Vue2.0+Vue3.0学习笔记01

一、Vue技术_课程简介 1、前端框架小白 2、熟练掌握Vue2 3、轻松玩转Vue3 ①、vue基础 ②、vue-cli ③、vue-router ④、vuex ⑤、element-ui ⑥、vue3 二、Vue技术_Vue简介 1、Vue是什么&#xff1f; 一套用于构建用户界面&#xff08;把你拿到手里的数据&#xf…...

iOS App上架全流程及相关处理

iOS app上架总体流程&#xff1a; 一、IOS上架整个流程 1、申请开发者账号 2、创建APP ID及申请证书 3、itunes connect 创建APP 4、打包 上传APP 5、提交APP&#xff0c;上线成功 1、申请开发者账号 苹果开发者账号主要分为三种&#xff1a;个人账号、公司账号、企业账…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...