自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qq_39403646的博客

用于个人学习整理

  • 博客(45)
  • 问答 (4)
  • 收藏
  • 关注

原创 网站高性能与可伸缩架构设计——负载均衡

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、高性能负载均衡单服务器无论如何优化,无论采用多好的硬件,总会有一个性能天花板,当单服务器的性能无法满足业务需求时,就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质是通过增加更多的服务器来提升系统整体的计算能力。由于计算本身存在一个特点:同样的输入数据和逻辑,无论在哪台服务器上执行,都

2024-07-19 13:18:34 847

原创 网站高性能与可伸缩架构设计——基础介绍

系统是一个整体,如果只是节点级别的伸缩,可能要对多个节点分别进行操作,而且不同节点的资源配置会相互影响,这样对各个节点的调整就非常复杂,影响了系统 的可伸缩能力。系统处理请求不一定要实时同步,请求流量的高峰期时间往往很短,所以有些时候,可以延长系统的处理时间,只要在一个相对合理的时间内,系统能够处理完请求就可以了,这是一种异步化的处理方式。可异步处理:异步处理给系统的处理增加了弹性空间,可以利用更多的处理时间,来降低系统对资源 的实时需求,在保证系统处理能力的同时,降低系统的成本。

2024-07-19 13:17:25 537

原创 网站高性能架构设计——高性能缓存架构

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、缓存基础1.缓存简介缓存提升性能的幅度,不只取决于存储介质的速度,还取决于缓存命中率。为了提高命中 率,缓存会基于时间、空间两个维度更新数据。在时间上可以采用 LRU、FIFO 等算法淘汰 数据,而在空间上则可以预读、合并连续的数据。如果只是简单地选择最流行的缓存管理 算法,就很容易忽略业务特性,从而

2024-07-09 13:17:46 1292

原创 性能优化——性能分析

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、性能分析简介在完成性能测试之后,需要输出一份性能测试报告,分析系统性能测试的情况。其中测试结果需要包含测试接口的平均、最大和最小吞吐量,响应时间,服务器的 CPU、内存、I/O、网络 IO 使用率,JVM 的 GC 频率等。通过观察这些调优标准,可以发现性能瓶颈,我们再通过自下而上的方式分析查找

2024-05-05 08:57:50 1111 2

原创 性能调优入门

具体来讲,对两个事件 A 和 B 而言,“发生事件 A”在“事件 B 发生”的条件下的概率,与“发生事件 B”在“事件 A 发生”的条件下的概率是不一样的。但是观察火焰图底部或中部方块的宽度占比意义不大,如上面的火焰图,中部的 do_redirections 函数宽度是 24.87%,也就是说它耗用了整个应用近四分之一的时间,但是真正消耗时间的并不是 do_redirections 函数,而是 do_redirections 内部又调用的其他函数,而它的子调用分为了很多个,每个调用的耗时并没有异常。

2024-05-05 08:57:13 518

原创 构建完善微服务——API 网关

另一方面异步模型没有一个明确清晰的请求->处理->响应执行流程(call flow),它的流程是通过事件触发的,请求处理的流程随时可能被切换断开,内部实现要通过一些关联id机制才能把整个执行流再串联起来,这就给开发调试运维引入了很多复杂性,比如你在IDE里头调试异步请求流就非常困难。通常API网指的是业务网关。与流量网关相对应的就是业务网关,业务网关更靠近我们的业务,也就是与服务器应用层打交道,那么有很多应用层需要考虑的事情就可以依托业务网关,例如在线程模型、协议适配、熔断限流,服务编排等。

2024-04-21 16:55:43 964

原创 构建完善微服务——配置中心

而文件的缓存的作用就是灾备,当应用程序重启时,一旦配置中心发生故障,那么 应用程序就会优先使用文件中的配置,这样虽然无法得到配置的变更消息(因为配置中心已 经宕机了),但是应用程序还是可以启动起来的,算是一种降级的方案。一种是长连推送的方式。集群cluster:在多机房的环境下,针对不同的机房,可以划分出不同的集群,集群可以拥有不同的配置。配置与应用分离:解决传统的“配置文件无法区分环境”的问题,配置并不跟着环境走,当不同环境有不同需求的时候,就到配置中心获取即可,极大的减轻了运维部署成本。

2024-04-21 16:54:26 938

原创 构建完善微服务——服务自动注册服务发现

比如,主机每隔 1 秒上报一次心跳,而考虑到网络可能丢包,故 5 秒内失去心跳就认为宕机,这种情况下,如果主机 A 在第 10 秒时失去心跳,那么第 11、12、13、14 这 4 秒对主机 A 的遍历,都是多余的,只有第 15 秒对主机 A 的遍历才有意义。如何设计快速的宕机判断算法呢?新的心跳包进入队列尾部,而老的心跳包则从队列首部退出,这样,寻找宕机服务时,只要看队列首部最老的心跳包,距现在是否超过 5 秒,如果超过 5 秒就认定宕机,同时把它取出队列,否则证明队列中不存在宕机服务,维持队列不变。

2024-04-16 09:29:14 528 1

原创 构建完善微服务架——服务描述和服务框架

所以,Feign在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义,「在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它」 (类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。这样的话,客户端就能够实时的根据自身访问每个节点性能的快慢,动态调整访问最慢的那些节点的权重,来减少访问量,从而可以优化长尾请求。

2024-04-16 09:28:40 777

原创 网站可扩展架构设计——中台

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、中台简介1.传统项目架构的痛点(1)重复造轮子各项目相对独立,许多项目在重复造轮子,让项目本身越来越臃肿,也使开发效率越来越低。(2)前台和后台发展速度不同 前台:由各类前台系统组成的前台业务平台。每个前台系统都是一个用户触点,大多是企业最终用户直接使用的系统,是企业与最终用户的交点。例如用

2024-04-03 20:48:19 1109

原创 网站可扩展架构设计——领域驱动设计(下)

薄薄的一层,不包含业务逻辑,主要面向用例和流程相关的操作,定义软件要完成的任务,协调多个聚合的服务和领域对象完成服务编排和组合。其次,实体和领域模型在实现业务逻辑上不是同级的,当领域中的某些功能,单一实体(或者值对象)不能实现时,领域服务才会出马,它可以组合聚合内的多个实体(或者值对象),实现复杂的业务逻辑。还是可以借鉴聚合的思想,仍然用聚合来定义这部分功能,并采用与典型领域模型同样的分析方法,建立实体的属性和方法,对方法和服务进行封装和分层设计,设计仓储,建立领域对象之间的依赖关系。

2024-04-03 20:47:22 811

原创 网站可扩展架构设计——领域驱动设计(中)

所谓的六边形架构,其实是分层架构的扩展,原来的分层架构通常是上下分层的,比如常见的MVC模式,上层是对外的服务接口,下层是对接存储层或者是集成第三方服务,中层是业务逻辑层。但是并不建议直接将实体暴露在外,一来实体的某些隐私属性并不能对外暴露,二来某些资源获取场景并不是一个实体就能满足的,因此我们在实际实践过程中,在领域模型上增加了dto这样一个角色,dto可以组合多个实体/值对象的资源对外暴露。整洁架构最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越低,代码级别越高,越是核心能力。

2024-03-31 21:07:45 779

原创 网站可扩展架构设计——领域驱动设计(上)

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、【DDD】领域驱动设计简介1.什么是DDD——应对复杂性的利器DDD不是架构,而是一种架构设计方法论,它通过划分领域边界将复杂业务领域简单化,从而设计出清晰的领域和应用边界,可以很容易实现架构演进。可以利用DDD设计方法来建立领域模型,划分领域边界,再根据这些领域边界从业务视角划分微服务边界。从空间上来讲,

2024-03-31 20:59:12 1010

原创 网站可扩展架构设计——微服务

唯一能够支持多名研发维护同一个服务的理由,就是服务本身对公司的价值太大,它上面承载的业务量,对稳定性的要求,对服务连续性的要求,大到可以忽略研发资源的成本的时候;所以,你可以发现,对现有系统的改造,服务的边界划分主要是从圈表入手的,而不是从一 个服务应该有哪些功能入手的,这一点和新服务设计是有所不同的。通过库存表独立成库,可以从物理层面,切断业务团队对这些表的依赖,同时也可以 大幅度降低产品库的压力,特别是大促的时候,库存读写压力是非常大的,数据库独立也为 库存服务后续的技术优化打下了基础。

2024-03-28 10:13:09 586

原创 网站可扩展架构设计

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、可扩展性架构简介1.可扩展性是什么可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或者仅需要少量修改就可以支持,无须整个系统重构或者重建。由于软件系统固有的多变性,新的需求总会不断提出来,因此可扩展性显得尤其重要。面向对象思想的提出和设计模式的应用,就是为了解决可扩展性带来的

2024-03-28 10:03:18 419

原创 网站高可用架构设计——运维

一、灰度方案1.灰度的基本概念(1)灰度方案引入一个较大的业务或系统改动,往往会影响整个产品的用户体验或操作流程。为了控制影响面,可以选取一批特定用户、流程、单据等,只允许这一部分用户或数据按照变更后的新逻辑在系统中流转,而另一部分用户仍然执行变更前的老逻辑。这一步是线上系统灰度方案的起点。将用户按照特定规则分隔为两类之后,主要需要关注命中灰度的这部分用户,是否按照预期执行了新逻辑、产生了符合预期的数据,以及系统整体的变化等。此阶段即灰度观察阶段,线上验证工作也是其中的关键步骤。随着系统中使

2024-03-01 14:15:53 798

原创 网站高可用架构设计——异地多活与容灾

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、异地多活架构简介1.什么是异地多活无论是高可用计算架构,还是高可用存储架构,其本质的设计目的都是为了解决部分服务器故障的场景下,如何保证系统能够继续提供服务。但在一些极端场景下,有可能所有服务器都出现故障。例如,典型的有机房断电、机房火灾、地震、水灾……这些极端情况会导致某个系统所有服务器都故障,或者业务整体瘫痪,

2024-03-01 14:13:19 959

原创 如何计算点、线、面关系

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------普遍有三种方式 面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。 夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。 引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部

2024-02-23 14:52:28 681

原创 网站高可用架构设计——服务高可用

接口级故障的典型表现就是系统并没有宕机,网络也没有中断,但业务却出现问题了。例如,业务响应缓慢、大量访问超时、大量访问出现异常(给用户弹出提示“无法连接数据库”),这类问题的主要原因在于系统压力太大、负载太高,导致无法快速处理业务请求,由此引发更多的后续问题。例如,最常见的数据库慢查询将数据库的服务器资源耗尽,导致读写超时,业务读写数据库时要么无法连接数据库、要么超时,最终用户看到的现象就是访问很慢,一会访问抛出异常,一会访问又是正常结果。

2024-02-08 11:31:58 1293

原创 网站高可用架构设计——存储,分层,计算高可用

从公众号转载,关注微信公众号掌握更多技术动态。

2024-02-07 17:22:03 1146

原创 网站高性能架构设计——高性能数据库集群

1.高性能数据库方式读写分离:将访问压力分散到集群中的多个节点,没有分散存储压力分库分表:既可以分散访问压力,又可以分散存储压力2.为啥不用表分区如果SQL不走分区键,很容易出现全表锁;在分区表实施关联查询,就是一个灾难;分库分表,自己掌控业务场景与访问模式,可控;分区表,工程师写了一个SQL,自己无法确定MySQL是怎么玩的,不可控;分表分库规则在设计时需要考虑数据分布均匀,避免单库或者单表数据倾斜。1.分库分表简介如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

2024-01-19 09:00:41 498

原创 网站高性能架构设计——web前端与池化

从公众号转载,关注微信公众号掌握更多技术动态。

2024-01-19 08:58:56 1054

原创 性能调优入门

步骤:测试、分析、调优1.性能调优的时机不确定的性能调优方案应该在项目开发完成之后进行。所有的系统在开发完后,都会有一些性能问题,做性能调优之前首先要做的就是想办法把问题暴露出来,例如进行压力测试、模拟可能的操作场景等等,再通过性能调优去解决这些问题。当然如果是一些十分成熟的性能调优方案可以直接在项目开发过程中完成(减少磁盘 I/O 操作、降低竞争锁的使用以及使用高效的算法等)。2.稳定性和业务可持续性,通常比性能更重要。

2024-01-19 08:55:31 833

原创 性能优化三步骤(一)——性能分析

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、性能分析简介在完成性能测试之后,需要输出一份性能测试报告,分析系统性能测试的情况。其中测试结果需要包含测试接口的平均、最大和最小吞吐量,响应时间,服务器的 CPU、内存、I/O、网络 IO 使用率,JVM 的 GC 频率等。通过观察这些调优标准,可以发现性能瓶颈,我们再通过自下而上的方式分析

2024-01-18 11:57:11 1205

原创 一文带你了解架构设计

架构实现从无序到有序,是通过合理的内部编排实现的,基本的手段,就是“分”与“合”,先把系统打散,然后将它们重新组合,形成更合理的关系。有了 TP99 这样的概念,就可以定义系统的 SLA 了,SLA 是 Service-Level Agreement, 它是系统对于它的客户所承诺的可以提供的服务质量,既包括功能,也包括性能。每个结构域的分解过程,都是一个迭代过程。迭代的过程就是一个否定之否定的过程,随着分解的逐步推进或系统的架构演化,后面的分解除了会识别出新的架构元素,也可能会对先前识别出的架构作出调整。

2024-01-18 11:54:57 1736

原创 编程性能调优方案

具体来讲,对两个事件 A 和 B 而言,“发生事件 A”在“事件 B 发生”的条件下的概率,与“发生事件 B”在“事件 A 发生”的条件下的概率是不一样的。但是观察火焰图底部或中部方块的宽度占比意义不大,如上面的火焰图,中部的 do_redirections 函数宽度是 24.87%,也就是说它耗用了整个应用近四分之一的时间,但是真正消耗时间的并不是 do_redirections 函数,而是 do_redirections 内部又调用的其他函数,而它的子调用分为了很多个,每个调用的耗时并没有异常。

2024-01-18 11:53:35 772 1

原创 如何通过DB操作地理空间数据

1.什么是空间数据库PostGIS是一个空间数据库,Oracle Spatial和SQL Server(2008和之后版本)也是空间数据库。空间数据库像存储和操作数据库中其他任何对象一样去存储和操作空间对象。空间数据与数据库关联起来的三个要素:数据类型、索引和函数空间数据类型用于指定图形为点(point)、线(line)和面(polygon)多维度空间索引被用于进行空间操作的高效处理(注意是多维度哦,而不是只有针对二维空间数据的索引)空间函数构建于SQL语言中,用于进行空间属性和空间关系的查询。

2024-01-17 16:15:26 964

原创 网站高可用架构设计基础

不要尝试着去避免故障,而是要把处理故障的代码当成正常的功能做在架构里写在代码里。高可用是一种面向风险设计,使系统具备控制风险,提供更高的可用性的能力。网站页面能完整呈现在最终用户面前,需要经历很多环节,任何一个环节出现了问题出了问题,都可能导致网站页面不可访问,所以在架构设计的时候很可能遗漏某个环节的高可用设计,这也就让那个高可用变成了最为复杂的架构设计点。架构的高可用,就意味着实现系统中所有元素、连接的高可用。在用户眼里,业务永远是正常(或基本正常)对外提供服务的。

2024-01-17 16:03:15 829

原创 网站高性能架构设计——高性能NOSQL与缓存

1.关系数据库存在如下缺点(1)关系数据库存储的是行记录,无法存储数据结构以微博的关注关系为例,“我关注的人”是一个用户 ID 列表,使用关系数据库存储只能将列表拆成多行,然后再查询出来组装,无法直接存储一个列表。(2)关系数据库的 schema 扩展很不方便。

2024-01-17 15:57:18 1636

原创 prompt工程

微信公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、prompt基础提示包括传递给语言模型的指令和语境,以实现预期的任务。提示工程是开发和优化提示的实践,以便在各种应用中有效地使用语言模型(LMs)提示工程是人工智能工程师和研究人员改进和有效使用语言模型的一项有用技能。模型容易受到最新偏差的影响,在这种情况下,末尾 Prompt 信息可能比开头 Prompt

2023-12-11 09:40:13 1595

原创 数据库开发规范

这些问题都会改动线上的数据库表结构,一旦改动就会导致锁表,会使所有的写入操作一直等待,直到表锁关闭,特别是对于数据量大的热点表,添加一个字段可能会因为锁表时间过长而导致部分请求超时,这可能会对企业间接造成经济上的损失。非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会不出现在慢查询中(latency可查)),查找方法和删除方法。

2023-12-11 09:38:46 1173

原创 高效的多维空间点索引算法——GeoHash

根据Geohash的编码规则将经纬度分解到二进制,结合地理常识,中心网格在南北(上下)方向上体现为纬度的变化,往北则维度的二进制加1,往南则维度的二进制减1,在东西(左右)方向上体现为经度的变化,往东则经度的二进制加1,往西则减1,可以计算出上下左右四个网格经纬度的二进制编码,再将加减得出的经纬度两两组合,计算出左上、左下、右上和右下四个网格的经纬度二进制编码,从而就可以根据Geohash的编码规则计算出周围八个网格的字符串。Z 阶曲线通过交织点的坐标值的二进制表示来简单地计算多维度中的点的z值。

2023-12-08 16:56:00 1613

原创 空间地图GIS基础

但与纬度的起点(即赤道,赤道是指地球表面的点随地球自转产生的轨迹中周长最长的圆周线)由地球本身决定所不同,本初子午线是由人为定义的,理论上任何一条经线都可以被定义为本初子午线。把参考椭球体和基准面结合起来看,如果把地球比做是“马铃薯”,表面凸凹不平,而参考椭球体就好比一个“鸭蛋”,那么按照前面的定义,基准面就定义了怎样拿这个“鸭蛋”去逼近“马铃薯”某一个区域的表面,X、Y、Z轴进行一定的偏移,并各自旋转一定的角度,大小不适当的时候就缩放一下“鸭蛋”,通过如上的处理必定可以达到很好的逼近地球某一区域的表面。

2023-12-08 13:22:25 1187

原创 软件工程之UML建模

当我们切入到一个新领域中,并非短时间内就要成为该领域的专家,急需一种方法用20%的时间能够掌握该领域80%的业务知识,一个可行的方法就是建模,通过对现实业务进行抽象,构建出全局业务概念模型,有了全局的认识,再去了解业务细节就会快得多。空间维度即是结构关系,比如下图中的组织结构,像这样的结构类型,我们还可以找到更多的实际案例,比如交易订单有主子订单结构,执行单包含多个执行明细信息,模型最终呈现出来的就是一个结构,从结构维度也可以将其分解出更小的粒度。一种特殊的状态图,展现了系统内一个活动到另一个活动的流程。

2023-12-07 12:27:47 1252

原创 软件工程之系统质量

其实在代码 Review 的时候大可不必有什么心里负担,有什么疑惑的、不清楚的地方或者有什么自己的想法,可以直接提出来,有时候一个简单的 Comment 就可能会激起 Author 和你的 Comment 毫不相干的新思路。在需求评审阶段就发现需求上的不合理,在技术设计阶段就发现技术方案的问题所在,在测试验证阶段发现系统的bug和产品bug,修复这些环节发现的问题的成本逐渐升高,但如果问题对客后才被发现,修复的成本将是巨大的,可能会影响客户体验和满意度,或造成资损,甚至导致公司名誉受损。

2023-12-06 12:43:42 1081

原创 软件工程之架构设计

​在架构过程中,需求分析阶段,我们关注用户需求的精确表述,会引入 角色,也就是系统的各类参与方,以及角色间的交互方式,也就是用户故 事。相反,业务逻辑代码侧重 内部实现,不涉及被外部依赖的接口,也不包含持久化的数据,所以对改动的容忍性更大。假设要对某个模块重构。​详细设计阶段,是需要各个子系统或 模块的负责人,对他负责的部分进行进一步的细化。​业界已经有了很多成熟的架构设计模式,不需要闭门造车,可以在理解清楚业务需求后,找到相近的架构设计,然后基于成熟的架构设计方案,进行改造,变成适合自己业务需求的架构。

2023-12-06 12:37:32 1325

原创 软件工程之需求分析

分析的起点是问题本身,比如现象、痛点、挑战、价值等,从这些基础点去分析,如分析一个业务时,从业务愿景和业务目标去看这个业务有哪些利益相关者,也即有哪些角色在使用这个业务,从这些利益相关者的角度去思考他们的本质诉求,正是他们的诉求构成了我们要做什么的输入,不管外部怎么变化,他们的本质诉求是不变的,如对于消费者来讲,他们的诉求是花最短的时间、最少的钱、更好的体验买到心仪的商品;利益相关者也是从业务组成结构中推导出来的,这一部分是最顶层的分析,分析业务的可行性,也即我们常说的Why。

2023-12-06 12:27:00 3320

原创 软件工程之项目规划

一个项目中有不同的角色,业务方、产品、前端、后端、算法、数据,对于一起开会时经常提起的概念,大家的理解并不一定一致。举个简单的例子,比如业务方有个二分类的需求,要从一些商户中找到其中不合规的商户,模型预测结果如下图所示,但是一个人以为的准确率是(a + d) / (a + b + c + d),另一个人以为的是d / (b + d)。Ticket跟踪最早源于客服的工单系统,每次客服接到一个问题,就创建一个工单,后续和客户的每一次交流和处理,都要更新工单内容和状态,直到结束。内容:Ticket的详细内容。

2023-12-06 12:19:58 1004

原创 软件工程基础

从公众号转载,关注微信公众号掌握更多技术动态---------------------------------------------------------------一、什么是软件工程1.定义最开始:为研究和克服软件危机而生;官方定义:讲系统化、规范的、可度量的方法用于软件的开发、运行和维护的过程。抓住定义的本质:用工程化方法去规范软件开发,让项目可以按时完成,成本可控、质量有保障。2.软件工程的核心软件工程 = 工具 + 方法 + 过程 过程:在软

2023-12-05 13:24:07 1026

原创 使用playwright进行图片截图

只需要先删除这个软链接,之后重新设置一个软链接让libstdc++.so.6 指向我们机器上的那个版本libstdc++.so.6.0.19就解决这个问题了。playwright对系统的版本要求较高,如果出现让升级系统的提示绝对不要升级,如果升级失败可以采用以下方式进行回退。防止截图是未加载完成的图片,可以通过识别文字的方式验证图片是否加载完成(tesseract的使用参考网络)但是这种方法导致文件引用关系异常,需要把引用的相关路径加到sys中。如果想要通过接口形式调用则需要使用​​​​​​​。

2023-12-05 12:57:38 672

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除