基于JWT跨语言开发分布式业务系统的挑战与实践:多语言协作的最佳方案
在现代分布式架构下,开发团队往往由来自不同技术栈和开发语言的工程师组成。如何有效地管理这些开发人员的协作,尤其是在实现跨语言的认证与授权机制时,成为了开发者面临的一个重大挑战。JSON Web Token(JWT)作为一种轻量级、跨语言的身份认证和授权标准,能够为分布式系统提供有效的解决方案。本文将探讨如何利用JWT在一个多语言开发的分布式业务系统中实现跨语言协作,分析在实际开发过程中可能遇到的技术难题与解决策略,并通过具体的实践案例,展示JWT在保证系统安全性、扩展性和跨语言兼容性方面的优势。
引言:
在当今的软件开发环境中,企业的业务系统往往是分布式的,且不同的模块可能由不同的技术栈和编程语言实现。例如,前端开发可能使用JavaScript或TypeScript,后端开发可能使用Java、Python、Go、Rust等不同的语言进行构建,甚至同一系统的不同服务可能采用不同的语言栈。这种多语言、多技术栈的开发模式带来了前所未有的灵活性,但也引发了一系列挑战,尤其是在系统的身份认证和授权方面。
JWT(JSON Web Token)凭借其轻量级、基于JSON格式、支持跨语言传递的特点,成为了许多分布式系统中实现认证和授权的首选方案。其主要优势在于,JWT能够通过自包含的方式携带用户的认证信息,并且能够在不同语言和平台之间共享。无论是Java、Python还是Node.js,几乎所有主流编程语言都提供了JWT的支持库,使得跨语言的身份认证变得可行且高效。
然而,尽管JWT在跨语言认证方面表现优异,但在分布式业务系统的开发过程中,仍然存在许多需要关注的技术难题。本篇文章将深入探讨如何利用JWT解决跨语言协作中的认证和授权问题,并结合实际的案例分析,提供最佳实践和解决方案。
第一章:分布式系统中的跨语言协作
分布式系统是一种将系统功能分散到多个节点或服务上的架构,它具有更高的可扩展性和容错性。在分布式系统中,不同模块之间的协作至关重要。随着技术的不断发展,许多企业开始采用微服务架构,将系统拆分为多个相对独立的服务。这些服务可能由不同的开发团队开发,而这些团队的开发人员往往使用不同的编程语言。
例如,前端开发人员可能使用JavaScript(Vue、React等框架),而后端开发人员可能使用Java、Python、Go等编程语言。为了实现这些不同语言之间的无缝协作,必须有一种通用的协议或标准来解决不同系统之间的通信和身份认证问题。JWT作为一种跨语言、跨平台的标准,成为了分布式系统中最常用的解决方案之一。
第二章:JWT的基本原理与工作机制
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境中传递声明。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。这三部分通过“.”分隔,并采用Base64编码进行传输。
- 头部(Header): 通常包含令牌的类型(JWT)和使用的签名算法(如HS256)。
- 载荷(Payload): 包含实际传递的声明信息,通常是用户信息、权限信息、过期时间等。
- 签名(Signature): 用于验证令牌的完整性和来源,防止令牌被篡改。
JWT的工作流程通常包括以下几个步骤:
- 用户登录时,认证服务器验证用户信息,并生成一个JWT令牌,返回给客户端。
- 客户端将JWT令牌存储在本地(如LocalStorage、SessionStorage等),并在每次发送请求时将该令牌附加到HTTP请求头中。
- 服务器接收到请求后,通过验证JWT的签名来确认请求的合法性,如果合法,则继续处理请求。
由于JWT是自包含的,它携带了所有需要的信息,客户端和服务端无需再查询数据库进行验证,这使得JWT非常适合用于分布式系统中的身份认证。
第三章:跨语言开发中的JWT实现与挑战
在多语言开发的分布式系统中,JWT的最大优势之一就是它的跨语言特性。几乎所有流行的编程语言都提供了JWT的支持库。例如,Java使用jjwt
库,Python使用PyJWT
库,Node.js使用jsonwebtoken
库,Go语言使用golang-jwt/jwt
库等。
然而,跨语言开发也带来了一些挑战,特别是在以下几个方面:
-
签名算法的一致性: 不同语言的JWT库可能对签名算法的实现存在差异,导致跨语言验证失败。因此,在设计跨语言系统时,必须确保各个服务之间使用相同的签名算法和密钥。
-
时区和时间戳问题: JWT中通常包含过期时间(exp)和生效时间(nbf),这些时间戳需要保持一致,且要考虑时区的差异。开发人员需要特别注意时区的处理和时间戳的同步。
-
错误处理与兼容性: 各个语言中的JWT库在错误处理机制、异常抛出方式以及异常信息的格式上可能存在差异。这可能导致不同语言的服务在处理无效或过期的JWT时表现不一致。因此,必须在系统设计阶段进行充分的错误处理策略规划。
-
安全性和密钥管理: 由于JWT令牌的签名依赖于密钥,因此在多语言开发的分布式系统中,密钥的管理和共享变得尤为重要。如何确保密钥的安全存储与分发,避免泄漏和滥用,是一个亟待解决的问题。
第四章:跨语言协作的最佳实践
在分布式业务系统的开发中,多个开发团队使用不同的语言协同工作是常见的现象。为了确保系统的高效开发和稳定运行,以下是一些跨语言协作中的最佳实践:
-
标准化协议和规范: 为了确保系统各个部分的兼容性,团队应当在项目开始时就统一确定使用的JWT库和签名算法。通过制定详细的开发规范,可以减少因不同实现导致的问题。
-
统一的时间管理: 对于JWT中的时间戳,建议使用统一的时间源(如UTC时间)进行处理,避免因时区差异引发的问题。
-
密钥管理与共享: 在跨语言开发中,建议使用专门的密钥管理系统(如HashiCorp Vault、AWS KMS等)来管理密钥,确保密钥的安全传递和存储。
-
错误与异常处理机制的统一: 各语言中的错误处理方式应尽量统一。例如,定义统一的错误代码和错误消息格式,并确保所有服务能够一致地响应和处理认证失败的情况。
-
定期的跨团队沟通: 跨语言开发需要高度的协作,定期的跨团队沟通非常重要,尤其是在设计API接口和验证JWT的过程时,确保所有团队对JWT的使用和处理有统一的理解。
第五章:实际案例分析
通过一个具体的案例来展示如何在实际开发中使用JWT进行跨语言协作。假设我们正在开发一个电商平台的分布式系统,该系统由多个服务组成,包括用户服务、订单服务和商品服务等。这些服务分别使用Java、Node.js和Python进行开发,我们将通过JWT实现跨语言的身份认证和授权。
步骤1:设计JWT的结构和验证机制
首先,我们定义了JWT的结构,包括头部、载荷和签名部分。JWT的载荷中包含了用户的ID、角色信息以及权限等。在不同服务之间传递JWT时,所有服务都需要使用相同的密钥和签名算法进行验证。
步骤2:开发各个服务的JWT验证功能
- Java服务: 使用
jjwt
库进行JWT的解析和验证。通过JwtParser
类验证JWT的签名并解析其中的用户信息。 - Node.js服务: 使用
jsonwebtoken
库验证JWT,提取用户信息并根据权限决定是否允许访问资源。 - Python服务: 使用
PyJWT
库进行JWT验证和解析,确保JWT在Python服务中能够正常工作。
步骤3:统一时间戳格式和错误处理
所有服务都统一使用UTC时间格式,并且定义了统一的错误响应格式。当JWT无效或过期时,各个服务返回统一的错误代码和错误信息。
第六章:JWT在分布式业务系统中的安全性问题
尽管JWT在跨语言分布式系统中有诸多优势,但它也带来了一些安全性挑战。随着分布式系统中认证与授权需求的增加,JWT的安全性尤为关键。以下是JWT在分布式系统中可能遇到的安全问题及其解决方案。
1. JWT的泄露问题
由于JWT令牌中携带了用户的认证信息和权限信息,如果JWT令牌被盗取,攻击者可能会伪装成合法用户进行不正当访问。因此,防止JWT令牌泄露至关重要。
解决方案:
- 加密传输: 确保JWT令牌通过HTTPS进行传输,避免在传输过程中被窃取。
- 短生命周期令牌: JWT令牌应设置较短的有效期(例如10分钟),减少攻击者利用盗取令牌的时间窗口。
- 使用Refresh Token机制: 在短期内通过Access Token进行认证,过期后通过Refresh Token进行重新认证。这样,过期的令牌即使被盗也无法长期滥用。
2. JWT的签名问题
JWT的安全性依赖于签名的强度。如果攻击者能够破解签名算法或获得签名密钥,他们就能够伪造JWT令牌,进而绕过认证机制。
解决方案:
- 使用强大的签名算法: 推荐使用HMAC SHA-256或RSA等安全性较高的签名算法。
- 安全存储签名密钥: 不论是对称密钥还是非对称密钥,都必须妥善保管。可以使用专门的密钥管理工具,如HashiCorp Vault、AWS KMS等,来管理和保护密钥。
- 密钥轮换: 定期更换签名密钥,并确保所有服务及时同步更新密钥,避免长期使用同一个密钥。
3. JWT的过期问题
JWT通常包含一个过期时间(exp
字段),当令牌过期时,它应该被拒绝。过期时间的计算和验证至关重要,尤其是在跨时区和多个语言环境中。
解决方案:
- 统一时间源: 使用统一的时间标准(如UTC时间)进行过期时间的计算,避免由于时区差异导致的验证错误。
- 合理设计过期时间: 根据业务需求设置适当的过期时间。对于安全敏感的应用,可以将过期时间设置为较短时间,避免攻击者获得长期有效的令牌。
4. JWT伪造问题
JWT令牌中的载荷部分是Base64编码的,虽然不能直接被修改,但它是可以被解码并读取的。攻击者如果知道JWT的签名算法和密钥,可能会伪造合法的JWT令牌。
解决方案:
- 验证签名: 在每次使用JWT时,必须验证其签名,确保令牌未被篡改。
- 使用非对称加密算法: 如果使用非对称算法(如RSA),可以将公钥暴露给所有服务,只保留私钥在认证服务器,这样可以减少密钥泄漏的风险。
5. JWT的权限泄露问题
JWT中存储了用户的权限信息,如果设计不当,攻击者通过获取JWT令牌,可能会获取到不该拥有的权限。
解决方案:
- 最小权限原则: 在JWT的载荷部分,只包含必要的权限信息,不要将敏感信息或过多的权限信息存储在JWT中。
- 服务端权限验证: 尽管JWT可以在客户端携带用户权限信息,但服务端仍然需要验证用户是否有权限访问某些资源。JWT只是认证信息的载体,最终的权限判断应由服务端完成。
第七章:跨语言协作中的性能优化
在跨语言开发的分布式系统中,除了安全性,性能也是必须关注的问题。由于系统中涉及不同编程语言的服务交互和JWT的验证等操作,如何优化性能,确保系统高效运行,是开发者在实践中必须解决的问题。
1. JWT令牌的存储与传输
JWT令牌作为请求的一部分,需要在客户端和服务器之间传输。由于JWT令牌是自包含的,它的大小可能较大,尤其是在存储了大量用户信息或权限数据时。频繁地传输较大的JWT令牌可能会影响网络性能。
解决方案:
- 减少JWT载荷的大小: 只将最必要的信息存储在JWT的载荷部分。避免将过多的数据(如用户的完整资料或历史记录)放入JWT中。
- 压缩JWT: 对于较大的JWT令牌,可以使用压缩算法(如GZIP)进行压缩,减小其体积,从而减少网络传输开销。
2. JWT验证的性能影响
JWT令牌的验证过程通常包括计算签名、解码和验证过期时间等操作。虽然JWT验证是轻量级的,但在高并发的分布式环境下,频繁的JWT验证可能会影响服务器的性能。
解决方案:
- 缓存JWT验证结果: 可以使用缓存机制(如Redis)缓存JWT的验证结果,避免每次请求都进行重复验证。只需要验证JWT的有效性一次,然后将结果缓存一段时间。
- 并行处理: 在高并发场景下,可以通过多线程或异步处理来提高JWT验证的吞吐量。
3. 跨语言通信的优化
跨语言服务之间的通信可能涉及HTTP、gRPC、Message Queue等协议,不同协议的性能特性有所不同。例如,HTTP可能会带来较大的请求/响应头开销,而gRPC则能够提供更低的延迟和更高的传输效率。
解决方案:
- 选择合适的通信协议: 在分布式系统中,不同的服务之间应该根据业务需求选择合适的通信协议。对于高吞吐量和低延迟的服务,可以考虑使用gRPC或Protobuf等高效的序列化协议。
- 使用负载均衡: 在跨语言开发中,服务的负载均衡策略至关重要。合理配置负载均衡器,确保请求均匀分发到各个服务实例,避免单个服务节点的性能瓶颈。
第八章:开发团队协作与跨语言开发的管理
在跨语言的分布式系统开发中,开发团队的协作尤为重要。不同语言栈的开发人员之间需要紧密配合,确保系统的功能、性能、安全性等方面达到预期目标。
1. 开发流程与规范统一
跨语言开发的团队通常会面临不同编程语言之间的差异,尤其是在编码规范、异常处理、日志管理等方面。为了确保项目进展顺利,团队必须达成一致的开发流程与编码规范。
解决方案:
- 制定跨语言编码规范: 在项目开始时,团队应就代码风格、错误处理、日志格式等方面制定一致的规范,确保跨语言的代码整洁、可维护。
- 统一API设计标准: 在服务间进行通信时,API接口的设计应统一,采用RESTful或gRPC等标准化的API设计方式,减少语言间的差异。
2. 跨语言工具和文档支持
在跨语言协作中,不同语言栈的开发人员可能对其他语言的开发流程和工具不熟悉。因此,团队应提供充分的工具支持和技术文档,帮助开发人员更快上手和理解其他语言的实现。
解决方案:
- 自动化文档生成: 使用Swagger、OpenAPI等工具自动生成接口文档,确保各服务之间的API接口定义保持同步。
- 跨语言测试框架: 为了确保跨语言服务之间的兼容性,团队可以使用如Postman、JUnit、pytest等工具,进行自动化的接口测试。
3. 持续集成与部署
跨语言开发的分布式系统需要高效的持续集成(CI)和持续部署(CD)流程,以确保代码在不同语言栈中的协作能够顺利进行。
解决方案:
- 多语言的CI/CD管道: 在CI/CD过程中,确保每个语言栈的构建、测试和部署流程都得到支持。例如,使用Jenkins、GitLab CI等工具,配置多语言的构建任务。
- 容器化部署: 通过Docker容器化不同语言栈的服务,简化跨语言服务的部署与运行。
结语:
基于JWT的跨语言开发在分布式业务系统中为团队提供了强大的认证和授权支持。虽然跨语言协作在技术上具有一定挑战性,但通过合理的设计、安全措施、性能优化和团队协作,可以克服这些挑战,实现高效、安全的分布式系统。随着技术的不断发展,跨语言开发和JWT技术的结合将越来越成为现代大规模分布式系统架构中不可或缺的一部分。
相关文章:
基于JWT跨语言开发分布式业务系统的挑战与实践:多语言协作的最佳方案
在现代分布式架构下,开发团队往往由来自不同技术栈和开发语言的工程师组成。如何有效地管理这些开发人员的协作,尤其是在实现跨语言的认证与授权机制时,成为了开发者面临的一个重大挑战。JSON Web Token(JWT)作为一种轻…...
Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?
旧版源代码地址:https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 旧版效果展示: 新版加上MeshCollider后的效果: 注意:在Unity中,当你动态地更改物体的Mesh时,通常期望…...
数组能排成的最小数
题目描述 输入一个正整数数组,把数组里所有整数拼接起来排成一个数,打印出能拼接出的所有数字中最小的一个。 例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字为321323 分析 3和32哪个数字排前面呢&…...
RNN模型介绍
RNN模型介绍 1.RNN模型介绍1.1什么是RNN模型1.2RNN模型作用1.3RNN模型分类 2.传统RNN模型2.1RNN结构图2.2RNN优缺点 3.LSTM模型3.1什么是LSTM模型3.2LSTM内部结构图3.3使用Pytorch构建LSTM模型3.4LSTM优缺点 4.GRU模型4.1什么是GRU模型4.2GRU内部图4.3使用Pytorch构建GRU模型4.…...
Maven最佳实践
Maven 是一种广泛使用的 Java 项目构建自动化工具。它简化了构建过程并帮助管理依赖关系,使开发人员的工作更轻松。Maven 详细介绍可以参考我写的这篇 Maven 核心概念总结 。 这篇文章不会涉及到 Maven 概念的介绍,主要讨论一些最佳实践、建议和技巧&am…...
Redis的高可用之哨兵模式
Redis哨兵主要是解决Redis主从同步时主数据库宕机问题,使其能够自动进行故障恢复,提高Redis系统的高可用性。 1. 哨兵的作用: 监控:哨兵通过心跳机制监控主库和从库的存活性。 选主:当主库宕机时,哨兵会选举出一个领…...
C# 设计模式--观察者模式 (Observer Pattern)
定义 观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式的核心在于解耦主题(被观察者)和观察者之间的依赖关系。 …...
如何使用Java编写Jmeter函数
Jmeter 自带有各种功能丰富的函数,可以帮助我们进行测试,但有时候提供的这些函数并不能满足我们的要求,这时候就需要我们自己来编写一个自定义的函数了。例如我们在测试时,有时候需要填入当前的时间,虽然我们可以使用p…...
Hive 窗口函数与分析函数深度解析:开启大数据分析的新维度
Hive 窗口函数与分析函数深度解析:开启大数据分析的新维度 在当今大数据蓬勃发展的时代,Hive 作为一款强大的数据仓库工具,其窗口函数和分析函数犹如一把把精巧的手术刀,助力数据分析师们精准地剖析海量数据,挖掘出深…...
Echart折线图属性设置 vue2
Echart折线图 官方配置项手册 Documentation - Apache ECharts 下面代码包含:设置标题、线条样式、图例圆圈的样式、显示名称格式、图片保存、增加Y轴目标值 updateChart(data) {const sortedData data.slice().sort((a, b) > new Date(a.deviceTime) - ne…...
蓝桥杯2117砍竹子(简单易懂 包看包会版)
问题描述 这天, 小明在砍竹子, 他面前有 n 棵竹子排成一排, 一开始第 i 棵竹子的 高度为 hi. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为 H, 那么 用一次魔法可以 把这一段竹子的高度都变为 ⌊H2⌋…...
华为 生产网解决方案,加速制造业数字化转型
华为推出新一代融合架构的生产网解决方案,加速制造业数字化转型-企业频道-东方网 智慧生产网解决方案-华为企业业务 华为面向制造行业升级生产网解决方案。全新一代融合架构,解决了生产数据的孤岛化、烟囱式、数据的价值无法发挥等问题,以促…...
原型模式(Prototype Pattern)——对象克隆、深克隆与浅克隆及适用场景
原型模式(Prototype Pattern)是设计模式中的一种创建型模式,目的是通过复制现有的对象来创建新的对象,而不是通过传统的实例化方式。原型模式常常用于需要创建大量类似对象的场景,可以提高性能并减少资源的消耗。下面将…...
基于Transformer架构的扩散模型
Scalable Diffusion Models with Transformers 本文介绍一篇发表于2023年国际计算机视觉大会(ICCV)的研究论文,该论文提出了一种基于Transformer架构的扩散模型,称为Diffusion Transformers (DiTs)。 通过用Transformer替代传统的…...
服务器上部署前端页面-实现IP+端口/index.html在线访问你的网页
首先一点,不管是那个框架开发的网页前端,最后都需要Build,构建完毕以后都是原始的HTML CSS JS 三样文件! 所以不管用原始的三剑客(HTML CSS JS)开发的前端还是用各类框架开发的前端界面(只是让开发简单…...
2024年华中杯数学建模B题使用行车轨迹估计交通信号灯周期问题解题全过程文档及程序
2024年华中杯数学建模 B题 使用行车轨迹估计交通信号灯周期问题 原题再现 某电子地图服务商希望获取城市路网中所有交通信号灯的红绿周期,以便为司机提供更好的导航服务。由于许多信号灯未接入网络,无法直接从交通管理部门获取所有信号灯的数据&#x…...
【C语言】SWP 文件:临时缓存文件
SWP 文件:临时缓存文件(紧急保护机制) 在 Linux 系统(包括 Ubuntu)中,SWP 文件是一种临时缓存文件,主要用于在编辑器(如 Vim)中紧急保护未保存的工作内容。当系统或编辑…...
【日常记录-Git】git switch
1. 简介 git switch是Git 2.23.0版本引入的一个新命令,用于切换分支和恢复工作树文件。其旨在提供一个更清晰、更直观的分支切换体验,以替代git checkout命令中用于分支切换的部分功能。 2. 常规操作 2.1 切换到已存在的分支 git switch <分支名>…...
Qt学习笔记第51到60讲
第51讲 记事本实现打开功能 回到第24个功能文件Notepad,给UI中的各个控件添加槽函数。 ①开始按钮 void Widget::on_btnOpen_clicked() {QString fileNameQFileDialog::getOpenFileName(this,tr("Open File"),"E:\\6_Qt Projects\\24_Notepad\\fi…...
灵途科技亮相2024世界传感器大会 分享光纤光源技术突破
12月1日至2日,2024世界传感器大会(WSS)在郑州国际会展中心隆重举办,泛自动驾驶领域光电感知专家灵途科技受邀参加“光纤传感器与激光雷达”分论坛,并在大会上带来《激光雷达用一体化光纤光源》专题演讲,同与…...
LeetCode刷题 -- 分治快排
目录 颜色分类题目解析算法原理代码 排序数组题目解析算法原理代码 数组中第K个最大元素题目解析算法原理代码 LCR 159. 库存管理 III题目解析算法原理代码 颜色分类 题目链接 题目解析 数组分为三块 算法原理 1.如果nums[i] 0,left, i下标对应元素交换,…...
pyqtgraph绘制实时更新数据的图
PyQtGraph是一个基于PyQt和NumPy的Python库,它专为实时数据可视化而设计。以绘制0~2π范围的ysin(x)为例,基本用法的代码如下: # codingutf-8import pyqtgraph as pg from pyqtgraph.Qt import QtGui, QtCore import numpy as np# pyqtgraph…...
使用 MATLAB 绘制三维散点图:根据坐标和距离映射点的颜色和大小
在数据可视化中,三维散点图是一种非常直观的方式来展示数据的分布。MATLAB 提供了强大的 scatter3 函数,可以用来绘制三维散点图,而通过调整点的颜色和大小,可以进一步增强图形的表现力。 在本篇博客中,我们将逐步讲解…...
ubuntu离线安装docker
首先下载对应的版本amd64 就是x86的 https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/需要挑选其他版本 https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/下载之后上传到服务器目录,分别执行以下文件 sudo dpkg -…...
iOS如何操作更新推送证书
最近收到一份邮件,应该如何操作呢,证书还是跟以前一样冲钥匙串直接申请吗 Hello, As we announced in October, the Certification Authority (CA) for Apple Push Notification service (APNs) is changing. APNs will update the server certificates in sandbox on January…...
# issue 8 TCP内部原理和UDP编程
TCP 通信三大步骤: 1 三次握手建立连接; 2 开始通信,进行数据交换; 3 四次挥手断开连接; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好,套接字B。我这儿有数据要传给你,建立连接吧。" 【第二次…...
【Linux】-学习笔记08
第五章、DNS域名解析服务器 目录 第五章、DNS域名解析服务器 1.简介 1.1DNS简介 1.2因特网的域名结构 1.3域名服务器的类型划分 1.4DNS域名解析的过程 递归查询(左侧) 迭代查询(右侧) 2.DNS服务器配置 2.1关于服务端 …...
RFdiffusion Denoise类解读
Denoise 类为蛋白质结构扩散模型的实现提供了核心功能,通过灵活的噪声调度、潜力场引导和子结构对齐,使得模型可以生成物理合理的结构序列,并在每个时间步迭代更新蛋白质的坐标和结构信息。 源代码: def get_next_frames(xt, px0, t, diffuser, so3_type, diffusion_mask,…...
HTML5 拖拽 API 深度解析
一、HTML5 拖拽 API 深度解析 1.1 背景与发展 HTML5 的拖拽 API 是为了解决传统拖拽操作复杂而设计的。传统方法依赖鼠标事件和复杂的逻辑计算,而 HTML5 提供了标准化的拖拽事件和数据传递机制,使得开发者能够快速实现从一个元素拖拽到另一个元素的交互…...
Vue 的生命周期钩子函数是什么?常见的生命周期钩子有哪些?
Vue 的生命周期钩子函数 Vue 的生命周期钩子函数是 Vue 组件在不同生命周期阶段自动调用的函数。生命周期分为创建、挂载、更新和销毁等阶段。理解这些钩子函数对于开发和调试 Vue 应用至关重要,因为它们使我们能够在组件生命周期的不同阶段执行特定的操作。 目录…...
uniapp中导入uview或者uview plus
关于SCSS uview-plus依赖SCSS,您必须要安装此插件,否则无法正常运行。 如果您的项目是由HBuilder X创建的,相信已经安装scss插件,如果没有,请在HX菜单的 工具->插件安装中找到"scss/sass编译"插件进行安…...
3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移
3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文 “StyleGaussian: Instant 3D Style Transfer with Gaussian Splatting” 介绍了一种新颖的3D风格迁移方法 StyleGaussian,该方法通…...
【adb】iqoo系统精简垃圾内置应用
免责声明 这个得谨慎点,虽然我验证过两部手机和不同版本的系统,但是总会有特殊的存在、 本教程来自于互联网搜集整理, 按照本教程造成的用户设备硬件或数据损失,本人概不承担任何责任,如您不同意此协议,请不…...
Golang 字符串字面量表示方法
文章目录 1.普通字符串字面量(Double-Quoted String Literals)2.原始字符串字面量(Raw String Literals)3.字节字符串字面量(Byte Slice Literals)4.码值表示字符串字面量Unicode 转义序列UTF8 转义序列十六…...
【uni-app 微信小程序】新版本发布提示用户进行更新
知识准备 uni.getUpdateManager文档介绍 不支持APP与H5,所以在使用的时候要做好平台类型的判断,如何判断,参考条件编译处理多端差异 代码参考 export const updateApp () > {const updateManager uni.getUpdateManager()updateManag…...
Leetcode 739-每日温度
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。 题解(单调递减栈) 什么时候用单调栈呢? 通常是一维数组,要寻找任…...
Gitee配置以及如何将本地项目提交到远程仓库
文章目录 准备远程仓库配置注册新建仓库 配置git 生成ssh,输入以下命令,然后连敲三次回车键配置公钥本地代码上传 准备 1.本地下载git 2.注册远程仓库账号 远程仓库配置 注册 官网:https://gitee.com 完成注册 新建仓库 头像->设置-…...
爬虫项目基础知识详解
文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…...
【Leetcode Top 100 - 扩展】876. 链表的中间结点
问题背景 给你单链表的头结点 h e a d head head,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 数据约束 链表的结点数范围是 [ 1 , 100 ] [1, 100] [1,100] 1 ≤ N o d e . v a l ≤ 100 1 \le Node.val \le 100 1≤…...
16-01、JVM系列之:内存与垃圾回收篇(一)
JVM系列之:内存与垃圾回收篇(一) ##本篇内容概述: 1、JVM结构 2、类加载子系统 3、运行时数据区之:PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系,它只是与特…...
经典蓝牙(BT/EDR)蓝牙配对与连接
经典蓝牙的连接过程包括跳频,扫描,配置交换等过程。对ACL链路以及sco的连接过程也做详细的分析。 1. 为什么不配对便无法建立连接? 任何无线通信技术都存在被监听和破解的可能,蓝牙SIG为了保证蓝牙通信的安全性,采用…...
用 Python 从零开始创建神经网络(十四):L1 和 L2 正则化(L1 and L2 Regularization)
L1 和 L2 正则化(L1 and L2 Regularization) 引言1. Forward Pass2. Backward pass到此为止的全部代码: 引言 正则化方法旨在降低泛化误差。我们首先讨论的正则化形式是L1正则化和L2正则化。L1和L2正则化用于计算一个数值(称为惩…...
特殊的数学性质
一个数模9的结果等于它的每一位数相加和模9...
最长递增子序列&什么是继承性?C++中如何实现继承?继承的好处和注意事项有哪些?
最长递增子序列 方法一:暴力二维dp,初始状态:每个元素至少和自己构成一个上升序列,大小为1,状态转移:找到前面结尾数字小于当前数组元素的最长序列,当前位置的长度就是lenpre1. class Solutio…...
汽车IVI中控开发入门及进阶(三十五):架构QML App Architecture Best Practices
在Qt/QML工程的架构中,架构很重要,虽然本身它有分层,比如QML调用资源文件(图片等)显示GUI界面,后面的CPP文件实现界面逻辑,但是这个分类还有点粗。在实际开发中,界面逻辑也就是基于类cpp的实现,也开始使用各种面向对象的设计模式,实现更加优秀的开发架构,这点尤其在…...
面试题整理(二)
芯冰乐知识星球入口:芯冰乐...
编码及其代码
编码 形成文字所需bit点------有相应代号(编码---有好多种8/16/24/32)都已提前形成好,放哪哪就会形成那个文字 同一个文字在不同编码存的码不一样 用一种编码存的话,如果用另一种编码解析就会出现乱码 Windows默认编码为ANSI …...
python selenium(4+)+chromedriver最新版 定位爬取嵌套shadow-root(open)中内容
废话不多说,直接开始 本文以无界作为本文测试案例,抓取shadow-root(open)下的内容 shadow Dom in selenium: 首先先讲一下shadow Dom in selenium 版本的区别,链接指向这里 在Selenium 4版本 以及 chrom…...
AutoClass加载预训练实例
AutoClass 由于 Transformer 架构种类繁多,AtuoClass可以创建一个你想要的做模型架构。作为 🤗 Transformer 核心理念的一部分,使库易于使用、简单且灵活,可以AutoClass从给定的检查点自动推断和加载正确的架构。该from_pretrain…...
在 CentOS 上安装 NFS 服务器
文章目录 1. 在 CentOS 上安装 NFS 服务器1.1 安装 NFS 服务器软件包1.2 配置 NFS 共享目录1.3 配置 NFS 导出文件1.4 启动并启用 NFS 服务1.5 导出共享目录1.6 配置防火墙1.7 检查 NFS 状态 2. 在 CentOS 上安装 NFS 客户端2.1 安装 NFS 客户端软件包2.2 挂载 NFS 共享2.3 配置…...