<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"><channel><title>青青职场加油站</title><link>https://jzy.cc</link><atom:link href="https://jzy.cc/rss.xml" rel="self" type="application/rss+xml"/><description>八千里路云和月</description><generator>Halo v2.26.0</generator><language>zh-cn</language><image><url>https://jzy.cc/upload/22.png</url><title>青青职场加油站</title><link>https://jzy.cc</link></image><lastBuildDate>Wed, 16 Sep 2026 18:55:25 GMT</lastBuildDate><item><title><![CDATA[《中华人民共和国网络安全法》（2025）全文]]></title><link>https://jzy.cc/archives/YA5AwrTv</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E3%80%8A%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E6%B3%95%E3%80%8B%EF%BC%882025%EF%BC%89%E5%85%A8%E6%96%87&amp;url=/archives/YA5AwrTv" width="1" height="1" alt="" style="opacity:0;">
<h1 style="" id="%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E4%B8%BB%E5%B8%AD%E4%BB%A4"><span><strong>中华人民共和国主席令</strong></span></h1>
<h2 style="" id="%E7%AC%AC%E5%85%AD%E5%8D%81%E4%B8%80%E5%8F%B7"><span><strong>第六十一号</strong></span></h2>
<p style="line-height: inherit"><span>《全国人民代表大会常务委员会关于修改〈中华人民共和国网络安全法〉的决定》已由中华人民共和国第十四届全国人民代表大会常务委员会第十八次会议于2025年10月28日通过，现予公布，自2026年1月1日起施行。</span></p>
<p style="line-height: inherit"><span>中华人民共和国主席　习近平</span></p>
<p style="line-height: inherit"><span>2025年10月28日</span></p>
<h1 style="" id="%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E6%B3%95"><span><strong>中华人民共和国网络安全法</strong></span></h1>
<p style="line-height: inherit"><span>（2016年11月7日第十二届全国人民代表大会常务委员会第二十四次会议通过；根据2025年10月28日第十四届全国人民代表大会常务委员会第十八次会议《关于修改&lt;中华人民共和国网络安全法&gt;的决定》修正）</span></p>
<p style="line-height: inherit"></p>
<h1 style="" id="%E7%9B%AE-%E5%BD%95"><span><strong>目 录</strong></span></h1>
<h2 style="" id="%E7%AC%AC%E4%B8%80%E7%AB%A0-%E6%80%BB-%E5%88%99"><span><strong>第一章 总 则</strong></span></h2>
<h2 style="" id="%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E6%94%AF%E6%8C%81%E4%B8%8E%E4%BF%83%E8%BF%9B"><span><strong>第二章 网络安全支持与促进</strong></span></h2>
<h2 style="" id="%E7%AC%AC%E4%B8%89%E7%AB%A0-%E7%BD%91%E7%BB%9C%E8%BF%90%E8%A1%8C%E5%AE%89%E5%85%A8"><span><strong>第三章 网络运行安全</strong></span></h2>
<h3 style="" id="%E7%AC%AC%E4%B8%80%E8%8A%82-%E4%B8%80%E8%88%AC%E8%A7%84%E5%AE%9A"><span><strong>第一节 一般规定</strong></span></h3>
<h3 style="" id="%E7%AC%AC%E4%BA%8C%E8%8A%82-%E5%85%B3%E9%94%AE%E4%BF%A1%E6%81%AF%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%9A%84%E8%BF%90%E8%A1%8C%E5%AE%89%E5%85%A8"><span><strong>第二节 关键信息基础设施的运行安全</strong></span></h3>
<h2 style="" id="%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8"><span><strong>第四章 网络信息安全</strong></span></h2>
<h2 style="" id="%E7%AC%AC%E4%BA%94%E7%AB%A0-%E7%9B%91%E6%B5%8B%E9%A2%84%E8%AD%A6%E4%B8%8E%E5%BA%94%E6%80%A5%E5%A4%84%E7%BD%AE"><span><strong>第五章 监测预警与应急处置</strong></span></h2>
<h2 style="" id="%E7%AC%AC%E5%85%AD%E7%AB%A0-%E6%B3%95%E5%BE%8B%E8%B4%A3%E4%BB%BB"><span><strong>第六章 法律责任</strong></span></h2>
<h2 style="" id="%E7%AC%AC%E4%B8%83%E7%AB%A0-%E9%99%84-%E5%88%99"><span><strong>第七章 附 则</strong></span></h2>
<h2 style="" id="%E7%AC%AC%E4%B8%80%E7%AB%A0-%E6%80%BB-%E5%88%99-1"><span><strong>第一章 总 则</strong></span></h2>
<p style="line-height: inherit"><span>第一条 为了保障网络安全，维护网络空间主权和国家安全、社会公共利益，保护公民、法人和其他组织的合法权益，促进经济社会信息化健康发展，制定本法。</span></p>
<p style="line-height: inherit"><span>第二条 在中华人民共和国境内建设、运营、维护和使用网络，以及网络安全的监督管理，适用本法。</span></p>
<p style="line-height: inherit"><span>第三条 网络安全工作坚持中国共产党的领导，贯彻总体国家安全观，统筹发展和安全，推进网络强国建设。</span></p>
<p style="line-height: inherit"><span>第四条 国家坚持网络安全与信息化发展并重，遵循积极利用、科学发展、依法管理、确保安全的方针，推进网络基础设施建设和互联互通，鼓励网络技术创新和应用，支持培养网络安全人才，建立健全网络安全保障体系，提高网络安全保护能力。</span></p>
<p style="line-height: inherit"><span>第五条 国家制定并不断完善网络安全战略，明确保障网络安全的基本要求和主要目标，提出重点领域的网络安全政策、工作任务和措施。</span></p>
<p style="line-height: inherit"><span>第六条 国家采取措施，监测、防御、处置来源于中华人民共和国境内外的网络安全风险和威胁，保护关键信息基础设施免受攻击、侵入、干扰和破坏，依法惩治网络违法犯罪活动，维护网络空间安全和秩序。</span></p>
<p style="line-height: inherit"><span>第七条 国家倡导诚实守信、健康文明的网络行为，推动传播社会主义核心价值观，采取措施提高全社会的网络安全意识和水平，形成全社会共同参与促进网络安全的良好环境。</span></p>
<p style="line-height: inherit"><span>第八条 国家积极开展网络空间治理、网络技术研发和标准制定、打击网络违法犯罪等方面的国际交流与合作，推动构建和平、安全、开放、合作的网络空间，建立多边、民主、透明的网络治理体系。</span></p>
<p style="line-height: inherit"><span>第九条 国家网信部门负责统筹协调网络安全工作和相关监督管理工作。国务院电信主管部门、公安部门和其他有关机关依照本法和有关法律、行政法规的规定，在各自职责范围内负责网络安全保护和监督管理工作。</span></p>
<p style="line-height: inherit"><span>县级以上地方人民政府有关部门的网络安全保护和监督管理职责，按照国家有关规定确定。</span></p>
<p style="line-height: inherit"><span>第十条 网络运营者开展经营和服务活动，必须遵守法律、行政法规，尊重社会公德，遵守商业道德，诚实信用，履行网络安全保护义务，接受政府和社会的监督，承担社会责任。</span></p>
<p style="line-height: inherit"><span>第十一条 建设、运营网络或者通过网络提供服务，应当依照法律、行政法规的规定和国家标准的强制性要求，采取技术措施和其他必要措施，保障网络安全、稳定运行，有效应对网络安全事件，防范网络违法犯罪活动，维护网络数据的完整性、保密性和可用性。</span></p>
<p style="line-height: inherit"><span>第十二条 网络相关行业组织按照章程，加强行业自律，制定网络安全行为规范，指导会员加强网络安全保护，提高网络安全保护水平，促进行业健康发展。</span></p>
<p style="line-height: inherit"><span>第十三条 国家保护公民、法人和其他组织依法使用网络的权利，促进网络接入普及，提升网络服务水平，为社会提供安全、便利的网络服务，保障网络信息依法有序自由流动。</span></p>
<p style="line-height: inherit"><span>任何个人和组织使用网络应当遵守宪法法律，遵守公共秩序，尊重社会公德，不得危害网络安全，不得利用网络从事危害国家安全、荣誉和利益，煽动颠覆国家政权、推翻社会主义制度，煽动分裂国家、破坏国家统一，宣扬恐怖主义、极端主义，宣扬民族仇恨、民族歧视，传播暴力、淫秽色情信息，编造、传播虚假信息扰乱经济秩序和社会秩序，以及侵害他人名誉、隐私、知识产权和其他合法权益等活动。</span></p>
<p style="line-height: inherit"><span>第十四条 国家支持研究开发有利于未成年人健康成长的网络产品和服务，依法惩治利用网络从事危害未成年人身心健康的活动，为未成年人提供安全、健康的网络环境。</span></p>
<p style="line-height: inherit"><span>第十五条 任何个人和组织有权对危害网络安全的行为向网信、电信、公安等部门举报。收到举报的部门应当及时依法作出处理；不属于本部门职责的，应当及时移送有权处理的部门。</span></p>
<p style="line-height: inherit"><span>有关部门应当对举报人的相关信息予以保密，保护举报人的合法权益。</span></p>
<h2 style="" id="%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E6%94%AF%E6%8C%81%E4%B8%8E%E4%BF%83%E8%BF%9B-1"><span><strong>第二章 网络安全支持与促进</strong></span></h2>
<p style="line-height: inherit"><span>第十六条 国家建立和完善网络安全标准体系。国务院标准化行政主管部门和国务院其他有关部门根据各自的职责，组织制定并适时修订有关网络安全管理以及网络产品、服务和运行安全的国家标准、行业标准。</span></p>
<p style="line-height: inherit"><span>国家支持企业、研究机构、高等学校、网络相关行业组织参与网络安全国家标准、行业标准的制定。</span></p>
<p style="line-height: inherit"><span>第十七条 国务院和省、自治区、直辖市人民政府应当统筹规划，加大投入，扶持重点网络安全技术产业和项目，支持网络安全技术的研究开发和应用，推广安全可信的网络产品和服务，保护网络技术知识产权，支持企业、研究机构和高等学校等参与国家网络安全技术创新项目。</span></p>
<p style="line-height: inherit"><span>第十八条 国家推进网络安全社会化服务体系建设，鼓励有关企业、机构开展网络安全认证、检测和风险评估等安全服务。</span></p>
<p style="line-height: inherit"><span>第十九条 国家鼓励开发网络数据安全保护和利用技术，促进公共数据资源开放，推动技术创新和经济社会发展。</span></p>
<p style="line-height: inherit"><span>第二十条 国家支持人工智能基础理论研究和算法等关键技术研发，推进训练数据资源、算力等基础设施建设，完善人工智能伦理规范，加强风险监测评估和安全监管，促进人工智能应用和健康发展。</span></p>
<p style="line-height: inherit"><span>国家支持创新网络安全管理方式，运用人工智能等新技术，提升网络安全保护水平。</span></p>
<p style="line-height: inherit"><span>第二十一条 各级人民政府及其有关部门应当组织开展经常性的网络安全宣传教育，并指导、督促有关单位做好网络安全宣传教育工作。</span></p>
<p style="line-height: inherit"><span>大众传播媒介应当有针对性地面向社会进行网络安全宣传教育。</span></p>
<p style="line-height: inherit"><span>第二十二条 国家支持企业和高等学校、职业学校等教育培训机构开展网络安全相关教育与培训，采取多种方式培养网络安全人才，促进网络安全人才交流。</span></p>
<h2 style="" id="%E7%AC%AC%E4%B8%89%E7%AB%A0-%E7%BD%91%E7%BB%9C%E8%BF%90%E8%A1%8C%E5%AE%89%E5%85%A8-1"><span><strong>第三章 网络运行安全</strong></span></h2>
<h3 style="" id="%E7%AC%AC%E4%B8%80%E8%8A%82-%E4%B8%80%E8%88%AC%E8%A7%84%E5%AE%9A-1"><span><strong>第一节 一般规定</strong></span></h3>
<p style="line-height: inherit"><span>第二十三条 国家实行网络安全等级保护制度。网络运营者应当按照网络安全等级保护制度的要求，履行下列安全保护义务，保障网络免受干扰、破坏或者未经授权的访问，防止网络数据泄露或者被窃取、篡改：</span></p>
<p style="line-height: inherit"><span>（一）制定内部安全管理制度和操作规程，确定网络安全负责人，落实网络安全保护责任；</span></p>
<p style="line-height: inherit"><span>（二）采取防范计算机病毒和网络攻击、网络侵入等危害网络安全行为的技术措施；</span></p>
<p style="line-height: inherit"><span>（三）采取监测、记录网络运行状态、网络安全事件的技术措施，并按照规定留存相关的网络日志不少于六个月；</span></p>
<p style="line-height: inherit"><span>（四）采取数据分类、重要数据备份和加密等措施；</span></p>
<p style="line-height: inherit"><span>（五）法律、行政法规规定的其他义务。</span></p>
<p style="line-height: inherit"><span>第二十四条 网络产品、服务应当符合相关国家标准的强制性要求。网络产品、服务的提供者不得设置恶意程序；发现其网络产品、服务存在安全缺陷、漏洞等风险时，应当立即采取补救措施，按照规定及时告知用户并向有关主管部门报告。</span></p>
<p style="line-height: inherit"><span>网络产品、服务的提供者应当为其产品、服务持续提供安全维护；在规定或者当事人约定的期限内，不得终止提供安全维护。</span></p>
<p style="line-height: inherit"><span>网络产品、服务具有收集用户信息功能的，其提供者应当向用户明示并取得同意；涉及用户个人信息的，还应当遵守本法和有关法律、行政法规关于个人信息保护的规定。</span></p>
<p style="line-height: inherit"><span>第二十五条 网络关键设备和网络安全专用产品应当按照相关国家标准的强制性要求，由具备资格的机构安全认证合格或者安全检测符合要求后，方可销售或者提供。国家网信部门会同国务院有关部门制定、公布网络关键设备和网络安全专用产品目录，并推动安全认证和安全检测结果互认，避免重复认证、检测。</span></p>
<p style="line-height: inherit"><span>第二十六条 网络运营者为用户办理网络接入、域名注册服务，办理固定电话、移动电话等入网手续，或者为用户提供信息发布、即时通讯等服务，在与用户签订协议或者确认提供服务时，应当要求用户提供真实身份信息。用户不提供真实身份信息的，网络运营者不得为其提供相关服务。</span></p>
<p style="line-height: inherit"><span>国家实施网络可信身份战略，支持研究开发安全、方便的电子身份认证技术，推动不同电子身份认证之间的互认。</span></p>
<p style="line-height: inherit"><span>第二十七条 网络运营者应当制定网络安全事件应急预案，及时处置系统漏洞、计算机病毒、网络攻击、网络侵入等安全风险；在发生危害网络安全的事件时，立即启动应急预案，采取相应的补救措施，并按照规定向有关主管部门报告。</span></p>
<p style="line-height: inherit"><span>第二十八条 开展网络安全认证、检测、风险评估等活动，向社会发布系统漏洞、计算机病毒、网络攻击、网络侵入等网络安全信息，应当遵守国家有关规定。</span></p>
<p style="line-height: inherit"><span>第二十九条 任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动；不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具；明知他人从事危害网络安全的活动的，不得为其提供技术支持、广告推广、支付结算等帮助。</span></p>
<p style="line-height: inherit"><span>第三十条 网络运营者应当为公安机关、国家安全机关依法维护国家安全和侦查犯罪的活动提供技术支持和协助。</span></p>
<p style="line-height: inherit"><span>第三十一条 国家支持网络运营者之间在网络安全信息收集、分析、通报和应急处置等方面进行合作，提高网络运营者的安全保障能力。</span></p>
<p style="line-height: inherit"><span>有关行业组织建立健全本行业的网络安全保护规范和协作机制，加强对网络安全风险的分析评估，定期向会员进行风险警示，支持、协助会员应对网络安全风险。</span></p>
<p style="line-height: inherit"><span> 第三十二条 网信部门和有关部门在履行网络安全保护职责中获取的信息，只能用于维护网络安全的需要，不得用于其他用途。</span></p>
<h3 style="" id="%E7%AC%AC%E4%BA%8C%E8%8A%82-%E5%85%B3%E9%94%AE%E4%BF%A1%E6%81%AF%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%9A%84%E8%BF%90%E8%A1%8C%E5%AE%89%E5%85%A8-1"><span><strong>第二节 关键信息基础设施的运行安全</strong></span></h3>
<p style="line-height: inherit"><span>第三十三条 国家对公共通信和信息服务、能源、交通、水利、金融、公共服务、电子政务等重要行业和领域，以及其他一旦遭到破坏、丧失功能或者数据泄露，可能严重危害国家安全、国计民生、公共利益的关键信息基础设施，在网络安全等级保护制度的基础上，实行重点保护。关键信息基础设施的具体范围和安全保护办法由国务院制定。</span></p>
<p style="line-height: inherit"><span>国家鼓励关键信息基础设施以外的网络运营者自愿参与关键信息基础设施保护体系。</span></p>
<p style="line-height: inherit"><span>第三十四条 按照国务院规定的职责分工，负责关键信息基础设施安全保护工作的部门分别编制并组织实施本行业、本领域的关键信息基础设施安全规划，指导和监督关键信息基础设施运行安全保护工作。</span></p>
<p style="line-height: inherit"><span>第三十五条 建设关键信息基础设施应当确保其具有支持业务稳定、持续运行的性能，并保证安全技术措施同步规划、同步建设、同步使用。</span></p>
<p style="line-height: inherit"><span>第三十六条 除本法第二十三条的规定外，关键信息基础设施的运营者还应当履行下列安全保护义务：</span></p>
<p style="line-height: inherit"><span>（一）设置专门安全管理机构和安全管理负责人，并对该负责人和关键岗位的人员进行安全背景审查；</span></p>
<p style="line-height: inherit"><span>（二）定期对从业人员进行网络安全教育、技术培训和技能考核；</span></p>
<p style="line-height: inherit"><span>（三）对重要系统和数据库进行容灾备份；</span></p>
<p style="line-height: inherit"><span>（四）制定网络安全事件应急预案，并定期进行演练；</span></p>
<p style="line-height: inherit"><span>（五）法律、行政法规规定的其他义务。</span></p>
<p style="line-height: inherit"><span>第三十七条 关键信息基础设施的运营者采购网络产品和服务，可能影响国家安全的，应当通过国家网信部门会同国务院有关部门组织的国家安全审查。</span></p>
<p style="line-height: inherit"><span>第三十八条 关键信息基础设施的运营者采购网络产品和服务，应当按照规定与提供者签订安全保密协议，明确安全和保密义务与责任。</span></p>
<p style="line-height: inherit"><span>第三十九条 关键信息基础设施的运营者在中华人民共和国境内运营中收集和产生的个人信息和重要数据应当在境内存储。因业务需要，确需向境外提供的，应当按照国家网信部门会同国务院有关部门制定的办法进行安全评估；法律、行政法规另有规定的，依照其规定。</span></p>
<p style="line-height: inherit"><span>第四十条 关键信息基础设施的运营者应当自行或者委托网络安全服务机构对其网络的安全性和可能存在的风险每年至少进行一次检测评估，并将检测评估情况和改进措施报送相关负责关键信息基础设施安全保护工作的部门。</span></p>
<p style="line-height: inherit"><span>第四十一条 国家网信部门应当统筹协调有关部门对关键信息基础设施的安全保护采取下列措施：</span></p>
<p style="line-height: inherit"><span>（一）对关键信息基础设施的安全风险进行抽查检测，提出改进措施，必要时可以委托网络安全服务机构对网络存在的安全风险进行检测评估；</span></p>
<p style="line-height: inherit"><span>（二）定期组织关键信息基础设施的运营者进行网络安全应急演练，提高应对网络安全事件的水平和协同配合能力；</span></p>
<p style="line-height: inherit"><span>（三）促进有关部门、关键信息基础设施的运营者以及有关研究机构、网络安全服务机构等之间的网络安全信息共享；</span></p>
<p style="line-height: inherit"><span>（四）对网络安全事件的应急处置与网络功能的恢复等，提供技术支持和协助。</span></p>
<h2 style="" id="%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E7%BD%91%E7%BB%9C%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8-1"><span><strong>第四章 网络信息安全</strong></span></h2>
<p style="line-height: inherit"><span>第四十二条 网络运营者应当对其收集的用户信息严格保密，并建立健全用户信息保护制度。</span></p>
<p style="line-height: inherit"><span>网络运营者处理个人信息，应当遵守本法和《中华人民共和国民法典》、《中华人民共和国个人信息保护法》等法律、行政法规的规定。</span></p>
<p style="line-height: inherit"><span>第四十三条 网络运营者收集、使用个人信息，应当遵循合法、正当、必要的原则，公开收集、使用规则，明示收集、使用信息的目的、方式和范围，并经被收集者同意。</span></p>
<p style="line-height: inherit"><span>网络运营者不得收集与其提供的服务无关的个人信息，不得违反法律、行政法规的规定和双方的约定收集、使用个人信息，并应当依照法律、行政法规的规定和与用户的约定，处理其保存的个人信息。</span></p>
<p style="line-height: inherit"><span>第四十四条 网络运营者不得泄露、篡改、毁损其收集的个人信息；未经被收集者同意，不得向他人提供个人信息。但是，经过处理无法识别特定个人且不能复原的除外。</span></p>
<p style="line-height: inherit"><span>网络运营者应当采取技术措施和其他必要措施，确保其收集的个人信息安全，防止信息泄露、毁损、丢失。在发生或者可能发生个人信息泄露、毁损、丢失的情况时，应当立即采取补救措施，按照规定及时告知用户并向有关主管部门报告。</span></p>
<p style="line-height: inherit"><span>第四十五条 个人发现网络运营者违反法律、行政法规的规定或者双方的约定收集、使用其个人信息的，有权要求网络运营者删除其个人信息；发现网络运营者收集、存储的其个人信息有错误的，有权要求网络运营者予以更正。网络运营者应当采取措施予以删除或者更正。</span></p>
<p style="line-height: inherit"><span>第四十六条 任何个人和组织不得窃取或者以其他非法方式获取个人信息，不得非法出售或者非法向他人提供个人信息。</span></p>
<p style="line-height: inherit"><span>第四十七条 依法负有网络安全监督管理职责的部门及其工作人员，必须对在履行职责中知悉的个人信息、隐私和商业秘密严格保密，不得泄露、出售或者非法向他人提供。</span></p>
<p style="line-height: inherit"><span>第四十八条 任何个人和组织应当对其使用网络的行为负责，不得设立用于实施诈骗，传授犯罪方法，制作或者销售违禁物品、管制物品等违法犯罪活动的网站、通讯群组，不得利用网络发布涉及实施诈骗，制作或者销售违禁物品、管制物品以及其他违法犯罪活动的信息。</span></p>
<p style="line-height: inherit"><span>第四十九条 网络运营者应当加强对其用户发布的信息的管理，发现法律、行政法规禁止发布或者传输的信息的，应当立即停止传输该信息，采取消除等处置措施，防止信息扩散，保存有关记录，并向有关主管部门报告。</span></p>
<p style="line-height: inherit"><span>第五十条 任何个人和组织发送的电子信息、提供的应用软件，不得设置恶意程序，不得含有法律、行政法规禁止发布或者传输的信息。</span></p>
<p style="line-height: inherit"><span>电子信息发送服务提供者和应用软件下载服务提供者，应当履行安全管理义务，知道其用户有前款规定行为的，应当停止提供服务，采取消除等处置措施，保存有关记录，并向有关主管部门报告。</span></p>
<p style="line-height: inherit"><span>第五十一条 网络运营者应当建立网络信息安全投诉、举报制度，公布投诉、举报方式等信息，及时受理并处理有关网络信息安全的投诉和举报。</span></p>
<p style="line-height: inherit"><span>网络运营者对网信部门和有关部门依法实施的监督检查，应当予以配合。</span></p>
<p style="line-height: inherit"><span>第五十二条 国家网信部门和有关部门依法履行网络信息安全监督管理职责，发现法律、行政法规禁止发布或者传输的信息的，应当要求网络运营者停止传输，采取消除等处置措施，保存有关记录；对来源于中华人民共和国境外的上述信息，应当通知有关机构采取技术措施和其他必要措施阻断传播。</span></p>
<h2 style="" id="%E7%AC%AC%E4%BA%94%E7%AB%A0-%E7%9B%91%E6%B5%8B%E9%A2%84%E8%AD%A6%E4%B8%8E%E5%BA%94%E6%80%A5%E5%A4%84%E7%BD%AE-1"><span><strong>第五章 监测预警与应急处置</strong></span></h2>
<p style="line-height: inherit"><span>第五十三条 国家建立网络安全监测预警和信息通报制度。国家网信部门应当统筹协调有关部门加强网络安全信息收集、分析和通报工作，按照规定统一发布网络安全监测预警信息。</span></p>
<p style="line-height: inherit"><span>第五十四条 负责关键信息基础设施安全保护工作的部门，应当建立健全本行业、本领域的网络安全监测预警和信息通报制度，并按照规定报送网络安全监测预警信息。</span></p>
<p style="line-height: inherit"><span>第五十五条 国家网信部门协调有关部门建立健全网络安全风险评估和应急工作机制，制定网络安全事件应急预案，并定期组织演练。</span></p>
<p style="line-height: inherit"><span>负责关键信息基础设施安全保护工作的部门应当制定本行业、本领域的网络安全事件应急预案，并定期组织演练。</span></p>
<p style="line-height: inherit"><span>网络安全事件应急预案应当按照事件发生后的危害程度、影响范围等因素对网络安全事件进行分级，并规定相应的应急处置措施。</span></p>
<p style="line-height: inherit"><span>第五十六条 网络安全事件发生的风险增大时，省级以上人民政府有关部门应当按照规定的权限和程序，并根据网络安全风险的特点和可能造成的危害，采取下列措施：</span></p>
<p style="line-height: inherit"><span>（一）要求有关部门、机构和人员及时收集、报告有关信息，加强对网络安全风险的监测；</span></p>
<p style="line-height: inherit"><span>（二）组织有关部门、机构和专业人员，对网络安全风险信息进行分析评估，预测事件发生的可能性、影响范围和危害程度；</span></p>
<p style="line-height: inherit"><span>（三）向社会发布网络安全风险预警，发布避免、减轻危害的措施。</span></p>
<p style="line-height: inherit"><span>第五十七条 发生网络安全事件，应当立即启动网络安全事件应急预案，对网络安全事件进行调查和评估，要求网络运营者采取技术措施和其他必要措施，消除安全隐患，防止危害扩大，并及时向社会发布与公众有关的警示信息。</span></p>
<p style="line-height: inherit"><span>第五十八条 省级以上人民政府有关部门在履行网络安全监督管理职责中，发现网络存在较大安全风险或者发生安全事件的，可以按照规定的权限和程序对该网络的运营者的法定代表人或者主要负责人进行约谈。网络运营者应当按照要求采取措施，进行整改，消除隐患。</span></p>
<p style="line-height: inherit"><span>第五十九条 因网络安全事件，发生突发事件或者生产安全事故的，应当依照《中华人民共和国突发事件应对法》、《中华人民共和国安全生产法》等有关法律、行政法规的规定处置。</span></p>
<p style="line-height: inherit"><span>第六十条 因维护国家安全和社会公共秩序，处置重大突发社会安全事件的需要，经国务院决定或者批准，可以在特定区域对网络通信采取限制等临时措施。</span></p>
<h2 style="" id="%E7%AC%AC%E5%85%AD%E7%AB%A0-%E6%B3%95%E5%BE%8B%E8%B4%A3%E4%BB%BB-1"><span><strong>第六章 法律责任</strong></span></h2>
<p style="line-height: inherit"><span>第六十一条 网络运营者不履行本法第二十三条、第二十七条规定的网络安全保护义务的，由有关主管部门责令改正，给予警告，可以处一万元以上五万元以下罚款；拒不改正或者导致危害网络安全等后果的，处五万元以上五十万元以下罚款，对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。</span></p>
<p style="line-height: inherit"><span>关键信息基础设施的运营者不履行本法第三十五条、第三十六条、第三十八条、第四十条规定的网络安全保护义务的，由有关主管部门责令改正，给予警告，可以处五万元以上十万元以下罚款；拒不改正或者导致危害网络安全等后果的，处十万元以上一百万元以下罚款，对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。</span></p>
<p style="line-height: inherit"><span> 有前两款行为，造成大量数据泄露、关键信息基础设施丧失局部功能等严重危害网络安全后果的，由有关主管部门处五十万元以上二百万元以下罚款，对直接负责的主管人员和其他直接责任人员处五万元以上二十万元以下罚款；造成关键信息基础设施丧失主要功能等特别严重危害网络安全后果的，处二百万元以上一千万元以下罚款，对直接负责的主管人员和其他直接责任人员处二十万元以上一百万元以下罚款。</span></p>
<p style="line-height: inherit"><span>第六十二条 违反本法第二十四条第一款、第二款和第五十条第一款规定，有下列行为之一的，由有关主管部门责令改正，给予警告；拒不改正或者导致危害网络安全等后果的，处五万元以上五十万元以下罚款，对直接负责的主管人员处一万元以上十万元以下罚款：</span></p>
<p style="line-height: inherit"><span>（一）设置恶意程序的；</span></p>
<p style="line-height: inherit"><span>（二）对其产品、服务存在的安全缺陷、漏洞等风险未立即采取补救措施，或者未按照规定及时告知用户并向有关主管部门报告的；</span></p>
<p style="line-height: inherit"><span>（三）擅自终止为其产品、服务提供安全维护的。</span></p>
<p style="line-height: inherit"><span>有前款第一项、第二项行为，造成本法第六十一条第三款规定的后果的，依照该款规定处罚。</span></p>
<p style="line-height: inherit"><span>第六十三条 违反本法第二十五条规定，销售或者提供未经安全认证、安全检测或者安全认证不合格、安全检测不符合要求的网络关键设备和网络安全专用产品的，由有关主管部门责令停止销售或者提供，给予警告，没收违法所得；没有违法所得或者违法所得不足十万元的，并处二万元以上十万元以下罚款；违法所得十万元以上的，并处违法所得一倍以上五倍以下罚款；情节严重的，并可以责令暂停相关业务、停业整顿、吊销相关业务许可证或者吊销营业执照。法律、行政法规另有规定的，依照其规定。</span></p>
<p style="line-height: inherit"><span>第六十四条 网络运营者违反本法第二十六条第一款规定，未要求用户提供真实身份信息，或者对不提供真实身份信息的用户提供相关服务的，由有关主管部门责令改正；拒不改正或者情节严重的，处五万元以上五十万元以下罚款，并可以责令暂停相关业务、停业整顿、关闭网站或者应用程序、吊销相关业务许可证或者吊销营业执照，对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。</span></p>
<p style="line-height: inherit"><span>第六十五条 违反本法第二十八条规定，开展网络安全认证、检测、风险评估等活动，或者向社会发布系统漏洞、计算机病毒、网络攻击、网络侵入等网络安全信息的，由有关主管部门责令改正，给予警告，可以处一万元以上十万元以下罚款；拒不改正或者情节严重的，处十万元以上一百万元以下罚款，并可以责令暂停相关业务、停业整顿、关闭网站或者应用程序、吊销相关业务许可证或者吊销营业执照，对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。</span></p>
<p style="line-height: inherit"><span>有前款行为，造成本法第六十一条第三款规定的后果的，依照该款规定处罚。</span></p>
<p style="line-height: inherit"><span>第六十六条 违反本法第二十九条规定，从事危害网络安全的活动，或者提供专门用于从事危害网络安全活动的程序、工具，或者为他人从事危害网络安全的活动提供技术支持、广告推广、支付结算等帮助，尚不构成犯罪的，由公安机关没收违法所得，处五日以下拘留，可以并处五万元以上五十万元以下罚款；情节较重的，处五日以上十五日以下拘留，可以并处十万元以上一百万元以下罚款。</span></p>
<p style="line-height: inherit"><span>单位有前款行为的，由公安机关没收违法所得，处十万元以上一百万元以下罚款，并对直接负责的主管人员和其他直接责任人员依照前款规定处罚。</span></p>
<p style="line-height: inherit"><span>违反本法第二十九条规定，受到治安管理处罚的人员，五年内不得从事网络安全管理和网络运营关键岗位的工作；受到刑事处罚的人员，终身不得从事网络安全管理和网络运营关键岗位的工作。</span></p>
<p style="line-height: inherit"><span>第六十七条 关键信息基础设施的运营者违反本法第三十七条规定，使用未经安全审查或者安全审查未通过的网络产品或者服务的，由有关主管部门责令限期改正、停止使用、消除对国家安全的影响，处采购金额一倍以上十倍以下罚款，对直接负责的主管人员和其他直接责任人员处一万元以上十万元以下罚款。</span></p>
<p style="line-height: inherit"><span>第六十八条 违反本法第四十八条规定，设立用于实施违法犯罪活动的网站、通讯群组，或者利用网络发布涉及实施违法犯罪活动的信息，尚不构成犯罪的，由公安机关处五日以下拘留，可以并处一万元以上十万元以下罚款；情节较重的，处五日以上十五日以下拘留，可以并处五万元以上五十万元以下罚款。关闭用于实施违法犯罪活动的网站、通讯群组。</span></p>
<p style="line-height: inherit"><span>单位有前款行为的，由公安机关处十万元以上五十万元以下罚款，并对直接负责的主管人员和其他直接责任人员依照前款规定处罚。</span></p>
<p style="line-height: inherit"><span>第六十九条 网络运营者违反本法第四十九条规定，对法律、行政法规禁止发布或者传输的信息未停止传输、采取消除等处置措施、保存有关记录、向有关主管部门报告，或者违反本法第五十二条规定，不按照有关部门的要求对法律、行政法规禁止发布或者传输的信息停止传输、采取消除等处置措施、保存有关记录的，由有关主管部门责令改正，给予警告、予以通报，可以处五万元以上五十万元以下罚款；拒不改正或者情节严重的，处五十万元以上二百万元以下罚款，并可以责令暂停相关业务、停业整顿、关闭网站或者应用程序、吊销相关业务许可证或者吊销营业执照，对直接负责的主管人员和其他直接责任人员处五万元以上二十万元以下罚款。</span></p>
<p style="line-height: inherit"><span>有前款行为，造成特别严重影响、特别严重后果的，由有关主管部门处二百万元以上一千万元以下罚款，责令暂停相关业务、停业整顿、关闭网站或者应用程序、吊销相关业务许可证或者吊销营业执照，对直接负责的主管人员和其他直接责任人员处二十万元以上一百万元以下罚款。</span></p>
<p style="line-height: inherit"><span>电子信息发送服务提供者、应用软件下载服务提供者，不履行本法第五十条第二款规定的安全管理义务的，依照前两款规定处罚。</span></p>
<p style="line-height: inherit"><span>第七十条 网络运营者违反本法规定，有下列行为之一的，由有关主管部门责令改正；拒不改正或者情节严重的，处五万元以上五十万元以下罚款，对直接负责的主管人员和其他直接责任人员，处一万元以上十万元以下罚款：</span></p>
<p style="line-height: inherit"><span>（一）拒绝、阻碍有关部门依法实施的监督检查的；</span></p>
<p style="line-height: inherit"><span>（二）拒不向公安机关、国家安全机关提供技术支持和协助的。</span></p>
<p style="line-height: inherit"><span>第七十一条 有下列行为之一的，依照有关法律、行政法规的规定处理、处罚：</span></p>
<p style="line-height: inherit"><span>（一）发布或者传输本法第十三条第二款和其他法律、行政法规禁止发布或者传输的信息的；</span></p>
<p style="line-height: inherit"><span>（二）违反本法第二十四条第三款、第四十三条至第四十五条规定，侵害个人信息权益的；</span></p>
<p style="line-height: inherit"><span>（三）违反本法第三十九条规定，关键信息基础设施的运营者在境外存储个人信息和重要数据，或者向境外提供个人信息和重要数据的。</span></p>
<p style="line-height: inherit"><span>违反本法第四十六条规定，窃取或者以其他非法方式获取、非法出售或者非法向他人提供个人信息，尚不构成犯罪的，由公安机关依照有关法律、行政法规的规定处罚。</span></p>
<p style="line-height: inherit"><span>第七十二条 有本法规定的违法行为的，依照有关法律、行政法规的规定记入信用档案，并予以公示。</span></p>
<p style="line-height: inherit"><span>第七十三条 违反本法规定，但具有《中华人民共和国行政处罚法》规定的从轻、减轻或者不予处罚情形的，依照其规定从轻、减轻或者不予处罚。</span></p>
<p style="line-height: inherit"><span>第七十四条 国家机关政务网络的运营者不履行本法规定的网络安全保护义务的，由其上级机关或者有关机关责令改正；对直接负责的主管人员和其他直接责任人员依法给予处分。</span></p>
<p style="line-height: inherit"><span>第七十五条 网信部门和有关部门违反本法第三十二条规定，将在履行网络安全保护职责中获取的信息用于其他用途的，对直接负责的主管人员和其他直接责任人员依法给予处分。</span></p>
<p style="line-height: inherit"><span>网信部门和有关部门的工作人员玩忽职守、滥用职权、徇私舞弊，尚不构成犯罪的，依法给予处分。</span></p>
<p style="line-height: inherit"><span>第七十六条 违反本法规定，给他人造成损害的，依法承担民事责任。</span></p>
<p style="line-height: inherit"><span>违反本法规定，构成违反治安管理行为的，依法给予治安管理处罚；构成犯罪的，依法追究刑事责任。</span></p>
<p style="line-height: inherit"><span>第七十七条 境外的机构、组织、个人从事危害中华人民共和国网络安全的活动的，依法追究法律责任；造成严重后果的，国务院公安部门和有关部门并可以决定对该机构、组织、个人采取冻结财产或者其他必要的制裁措施。</span></p>
<h2 style="" id="%E7%AC%AC%E4%B8%83%E7%AB%A0-%E9%99%84-%E5%88%99-1"><span><strong>第七章 附 则</strong></span></h2>
<p style="line-height: inherit"><span>第七十八条 本法下列用语的含义：</span></p>
<p style="line-height: inherit"><span>（一）网络，是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息进行收集、存储、传输、交换、处理的系统。</span></p>
<p style="line-height: inherit"><span>（二）网络安全，是指通过采取必要措施，防范对网络的攻击、侵入、干扰、破坏和非法使用以及意外事故，使网络处于稳定可靠运行的状态，以及保障网络数据的完整性、保密性、可用性的能力。</span></p>
<p style="line-height: inherit"><span>（三）网络运营者，是指网络的所有者、管理者和网络服务提供者。</span></p>
<p style="line-height: inherit"><span>（四）网络数据，是指通过网络收集、存储、传输、处理和产生的各种电子数据。</span></p>
<p style="line-height: inherit"><span>（五）个人信息，是指以电子或者其他方式记录的能够单独或者与其他信息结合识别自然人个人身份的各种信息，包括但不限于自然人的姓名、出生日期、身份证件号码、个人生物识别信息、住址、电话号码等。</span></p>
<p style="line-height: inherit"><span>第七十九条 存储、处理涉及国家秘密信息的网络的运行安全保护，除应当遵守本法外，还应当遵守保密法律、行政法规的规定。</span></p>
<p style="line-height: inherit"><span>第八十条 军事网络的安全保护，由中央军事委员会另行规定。</span></p>
<p style="line-height: inherit"><span>第八十一条 本法自2026年1月1日起施行。</span></p>]]></description><guid isPermaLink="false">/archives/YA5AwrTv</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fa-red-sign-hanging-from-the-side-of-a-building.jpg&amp;size=m" type="image/jpeg" length="57554"/><category>移动安全</category><pubDate>Tue, 27 Jan 2026 08:35:12 GMT</pubDate></item><item><title><![CDATA[苹果&谷歌的应用内购接入总结]]></title><link>https://jzy.cc/archives/bvCUOaxx</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E8%8B%B9%E6%9E%9C%26%E8%B0%B7%E6%AD%8C%E7%9A%84%E5%BA%94%E7%94%A8%E5%86%85%E8%B4%AD%E6%8E%A5%E5%85%A5%E6%80%BB%E7%BB%93&amp;url=/archives/bvCUOaxx" width="1" height="1" alt="" style="opacity:0;">
<p style="">国内安卓一般会接入支付宝或微信的 SDK 来拉起付费。苹果和海外安卓一样，大多数情况下虚拟物品和服务只能走系统的渠道， 也就是苹果的 App Store 和谷歌的 Google Play 来支付。两者都是和系统服务集成的，用户付款给苹果和谷歌， 再由其扣除税款后定期打到开发者的账户中。</p>
<p style="">本文简单总结接入时容易碰到的误区和阻碍，以供参考。</p>
<blockquote>
 <p style="">注：如果未指明是苹果或谷歌，则说明两者情况一致，均适用于说明。</p>
</blockquote>
<h2 style="" id="%E5%BC%80%E5%8F%91%E8%80%85%E8%B4%A6%E6%88%B7">开发者账户</h2>
<p style="">在注册开发者账户时需要通过身份验证，将账户类型区分为个人和组织。组织一般就是企业。</p>
<p style="">对内购的影响在于付款资料，也就是给你打钱的银行账户，虽然目前没有限制，但最好与业务主体相一致。 因为国内银行接受海外跨国汇款，可能会向你要求相关的证明材料，平台会在你注册或开启付款时完成这些协议签订， 签订对象就是账户的注册方。</p>
<p style="">如果你的收款账户与协议签订人不一致，就可能需要授权书等一系列麻烦的证明。</p>
<p style="">另外，目前（2024 年 9 月）对于小企业的服务费都降低到了 15%，谷歌是自动开启，苹果需要在网页上申请一下。</p>
<h2 style="" id="%E5%86%85%E8%B4%AD%E7%B1%BB%E5%9E%8B">内购类型</h2>
<p style="">简单来说，如果购买的产品和服务是通过设备提供的，就必须走内购。具体政策可以看官网，但基本囊括了绝大部分虚拟商品， 各种会员，使用限制和游戏道具等都在其中。</p>
<p style="">内购按是否会周期性定期扣款分为订阅和一次性购买。月会员年会员这种就属于订阅，到期后如果没有取消就会自动扣款开启下一期， 一般要求能持续性的提供服务，否则不好过审核。</p>
<p style="">一次性购买就是用户的确认只产生一次付款，分为可重复购买和不可重复购买（又称为可消耗和非消耗性）两种。 高级功能的买断式解锁就是前者，游戏里可以消耗的道具则是后者。</p>
<h2 style="" id="%E6%8E%A5%E5%85%A5%E5%89%8D%E7%9A%84%E8%AE%BE%E7%BD%AE">接入前的设置</h2>
<p style="">写代码之前，需要先在开发者后台完成应用内商品，以及测试账户相关的配置。</p>
<p style="">拉起购买时，需要从应用商店读取内购商品信息，因此要先去添加。一般会有延迟，添加后如果获取不到，可能需要等待几个小时。 苹果可以在 Xcode 中设置一个内购配置文件，能用来拉起支付验证的弹框，检测这个流程是否接入正确。但无法正常支付，因为没有连接到 App Store。</p>
<p style="">苹果的测试账户叫测试员，是添加一个没有注册过 Apple ID 的假账户，符合邮箱格式即可。 在真机的设置中，找到 App Store，里面有个沙盒账户的选项，用测试账户登录后，调试签名的 App 拉起支付就在测试环境了。</p>
<p style="">谷歌则需要真实的用户，将其添加到内测人员中，然后在封闭内测渠道中发布并审核通过一个版本。 这个版本可以没有支付相关的逻辑，但是必须要引入 Billing 依赖。 过审后用测试账户登录的 Google Play 下载内测渠道的应用，然后再插上电脑继续开发。 这时拉起支付时会忽略签名错误的异常，而是在弹出的支付界面中显示测试卡。</p>
<blockquote>
 <p style="">这一步中可能需要参考官方文档和大量的分享笔记，如果确认配置没有问题，但依然无法拉起支付，很有可能是配置数据没有更新， 建议等几个小时或者第二天再试。</p>
</blockquote>
<h2 style="" id="%E5%BC%80%E5%8F%91%E6%B5%8B%E8%AF%95">开发测试</h2>
<p style="">测试环境或沙盒环境的内购都是虚拟的，不会真正付款，所以可以放心的使用。</p>
<p style="">每次确认付款都会生成一笔订单。在触发后不一定立刻成功，所以都采用了回调的方式来处理。 回调结果有成功，失败，用户取消，验证失败，处理中，已恢复等状态。</p>
<p style="">其中处理中，也就是 Pending 状态，意味着还需要等待。在苹果上可能是用户没有同意 App Store 付款协议， 或者开启了家长控制，正在进行购买前询问。在谷歌则可能是信用卡扣款比较缓慢，需要等待银行的反馈。 不论是哪一种，最好都给用户明确的提示，告知可在商店中查询订单状态，以减少用户的不安。</p>
<p style="">除了正常的成功检查，还要注意退款的场景。交易的状态会随之发生变化， 用户付款后发放商品，检测到退款后同样要收回。这一点上苹果的交易记录查询 API 挺好，可以在设备上查询到实时变化， 但谷歌则一直无法查询到退款，即使卸载 App 后重新安装，或者清缓存重启都不行。</p>
<p style="">所以为了安全和稳妥，还是要有个后端来记录一下订单。</p>
<h2 style="" id="%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%AA%8C%E8%AF%81">服务端验证</h2>
<p style="">虽然在客户端就可以判断交易的结果，但如果用户 ROOT 了系统，这个结果就不那么可靠了。</p>
<p style="">谷歌官方文档上也认为，订单的状态更新应该放在安全的环境中，也就是服务端来更新。</p>
<p style="">处理流程为：</p>
<ol>
 <li>
  <p style="">订单回调成功后，发送订单唯一编号（苹果是 transcationId，谷歌是 purchaseToken）到服务端</p>
 </li>
 <li>
  <p style="">服务端向平台的订单查询接口进行查询，根据返回的结果保存订单状态。</p>
 </li>
 <li>
  <p style="">客户端查询该订单状态，服务端返回当前结果。</p>
 </li>
 <li>
  <p style="">服务端还要接受平台的回调通知，当退款等情况发生时，更新订单状态。</p>
 </li>
</ol>
<p style="">总之就是要自己维护订单状态，不相信客户端的返回结果，状态更新一律通过平台的查询接口或通知。</p>
<p style="">其中与平台的接口沟通需要验证凭据，就是一个生成的密钥。 后续在服务端验证订单时，向苹果或谷歌服务器发送的查询请求需要用此签名，验证回调数据时也用它。 两个平台都选择了 JWT 的形式，各主流语言都有封装好的库，传一下密钥文件就能直接用了。</p>
<p style="">苹果可以在后台直接生成，谷歌稍微麻烦一点，这部分要在 GCP 上配合完成，大概流程为：</p>
<ul>
 <li>
  <p style="">GCP 新建项目，开启 Google Play Android Developer API</p>
 </li>
 <li>
  <p style="">在该项目上创建服务账号，创建密钥，并下载密钥文件</p>
 </li>
 <li>
  <p style="">在 GP 控制台的 用户和数据 中邀请新用户，即上一步中的服务账号</p>
 </li>
 <li>
  <p style="">该用户会自动加入，给他添加财务数据下的两个权限</p>
 </li>
</ul>
<blockquote>
 <p style="">有的教程中会出现让你到 API 权限 页面进行服务账号的绑定，目前控制台已经没有这个菜单项，也不需要绑定了。</p>
</blockquote>
<p style="">订单号上报的接口，以及监听回调的接口，都可以在正常状况下只返回一个空 200，而非返回验证结果，防止被猜解。</p>
<h2 style="" id="%E5%85%B6%E4%BB%96">其他</h2>
<p style="">碎碎念几句，纯本地的 App 在安全方面其实不用特别下力气，因为总是能够被破解。</p>
<p style="">所有的东西都在本地，因此都可以被分析调试出来。就算你的支付验证在云端，也可以拦截后修改你的返回结果。 再进一步，返回结果也加密了，但由于解密也是在本地的，所以还是个时间和成本的问题，并没有本质的改变。</p>
<p style="">所以不要想完全的避免破解，而是要尽可能让其的成本扩大，以至于不可延续，还不如直接购买。 接受一点点损失，把精力放在更好的产品上吧。</p>]]></description><guid isPermaLink="false">/archives/bvCUOaxx</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fa-white-cell-phone.jpg&amp;size=m" type="image/jpeg" length="17240"/><pubDate>Tue, 2 Sep 2025 01:43:47 GMT</pubDate></item><item><title><![CDATA[Kotlin单例几种方式]]></title><link>https://jzy.cc/archives/1YKIqGdx</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=Kotlin%E5%8D%95%E4%BE%8B%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F&amp;url=/archives/1YKIqGdx" width="1" height="1" alt="" style="opacity:0;">
<h3 style="" id="1%E3%80%81%E9%A5%BF%E6%B1%89%E5%BC%8F"><span fontsize="" color=""><strong>1、饿汉式</strong></span></h3>
<pre><code>&nbsp;object StaticA {
&nbsp; &nbsp;  val x = 123
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">等价于java中的：</span></p>
<pre><code>&nbsp;public class StaticA  {
&nbsp;  public static final StaticA  sInstance = new StaticA()
&nbsp;  private StaticA () {
&nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">优点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">实现简单</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">线程安全，因为其在类加载时就进行了初始化，虚拟机内部保证其线程安全，保证对常量/静态变量只进行一次初始化</span></p>
 </li>
</ul>
<p style="line-height: inherit"><span fontsize="" color="">缺点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">在类加载时就创建了静态对象，实际上可能不会用到，所以对资源来说是浪费了，同时时类的初始化变慢，性能上并不是很好</span></p>
 </li>
</ul>
<h3 style="" id="2%E3%80%81%E6%87%92%E6%B1%89%E5%BC%8F"><span fontsize="" color=""><strong>2、懒汉式</strong></span></h3>
<p style="line-height: inherit"><span fontsize="" color="">懒汉式就是懒加载，在使用时在进行初始化，其实现如下：</span></p>
<pre><code>&nbsp;class SingleA {
&nbsp; &nbsp;  companion object {
&nbsp; &nbsp; &nbsp; &nbsp;  val sInstance by lazy(LazyThreadSafetyMode.NONE) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  SingleA()
&nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">等价于java的：</span></p>
<pre><code>&nbsp;public class SingleA  {
&nbsp; &nbsp;  private static sInstance;
&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;  private SingleA() {
&nbsp; &nbsp;  }
&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;  public static SingleA getInstance() {
&nbsp; &nbsp; &nbsp; &nbsp;  if (sInstance == null) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  sInstance  = new SingleA()
&nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp; &nbsp; &nbsp;  return sInstance;
&nbsp; &nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">优点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">延迟到使用时才进行初始化，提高了类加载的性能</span></p>
 </li>
</ul>
<p style="line-height: inherit"><span fontsize="" color="">缺点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">非线程安全，多个线程同时访问情况下，会创建多个实例</span></p>
 </li>
</ul>
<h3 style="" id="3%E3%80%81%E6%87%92%E6%B1%89%E5%90%8C%E6%AD%A5%E6%96%B9%E6%B3%95%E5%BC%8F"><span fontsize="" color=""><strong>3、懒汉同步方法式</strong></span></h3>
<p style="line-height: inherit"><span fontsize="" color="">此方法是在第2中方式上在给房间加锁来实现，如下：</span></p>
<pre><code>&nbsp;class SingleB {
&nbsp; &nbsp;  companion object {
&nbsp; &nbsp; &nbsp; &nbsp;  var sInstance: SingleB? = null
&nbsp;​
&nbsp; &nbsp; &nbsp; &nbsp;  @Synchronized
&nbsp; &nbsp; &nbsp; &nbsp;  fun getInstance(): SingleB? {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  if (sInstance == null) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  sInstance = SingleB()
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return sInstance
&nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">等价于java的：</span></p>
<pre><code>&nbsp;public class SingleB {
&nbsp; &nbsp;  private static SingleB sInstance;
&nbsp; &nbsp;
&nbsp; &nbsp;  private SingleB() {
&nbsp; &nbsp;  }
&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;  public static synchronized SingleB getInstance() {
&nbsp; &nbsp; &nbsp; &nbsp;  if (sInstance == null) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  sInstance = new SingleB();
&nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp; &nbsp; &nbsp;  return sInstance;
&nbsp; &nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">优点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">延迟到使用时才进行初始化，提高了类加载的性能</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">对方法使用了同步锁synchronized，保证了线程安全</span></p>
 </li>
</ul>
<p style="line-height: inherit"><span fontsize="" color="">缺点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">synchronized应用在方法上，所有是对整个方法加了锁，所以性能上稍差</span></p>
 </li>
</ul>
<h3 style="" id="4%E3%80%81%E6%87%92%E6%B1%89%E5%90%8C%E6%AD%A5%E5%9D%97%E5%BC%8F(%E6%8E%A8%E8%8D%90)"><span fontsize="" color=""><strong>4、懒汉同步块式(推荐)</strong></span></h3>
<p style="line-height: inherit"><span fontsize="" color="">与第3中的方式差不多，不同的是同步锁应用在方法的内部语句块中：</span></p>
<pre><code>&nbsp;class SingleC {
&nbsp; &nbsp;  companion object {
&nbsp; &nbsp; &nbsp; &nbsp;  val sIntance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  SingleC()
&nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">等价于java的：</span></p>
<pre><code>&nbsp;public class SingleC {
&nbsp; &nbsp;  private static SingleC sIntance;
&nbsp; &nbsp;  private SingleC() {
&nbsp; &nbsp;  }
&nbsp; &nbsp;  public static SingleC getInstance() {
&nbsp; &nbsp; &nbsp; &nbsp;  if (sIntance == null) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  synchronized (SingleC.class) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  if (sIntance == null) {
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  sIntance = new SingleC();
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp; &nbsp; &nbsp;  }
&nbsp; &nbsp; &nbsp; &nbsp;  return sIntance;
&nbsp; &nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">优点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">延迟到使用时才进行初始化，提高了类加载的性能</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">在创建对象的语句块中使用了同步锁synchronized，保证线程安全的同时，降低了锁的作用范围</span></p>
 </li>
</ul>
<p style="line-height: inherit"><span fontsize="" color="">缺点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">需要1-2次的空判断</span></p>
 </li>
</ul>
<h3 style="" id="5%E3%80%81%E9%9D%99%E6%80%81%E5%86%85%E9%83%A8%E7%B1%BB%E5%BC%8F%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%89"><span fontsize="" color=""><strong>5、静态内部类式（推荐）</strong></span></h3>
<p style="line-height: inherit"><span fontsize="" color="">静态内部类的方式充分使用了语义的规则：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">静态的语义规则——》使用到时才进行初始化，实现了懒加载</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">静态初始化是线程安全，线程的安全由虚拟机内部保证，保证静态初始化时只被初始化一次</span></p>
 </li>
</ul>
<p style="line-height: inherit"><span fontsize="" color="">以下是kotlin静态内部类的实现方式：</span></p>
<pre><code>&nbsp;class SingleD {
&nbsp; &nbsp;  companion object {
&nbsp; &nbsp; &nbsp; &nbsp;  fun getInstance() = InstanceHelper.sSingle
&nbsp; &nbsp;  }
&nbsp; &nbsp;  object InstanceHelper {
&nbsp; &nbsp; &nbsp; &nbsp;  val sSingle = SingleD()
&nbsp; &nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">等价于java的：</span></p>
<pre><code>&nbsp;public class SingleD {
&nbsp; &nbsp;  private SingleD() {
&nbsp;​
&nbsp; &nbsp;  }
&nbsp; &nbsp;  private static class InstanceHelper {
&nbsp; &nbsp; &nbsp; &nbsp;  static SingleD sInstance = new SingleD();
&nbsp; &nbsp;  }
&nbsp; &nbsp;  public static SingleD getInstance() {
&nbsp; &nbsp; &nbsp; &nbsp;  return InstanceHelper.sInstance;
&nbsp; &nbsp;  }
&nbsp;} </code></pre>
<p style="line-height: inherit"><span fontsize="" color="">优点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">延迟到使用时才进行初始化，提高了类加载的性能</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">使用静态初始化虚拟机保证线程安全的特性，实现了线程安全且锁的性能在虚拟机内部实现性能较好</span></p>
 </li>
</ul>
<p style="line-height: inherit"><span fontsize="" color="">缺点：</span></p>
<ul>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">需要多一个额外的静态内部类来辅助实现</span></p>
 </li>
</ul>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/1YKIqGdx</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fblack-flat-screen-computer-monitor.jpg&amp;size=m" type="image/jpeg" length="42981"/><category>Kotlin</category><pubDate>Tue, 8 Jul 2025 07:24:00 GMT</pubDate></item><item><title><![CDATA[创建自签服务端客户端证书]]></title><link>https://jzy.cc/archives/YHFsVDY7</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E5%88%9B%E5%BB%BA%E8%87%AA%E7%AD%BE%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AF%81%E4%B9%A6&amp;url=/archives/YHFsVDY7" width="1" height="1" alt="" style="opacity:0;">
<h3 style="" id="1.-%E7%94%9F%E6%88%90-ca-%E6%A0%B9%E8%AF%81%E4%B9%A6%EF%BC%88root-ca%EF%BC%89"><strong>1. 生成 CA 根证书（Root CA）</strong></h3>
<h4 style="" id="1.1.-%E7%94%9F%E6%88%90-ca-%E6%A0%B9%E7%A7%81%E9%92%A5"><strong>1.1. 生成 CA 根私钥</strong></h4>
<p style="line-height: inherit">首先，生成一个加密的根证书私钥，供后续生成根证书使用：</p>
<pre><code class="language-shell">&nbsp;openssl genpkey -algorithm RSA -out ca.key -aes256</code></pre>
<ul>
 <li>
  <p style="line-height: inherit"><code>ca.key</code> 是根证书的私钥文件，<code>-aes256</code> 表示使用 AES 256 加密。</p>
 </li>
</ul>
<h4 style="" id="1.2.-%E7%94%9F%E6%88%90-ca-%E6%A0%B9%E8%AF%81%E4%B9%A6"><strong>1.2. 生成 CA 根证书</strong></h4>
<p style="line-height: inherit">使用生成的根证书私钥来创建一个自签名的根证书：</p>
<pre><code class="language-shell">&nbsp;openssl req -key ca.key -new -x509 -out ca.crt -days 3650</code></pre>
<ul>
 <li>
  <p style="line-height: inherit"><code>ca.crt</code> 是根证书文件，<code>-days 3650</code> 指定有效期为 10 年。</p>
 </li>
 <li>
  <p style="line-height: inherit">在此过程中，你将被要求提供一些证书信息（如国家、组织等）。</p>
 </li>
</ul>
<hr>
<h3 style="" id="2.-%E7%94%9F%E6%88%90%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%AF%81%E4%B9%A6%EF%BC%88server-certificate%EF%BC%89"><strong>2. 生成服务端证书（Server Certificate）</strong></h3>
<h4 style="" id="2.1.-%E7%94%9F%E6%88%90%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%A7%81%E9%92%A5"><strong>2.1. 生成服务端私钥</strong></h4>
<pre><code class="language-shell">&nbsp;openssl genpkey -algorithm RSA -out server.key -aes256</code></pre>
<ul>
 <li>
  <p style="line-height: inherit"><code>server.key</code> 是服务端私钥。</p>
 </li>
</ul>
<h4 style="" id="2.2.-%E7%94%9F%E6%88%90%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%AF%81%E4%B9%A6%E7%AD%BE%E5%90%8D%E8%AF%B7%E6%B1%82%EF%BC%88csr%EF%BC%89"><strong>2.2. 生成服务端证书签名请求（CSR）</strong></h4>
<pre><code class="language-shell">&nbsp;openssl req -key server.key -new -out server.csr</code></pre>
<ul>
 <li>
  <p style="line-height: inherit"><code>server.csr</code> 是服务端的证书签名请求文件，之后将用根证书进行签发。</p>
 </li>
</ul>
<h4 style="" id="2.3.-%E4%BD%BF%E7%94%A8%E6%A0%B9%E8%AF%81%E4%B9%A6%E7%AD%BE%E5%8F%91%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%AF%81%E4%B9%A6"><strong>2.3. 使用根证书签发服务端证书</strong></h4>
<pre><code class="language-shell">&nbsp;openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650</code></pre>
<ul>
 <li>
  <p style="line-height: inherit"><code>server.crt</code> 是服务端证书文件。</p>
 </li>
 <li>
  <p style="line-height: inherit"><code>-CAcreateserial</code> 会自动生成一个序列号文件（<code>ca.srl</code>）。</p>
 </li>
</ul>
<hr>
<h3 style="" id="3.-%E7%94%9F%E6%88%90%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AF%81%E4%B9%A6%EF%BC%88client-certificate%EF%BC%89"><strong>3. 生成客户端证书（Client Certificate）</strong></h3>
<h4 style="" id="3.1.-%E7%94%9F%E6%88%90%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%A7%81%E9%92%A5"><strong>3.1. 生成客户端私钥</strong></h4>
<pre><code class="language-shell">&nbsp;openssl genpkey -algorithm RSA -out client.key -aes256</code></pre>
<ul>
 <li>
  <p style="line-height: inherit"><code>client.key</code> 是客户端私钥。</p>
 </li>
</ul>
<h4 style="" id="3.2.-%E7%94%9F%E6%88%90%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AF%81%E4%B9%A6%E7%AD%BE%E5%90%8D%E8%AF%B7%E6%B1%82%EF%BC%88csr%EF%BC%89"><strong>3.2. 生成客户端证书签名请求（CSR）</strong></h4>
<pre><code class="language-shell">&nbsp;openssl req -key client.key -new -out client.csr</code></pre>
<ul>
 <li>
  <p style="line-height: inherit"><code>client.csr</code> 是客户端的证书签名请求文件，之后将用根证书进行签发。</p>
 </li>
</ul>
<h4 style="" id="3.3.-%E4%BD%BF%E7%94%A8%E6%A0%B9%E8%AF%81%E4%B9%A6%E7%AD%BE%E5%8F%91%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AF%81%E4%B9%A6"><strong>3.3. 使用根证书签发客户端证书</strong></h4>
<pre><code class="language-shell">&nbsp;openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650</code></pre>
<ul>
 <li>
  <p style="line-height: inherit"><code>client.crt</code> 是客户端证书文件。</p>
 </li>
</ul>
<hr>
<h3 style="" id="4.-%E9%AA%8C%E8%AF%81%E7%94%9F%E6%88%90%E7%9A%84%E8%AF%81%E4%B9%A6"><strong>4. 验证生成的证书</strong></h3>
<h4 style="" id="4.1.-%E9%AA%8C%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AF%81%E4%B9%A6"><strong>4.1. 验证服务器证书</strong></h4>
<p style="line-height: inherit">使用根证书验证服务器证书是否正确签发：</p>
<pre><code class="language-shell">openssl verify -CAfile ca.crt server.crt</code></pre>
<ul>
 <li>
  <p style="line-height: inherit">如果输出 <code>server.crt: OK</code>，则表示服务器证书正确。</p>
 </li>
</ul>
<h4 style="" id="4.2.-%E9%AA%8C%E8%AF%81%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AF%81%E4%B9%A6"><strong>4.2. 验证客户端证书</strong></h4>
<p style="line-height: inherit">使用根证书验证客户端证书是否正确签发：</p>
<pre><code class="language-shell">openssl verify -CAfile ca.crt client.crt</code></pre>
<ul>
 <li>
  <p style="line-height: inherit">如果输出 <code>client.crt: OK</code>，则表示客户端证书正确。</p>
 </li>
</ul>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/YHFsVDY7</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fwhite-and-brown-concrete-buildings-during-daytime.jpg&amp;size=m" type="image/jpeg" length="155054"/><category>移动安全</category><pubDate>Tue, 22 Apr 2025 06:15:15 GMT</pubDate></item><item><title><![CDATA[如何不通过 ESIM 手机直接申请Giffgaff ESIM]]></title><link>https://jzy.cc/archives/JxiQSfoZ</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E5%A6%82%E4%BD%95%E4%B8%8D%E9%80%9A%E8%BF%87%20ESIM%20%E6%89%8B%E6%9C%BA%E7%9B%B4%E6%8E%A5%E7%94%B3%E8%AF%B7Giffgaff%20ESIM&amp;url=/archives/JxiQSfoZ" width="1" height="1" alt="" style="opacity:0;">
<p>本文介绍通过HTTP请求工具PostMan获取Giffgaff esim二维码的方法。
 <br>
 　（本文截图较多，如加载缓慢请耐心等待或尝试刷新）
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rbbh.png&amp;size=m" alt="img"></p>
<h2 id="一原理"><strong>一、原理</strong></h2>
<p>　　Giffgaff是英国的一家虚拟运营商，其Giffgaff卡适合长期保号使用。
 <br>
 　　Giffgaff原先只提供实体SIM卡，随后开始支持将实体SIM卡转换为esim或者直接购买新的esim。Giffgaff并不提供esim的二维码，而是通过自家的APP直接将esim配置文件下载到手机中。APP也会检测手机是否原生支持esim。
 <br>
 　　对于使用5ber等实体esim卡的用户来说，需要想办法找一部原生支持esim的手机，在Giffgaff APP下载esim配置文件之前，通过网络嗅探工具“抓包”的方式获取esim配置文件的下载链接，然后将链接转换为二维码的形式，实现“曲线救国”。这种方法除了需要先找一部esim手机，还需要具备一定的动手操作能力，所以并不方便。
 <br>
 　　好在网上有大神写了PostMan脚本，通过HTTP请求的方式直接与Giffgaff的服务器进行通信来获取esim配置文件的下载链接，不依赖esim手机和Giffgaff APP。本文即介绍这个方法的操作步骤。</p>
<h2 id="二操作步骤"><strong>二、操作步骤</strong></h2>
<h3 id="1安装postman客户端"><strong>1、安装PostMan客户端</strong></h3>
<p>　　打开<a href="https://www.postman.com/downloads/">PostMan官网的APP下载页面</a>，选择对应的操作系统进行下载。本文以Windows客户端为例。
 <br>
 　　首次运行PostMan会提示我们注册一个账号，或者使用已有的账号进行登录。自行注册一个账号，然后登录。
 <br>
 <strong>特别提醒</strong></p>
<blockquote>
 <p>如果你仅希望临时注册一个账号并不暴露自己的邮箱，可以使用下面的网站快速获得临时邮箱，完成接验证码或确认邮件。 <a href="https://fakemail.ink/">https://fakemail.ink/</a> 和 <a href="https://fakemail.chat/">https://fakemail.chat/</a></p>
</blockquote>
<h3 id="2导入脚本"><strong>2、导入脚本</strong></h3>
<p>　　脚本地址：<a href="https://jzy.cc/upload/pNpfad.json">pNpfad.json</a>
 <br>
 　　下载GiffGaff实体卡转eSIM的PostMan脚本。（鼠标移到链接上方，点击右键，选择“链接另存为”）
 <br>
 　　回到PostMan，依次点击客户端左上角的“Menu” - “File” - “Import”，或者直接按下“Ctrl + O”快捷键，打开导入界面。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-whfp.png&amp;size=m" alt="img">
 <br>
 　　点击“Select files”，浏览并选中刚才下载的脚本文件，或者直接将文件拖拽进窗口。
 <br>
 　　导入后，如下图所示。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-cnja.png&amp;size=m" alt="img"></p>
<h3 id="3获取access-token"><strong>3、获取Access Token</strong></h3>
<p>　　要通过HTTP请求的方式直接与Giffgaff服务器通讯，首先需要获取一个Access Token。向服务器发送的请求中需要包含这个Token来验证用户身份。
 <br>
 　　如下图所示，依次点击<code>Authorization</code> - <code>滚动条划到最后</code> - <code>Clear cookies</code> - <code>Get New Access Token</code>。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ticm.png&amp;size=m" alt="img">
 <br>
 　　在弹出的登录窗口中输入自己的Giffgaff账号和密码，点击“Log in”按钮。
 <br>
 　　接下来在窗口中输入发送到Email或者手机号的验证码，点击“Log in”按钮。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-bpve.png&amp;size=m" alt="image-bpve.png"></p>
<p>　　登录成功后，会看到如下图所示的Token Detail，点击“Use Token”按钮。此时相当于我们已经使用账号密码登录了Giffgaff APP。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-gdkh.png&amp;size=m" alt="image-gdkh.png"></p>
<h3 id="4二次认证"><strong>4、二次认证</strong></h3>
<p>　　点击左侧列表中的“发送认证邮件”，然后点击右侧的“Send”按钮，此时Giffgaff会向我们的EMail发送一个验证码。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-tanf.png&amp;size=m" alt="image-tanf.png"></p>
<p>　　点击左侧列表中的“检查邮件认证码”，然后点击“Body”选项卡，如下图所示将收到的验证码填入<code>"code":</code>后边的双引号内，然后点击“Send”按钮。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-muiz.png&amp;size=m" alt="image-muiz.png">
 <br>
 　　如果顺利的话，会返回一个包含“signature”字段的json。
 <br>
 　　点击左侧列表中的“获取会员资讯”，然后点击右侧的“Send”按钮做一个测试。如果一切正确的话，会返回一个包含各种用户信息的json，如下图所示。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-kbnw.png&amp;size=m" alt="image-kbnw.png"></p>
<h3 id="5生成新的空卡"><strong>5、生成新的空卡</strong></h3>
<p>　　点击左侧列表中的“Reserve SIM”，然后点击右侧的“Send”按钮。这个步骤的作用是为esim预留一个编号，相当于新开了一张空白的SIM卡，用于将旧的实体SIM卡转移过来。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-gujc.png&amp;size=m" alt="image-gujc.png"></p>
<h3 id="6换卡"><strong>6、换卡</strong></h3>
<p>　　这里要注意，如果你已经有卡，并且已经充值了，按步骤往下执行。否则就需要先充值开卡后在执行这一步。
 <br>
 　　点击左侧列表中的“Swap SIM”，然后点击右侧的“Send”按钮。这个步骤的作用是换卡，即弃用旧的实体卡，启用新的esim。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-okyz.png&amp;size=m" alt="image-okyz.png"></p>
<blockquote>
 <p>根据GiffGaff官网的说明，只能在英国当地时间4:30至21:30之间进行换卡操作。</p>
</blockquote>
<h3 id="7生成esim配置文件"><strong>7、生成esim配置文件</strong></h3>
<p>　　点击左侧列表中的“Get ESIMs”，然后点击右侧的“Send”按钮。这个步骤的作用是生成esim配置文件。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-cfzp.png&amp;size=m" alt="image-cfzp.png"></p>
<h3 id="8获取esim下载地址"><strong>8、获取eSIM下载地址</strong></h3>
<p>　　点击左侧列表中的“Get ESIMs”，然后点击右侧的“Send”按钮。这个步骤的作用是获取eSIM配置文件的下载地址。<code>lpastring</code>字段的值就是eSIM配置文件的下载地址，格式类似<code>LPA:1$服务器地址$MatchingID</code>。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-guls.png&amp;size=m" alt="image-guls.png"></p>
<h3 id="9生成二维码"><strong>9、生成二维码</strong></h3>
<p>　　点击左侧列表中的“Get ESIM QRCode”，然后点击右侧的“Send”按钮。这个步骤的作用是将下载地址转换为二维码，方便手机扫描。
 <br>
 <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ywqf.png&amp;size=m" alt="image-ywqf.png"></p>
<blockquote>
 <p>此处使用了第三方的二维码在线生成服务。如果担心信息泄露，可以选择自己信任的其他在线或者离线的二维码生成服务。</p>
</blockquote>
<h3 id="10安装esim"><strong>10、安装esim</strong></h3>
<p>　　使用支持eSIM的手机、5ber APP或者其他第三方的eSIM管理工具扫描这个二维码，即可下载并安装eSIM配置文件。</p>
<blockquote>
 <p>新的esim通常会在一个小时内有信号。如果一直没有信号，请尝试开启、关闭飞行模式，或者重启手机。</p>
</blockquote>
<p>参考文章：
 <br>
 <a href="https://www.giffgaff.com/help/articles/how-do-i-get-an-esim-on-giffgaff">英国GiffGaff手机卡购买和使用教程</a>
 <br>
 <a href="https://azhu.site/posts/1005/">5ber eSIM手机卡购买和使用教程</a>
 <br>
 <a href="https://simonmy.com/posts/%E5%A6%82%E4%BD%95%E4%B8%8D%E9%80%9A%E8%BF%87esim%E6%89%8B%E6%9C%BA%E7%9B%B4%E6%8E%A5%E7%94%B3%E8%AF%B7giffgaff-esim.html">如何不通过esim手机直接申请giffgaff-esim</a>
 <br>
 <a href="https://azhu.site/posts/1015/">如何将GiffGaff sim卡转换为esim</a></p>]]></description><guid isPermaLink="false">/archives/JxiQSfoZ</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rbbh.png&amp;size=m" type="image/jpeg" length="114146"/><category>手机卡</category><pubDate>Sun, 16 Mar 2025 12:57:00 GMT</pubDate></item><item><title><![CDATA[PVE 安装windows10 硬件虚拟化UHD630显卡直通与GVT-g]]></title><link>https://jzy.cc/archives/abKOHrNa</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=PVE%20%E5%AE%89%E8%A3%85windows10%20%E7%A1%AC%E4%BB%B6%E8%99%9A%E6%8B%9F%E5%8C%96UHD630%E6%98%BE%E5%8D%A1%E7%9B%B4%E9%80%9A%E4%B8%8EGVT-g&amp;url=/archives/abKOHrNa" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E7%A1%AC%E4%BB%B6%EF%BC%9A"><strong>硬件：</strong></h2>
<p style="">CPU： i9-10900t es 版核显 UHD630</p>
<p style="">主板：七彩虹H510i GAMING V20ITX主板</p>
<h2 style="" id="%E4%B8%80%E3%80%81%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D%EF%BC%9A"><strong>一、原理介绍：</strong></h2>
<p style="">显卡直通很好理解，即是显卡直接直通给虚拟机，包括PVE和其他虚拟机都不能用。适合打算将显卡直通给一个虚拟机外联<a rel="noopener" href="https://blog.zhangyin.net/wp-content/plugins/cp-link-open/link.php?a=aHR0cHM6Ly93d3cuc216ZG0uY29tL2ZlbmxlaS94aWFuc2hpcWkv" target="_blank" class="seo_link"><u>显示器</u></a>的情况，或者主机有多个显卡分别直通给不同设备的情况。这里需要说下，直通也需要IOMMU拆分，不然整个PCIe全都给了某个虚拟机，后果不限于PVE失联，M.2固态找不到了，<a rel="noopener" href="https://blog.zhangyin.net/wp-content/plugins/cp-link-open/link.php?a=aHR0cHM6Ly93d3cuc216ZG0uY29tL2ZlbmxlaS95aW5ncGFuLw==" target="_blank" class="seo_link"><u>硬盘</u></a>也找不到了等等。。。</p>
<p style="">中介设备【 Mediated Devices 】：vGPU, GVT-g。Intel核显的技术叫GVT-g， NVIDIA技术叫vGPU。这个是很多小伙伴的刚需，想把核显分享给黑群晖或者docker里面的emby、jellyfin做硬解，win10或者别的虚拟机也想要个核显，反正都得有。这种情况就用到intel的GVT-g，效果如下：</p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rrih.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E4%BA%8C%E3%80%81%E4%BF%AE%E6%94%B9%E5%BC%95%E5%AF%BC%E5%8A%A0%E8%BD%BD%E7%A8%8B%E5%BA%8F%E5%86%85%E6%A0%B8%E5%91%BD%E4%BB%A4%E8%A1%8C%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6grub"><strong>二、修改引导加载程序内核命令行配置文件GRUB</strong></h2>
<pre><code>nano /etc/default/grub</code></pre>
<p style=""></p>
<h3 style="" id="%E3%80%90%E7%AC%AC%E4%B8%80%E6%AD%A5%E3%80%91%E6%B7%BB%E5%8A%A0%E5%91%BD%E4%BB%A4">【第一步】添加命令</h3>
<pre><code>GRUB_CMDLINE_LINUX_DEFAULT="quiet"</code></pre>
<p style="">修改为：&nbsp;</p>
<pre><code>GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1"</code></pre>
<p style="">光标放在quiet的后面空一格，然后复制黏贴。</p>
<p style="">修改完成后按Ctrl+x，问你是否需要保存？--&gt;输入Y，问你是否写入文件--&gt;按回车。</p>
<p style=""><strong>弄错了没关系，问你是否需要保存？--&gt;输入N，就返回了。</strong></p>
<p style="">原理说明（按需要添加命令）：</p>
<p style="">1、官方文档：IOMMU (I/O Memory Management Unit)中断重新映射。如果不中断重新映射，将无法使用 PCI 直通。设备分配将失败，并显示“无法分配设备”[设备名称]“：不允许操作”或“找不到中断重新映射硬件，将设备传递到非特权域不安全”错误。【 'Failed to assign device "[device name]": Operation not permitted' or 'Interrupt Remapping hardware not found, passing devices to unprivileged domains is insecure.' error.】
 <br>
 所有使用英特尔处理器和芯片组的系统，如果支持英特尔虚拟化技术定向 I/O （VT-d），但不支持中断重新映射，将看到此类错误。较新的处理器和芯片组（AMD 和英特尔）提供中断重新映射支持；</p>
<p style="">2、PCIe直通需要主要主要开启虚拟化， Intel叫VT-d，AMD的叫AMD-V(i) ，都需要再主板BIOS里面开启；</p>
<p style="">3、Intel添加的为intel_iommu=on，AMD添加的为amd_iommu=on；</p>
<p style="">4、 iommu=pt，官方文档说明：这仅在必要时才启用 IOMMU 转换，适配器不需要使用 DMA 转换到内存，因此可以提高虚拟机管理程序 PCIe 设备（未传递到 VM）的性能。意思就是开了能提高虚拟机调取PCIe的性能，那就开吧。</p>
<p style="">5、i915.enable_gvt=1，官方文档说明：Intel的 GVT-g 驱动程序集成在内核中，启用时加载模块。意思就是，想开启GVT-g的就添加这条，显卡直通的就不要添加了。</p>
<h3 style="" id="%E3%80%90%E7%AC%AC%E4%BA%8C%E6%AD%A5%E3%80%91%E4%BF%9D%E5%AD%98%E6%9B%B4%E6%94%B9%E5%B9%B6%E6%9B%B4%E6%96%B0-grub">【第二步】保存更改并更新 grub</h3>
<pre><code>update-grub</code></pre>
<p style="">GVT-g可支持数量和最多分辨率：</p>
<p style="">注：</p>
<p style="">i915-GVTg_V5_1 # Video memory: &lt;512MB, 2048MB&gt;, resolution: up to 1920x1200
 <br>
 可用数量
 <br>
 i915-GVTg_V5_2 # Video memory: &lt;256MB, 1024MB&gt;, resolution: up to 1920x1200
 <br>
 可用数量
 <br>
 i915-GVTg_V5_4 # Video memory: &lt;128MB, 512MB&gt;, resolution: up to 1920x1200
 <br>
 可用数量2
 <br>
 i915-GVTg_V5_8 # Video memory: &lt;64MB, 384MB&gt;, resolution: up to 1024x768
 <br>
 可用数量1</p>
<p style="">所以想要核显分享给多个虚拟机用的，需要在bios里面设置内存分给核显显存的大小。</p>
<h2 style="" id="%E4%BA%8C%E3%80%81%E4%BF%AE%E6%94%B9%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97"><strong>二、修改内核模块</strong></h2>
<p style="">编辑文件：</p>
<pre><code>nano /etc/modules</code></pre>
<p style="">在最后加入 ：</p>
<pre><code>vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
kvmgt</code></pre>
<p style=""></p>
<p style="">原理说明：</p>
<p style="">1、PCIe直通启用vfio vfio_iommu_type1 vfio_pci vfio_virqfd
 <br>
 2、vGPU和GVT-g需再添加kvmgt</p>
<h3 style="" id="%E3%80%90%E7%AC%AC%E4%BA%8C%E6%AD%A5%E3%80%91%E6%9B%B4%E6%94%B9%E4%BB%BB%E4%BD%95%E4%B8%8E%E6%A8%A1%E5%9D%97%E7%9B%B8%E5%85%B3%E7%9A%84%E5%86%85%E5%AE%B9%E5%90%8E%EF%BC%8C%E6%82%A8%E9%9C%80%E8%A6%81%E5%88%B7%E6%96%B0-initramfs">【第二步】更改任何与模块相关的内容后，您需要刷新 initramfs</h3>
<pre><code>update-initramfs -u -k all</code></pre>
<p style="">同时完成后，应重启以下。可用shell里面reboot，或者web界面重启。</p>
<p style="">总共也就四步而已，非常简单。</p>
<h2 style="" id="%E4%B8%89%E3%80%81%E6%95%88%E6%9E%9C%E6%A3%80%E6%B5%8B"><strong>三、效果检测</strong></h2>
<p style="">命令一：</p>
<pre><code>dmesg | grep -e DMAR -e IOMMU -e AMD-Vi</code></pre>
<p style=""></p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-deja.png&amp;size=m" width="970px" height="445px" style="display: inline-block"></p>
<p style="">命令二：</p>
<pre><code>find /sys/kernel/iommu_groups/ -type l</code></pre>
<p style=""></p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-kgyp.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">命令三：</p>
<pre><code>lspci</code></pre>
<p style=""></p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-tdom.png&amp;size=m" width="970px" height="80px" style="display: inline-block"></p>
<p style="">注：lspci 显示所有PCIe设备的信息，比如第二个VGA就是Intel的核显，0000:00:02.0就是设备ID，下一个命令就是参看此设备支持的类型。</p>
<p style="">命令四：</p>
<pre><code>ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types</code></pre>
<p style=""></p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-aduh.png&amp;size=m" width="970px" height="80px" style="display: inline-block"></p>
<p style="">标题二里最后的TIPS里面，i915-GVTg_V5_4，i915-GVTg_V5_8。</p>
<p style="">最简单的还是直接建一个虚拟机，完成后不要启动，再【硬件】--&gt;【添加】--&gt;【PCI设备】就能看到了。</p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ltji.png&amp;size=m" width="969px" height="448px" style="display: inline-block"></p>
<h2 style="" id="%E5%9B%9B%E3%80%81%E6%94%BE%E4%B8%80%E5%BC%A0%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E9%85%8D%E7%BD%AE%E5%9B%BE%E5%A4%A7%E5%AE%B6%E5%8F%82%E8%80%83"><strong>四、放一张虚拟机的配置图大家参考</strong></h2>
<p style="">框起来的几条注意一下</p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-tuxw.png&amp;size=m" width="970px" height="420px" style="display: inline-block"></p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-zqxh.png&amp;size=m" width="970px" height="420px" style="display: inline-block"></p>
<h2 style="" id="%E4%BA%94%E3%80%81%E9%97%AE%E9%A2%98%E4%B8%8E%E6%80%BB%E7%BB%93"><strong>五、问题与总结</strong></h2>
<p style="">pve按照完成后，可先检测一下硬件设备和系统是否支持。要确定您的系统是否支持中断重新映射，请执行以下操作：</p>
<blockquote>
 <p style="">dmesg | grep 'remapping'</p>
</blockquote>
<p style="">如支持应显示：</p>
<blockquote>
 <p style="">[ 0.111370] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
  <br>
  [ 0.112284] DMAR-IR: Enabled IRQ remapping in x2apic mode</p>
</blockquote>
<p style="">下面重点来了，不支持咋办？，下面的办法我没验证，做为参考。</p>
<p style="">如不显示，则硬件设备不支持，可以使用以下命令允许不安全的中断：</p>
<pre><code>echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" &gt; /etc/modprobe.d/iommu_unsafe_interrupts.conf</code></pre>
<p style=""></p>
<p style="">意思就是通过命令行或者软支持（我的理解）。</p>
<p style="">然后再命令行更新 grub，刷新 initramfs。</p>
<pre><code>update-grub
update-initramfs -u -k all</code></pre>
<p style=""></p>
<p style="">要是再不行，只能再网上搜搜有没有案例了。</p>
<p style="">最后的最后：</p>
<p style="">1、给软路由的小伙伴，这样设置下来，你的多网口网卡可以支持分别分给ikuai、op、routeros等等软路由了。</p>
<p style="">2、如果你的网卡支持SR-IOV的话，你会发现也变成中介模式了一个网口也能支持给多个设备了。</p>]]></description><guid isPermaLink="false">/archives/abKOHrNa</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fa-black-table-topped-with-electronics-and-a-microphone.jpg&amp;size=m" type="image/jpeg" length="30541"/><category>虚拟化</category><pubDate>Wed, 19 Feb 2025 10:51:15 GMT</pubDate></item><item><title><![CDATA[搬砖方法论：分层策略]]></title><link>https://jzy.cc/archives/d5wiepXD</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E6%90%AC%E7%A0%96%E6%96%B9%E6%B3%95%E8%AE%BA%EF%BC%9A%E5%88%86%E5%B1%82%E7%AD%96%E7%95%A5&amp;url=/archives/d5wiepXD" width="1" height="1" alt="" style="opacity:0;">
<p style="">前言：当编写系统模块时，都会注意高内聚、低耦合、单一等等原则，虽然这些原则并非强制性，但是它对后续扩展有很好的指导性建议。但这些仅仅是微观上的，在宏观上也是需要类似这种指导性建议。这也是我们需要对架构或者框架进行分层的原因。</p>
<h2 style="" id="%E4%BB%80%E4%B9%88%E6%98%AF%E5%88%86%E5%B1%82"><strong>什么是分层</strong></h2>
<p style="">分层就是就是在宏观上，将系统整体拆分成几大类别，对其职责进行归纳总结，并控制其之间的相互关系。</p>
<h2 style="" id="%E5%88%86%E5%B1%82%E7%9A%84%E4%BD%9C%E7%94%A8"><strong>分层的作用</strong></h2>
<p style="">分层解决的是系统之间的依赖关系，并确定其根本职责或者说是功能范畴，对于系统的后续的扩展和健壮性都有极大的帮助。而且因为分层策略上的束缚，在模块编写时，也约束了某些不确定因素扩散到整个系统的情况，这也算是变相的保底机制。</p>
<h2 style="" id="%E5%BA%94%E8%AF%A5%E6%80%8E%E4%B9%88%E5%88%86"><strong>应该怎么分</strong></h2>
<p style="">目前常规使用的分层策略分为三种</p>
<p style=""><strong>DDD</strong>为首的N层应用架构</p>
<p style="text-align: left"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-kcwg.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="">同心圆方式的圆葱架构</p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-igym.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="">六边形架构</p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-scam.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="">作为游戏开发，其分层策略更趋近于，分层和同心圆架构。</p>
<p style="">在说明前，先介绍一些概念：“上层与下层”、“低层与高层”、“外层与内层”，其权重或者说等级关系为：上层==低层==外层，下层==高层==内层。</p>
<p style="">为了后续的方便说明，我们以上层和下层进行说明。</p>
<p style="">游戏开发的系统，按照其宏观的功能职责会分为，引擎，插件，自定义管理类（各种Manager），工具类，业务逻辑（MVP/MVC/MVVM）、SDK这6大类</p>
<p style="">其依赖方向为上层依赖下层且为单向，在使用时，并非使用严格分层架构，而是使用松散分层架构。也就是说，上层可以直接使用其下面的所有层级，并非仅仅下面的一层。</p>
<p style=""><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-aaci.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style=""><strong>其结构越往下，抽象度越高，通用性就越强，修改频率也越低。</strong>在CustomManager层与Plugins、SDK层之间，有时需要添加中间层，进行依赖倒置，来达到替换Plugins、SDK的目的。
 <br>
 通俗来讲，在下层的层级中，不应该出现上层的任何代码（类、变量、函数）。
 <br>
 只有这样严格的控制其层级，才能最大几率的避免网状结构的存在，在替换对应层级的时候也可减小和准确评估出其受影响范围。</p>
<h2 style="" id="%E6%80%BB%E7%BB%93"><strong>总结</strong></h2>
<p style="">分层策略本质是约束和控制，这种约束和控制以牺牲一定自由度为前提，带来了利于风险管控、支持并行开发、无感知替换等优点。所以分层策略需要在开发之初进行制定，但架构的优化是一个循环往复的过程，直到找到最合适的策略。</p>]]></description><guid isPermaLink="false">/archives/d5wiepXD</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fa-close-up-of-a-white-object-on-a-table.jpg&amp;size=m" type="image/jpeg" length="24483"/><category>架构设计</category><pubDate>Wed, 12 Feb 2025 07:02:42 GMT</pubDate></item><item><title><![CDATA[架构风格概述]]></title><link>https://jzy.cc/archives/lXWWsS23</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC%E6%A6%82%E8%BF%B0&amp;url=/archives/lXWWsS23" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p style="line-height: inherit"><strong>架构风格定义了用于描述系统的术语表和一组指导构建系统的规则。</strong></p>
</blockquote>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 962px">
  <colgroup>
   <col style="width: 221px">
   <col style="width: 741px">
  </colgroup>
  <tbody>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <th colspan="1" rowspan="1" colwidth="221" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px;">
     <p style=""><strong>五大架构风格</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="741" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>子风格</strong></p>
    </th>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="221" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">数据流风格【Data Flow】</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="741" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">批处理【Batch Sequential】、管道-过滤器【Pipes And Filters】</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="221" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">调用/返回风格【Call Return】</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="741" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">主程序/子程序【Main Program And Subroutine】、面向对象【Object orienred】、分层架构【Layered System】</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="221" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">独立构建风格【Independent Components】</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="741" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">进程通信【Communicating Processes】、事件驱动系统（隐式调用）【Event System】</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="221" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">虚拟机风格【Virtual Machine】</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="741" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">解释器【Interpreter】、规则系统【Rule Base System】</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="221" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">以数据中心风格【Data Centered】</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="741" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">数据库系统【Database System】、黑板系统【Blackboard System】、超文本系统【Hypertext System】</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<h2 style="" id="%E6%95%B0%E6%8D%AE%E6%B5%81%E9%A3%8E%E6%A0%BC"><strong>数据流风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-oiee.png&amp;size=m" width="60%" height="100%" style="display: inline-block"> <img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-lgpv.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit"><strong>优点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">松耦合【高内聚-低耦合】</p>
 </li>
 <li>
  <p style="line-height: inherit">良好的重用性/可维护性</p>
 </li>
 <li>
  <p style="line-height: inherit">可扩展性【标准接口适配】</p>
 </li>
 <li>
  <p style="line-height: inherit">良好的隐蔽性</p>
 </li>
 <li>
  <p style="line-height: inherit">支持并行</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>缺点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">交互性差</p>
 </li>
 <li>
  <p style="line-height: inherit">复杂性高</p>
 </li>
 <li>
  <p style="line-height: inherit">性能较差（每个过滤器都需要解析与合成数据）</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>典型实例</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">传统编译器</p>
 </li>
 <li>
  <p style="line-height: inherit">网络报文处理</p>
 </li>
</ul>
<h3 style="" id="%E6%95%B0%E6%8D%AE%E6%B5%81%E9%A3%8E%E6%A0%BC%E4%B8%A4%E5%A4%A7%E5%88%86%E7%B1%BB"><strong>数据流风格两大分类</strong></h3>
<p style="line-height: inherit"><strong>批处理序列：</strong>大量整体数据、无需用户交互</p>
<p style="line-height: inherit"><strong>管道-过滤器：</strong>流式数据、弱用户交互</p>
<h2 style="" id="%E8%BF%94%E5%9B%9E%2F%E8%B0%83%E7%94%A8%E9%A3%8E%E6%A0%BC"><strong>返回/调用风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-mplc.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit"><strong>返回/调用风格主要分为三类</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">主程序/子程序：面向过程</p>
 </li>
 <li>
  <p style="line-height: inherit">面向对象：对象的方法调用</p>
 </li>
 <li>
  <p style="line-height: inherit">分层：层与层之间的方法调用</p>
 </li>
</ul>
<h3 style="" id="%E5%B8%B8%E7%94%A8%E7%9A%84%E4%B8%BA%E5%88%86%E5%B1%82%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC%EF%BC%8C%E8%AF%A6%E8%A7%81%E6%90%AC%E7%A0%96%E6%96%B9%E6%B3%95%E8%AE%BA%EF%BC%9A%E5%88%86%E5%B1%82%E7%AD%96%E7%95%A5"><strong>常用的为分层架构风格，详见</strong><a href="https://aihailan.com/archives/2685"><strong>搬砖方法论：分层</strong></a><a href="https://jzy.cc/archives/d5wiepXD" target="_blank"><strong>策略</strong></a></h3>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ezac.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit"><strong>优点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">良好的重用性，只要接口不变可用在其它地方</p>
 </li>
 <li>
  <p style="line-height: inherit">可维护性好</p>
 </li>
 <li>
  <p style="line-height: inherit">可扩展性好，支持递增设计</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>缺点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">并不是每个系统都方便分层</p>
 </li>
 <li>
  <p style="line-height: inherit">很难招到一个合适的、正确的层次抽象方法</p>
 </li>
 <li>
  <p style="line-height: inherit">不同层次之间耦合度高的系统很难实现</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>特点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">各个层次的组件形成不同功能级别的虚拟机</p>
 </li>
 <li>
  <p style="line-height: inherit">多层相互协同工作，而且实现透明</p>
 </li>
</ul>
<h2 style="" id="%E7%8B%AC%E7%AB%8B%E6%9E%84%E5%BB%BA%E9%A3%8E%E6%A0%BC"><strong>独立构建风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-srjf.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit"><strong>优点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">松耦合</p>
 </li>
 <li>
  <p style="line-height: inherit">良好的重用性、可修改性、可扩展性</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>缺点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">构建放弃了对系统计算的控制。一个构建触发一个事件时，不能确定其他构建是否会响应它。而且即使它知道事件注册了哪些构建的过程，它也不能保证这些过程被调用的顺序。</p>
 </li>
 <li>
  <p style="line-height: inherit">数据交换的问题</p>
 </li>
 <li>
  <p style="line-height: inherit">既然过程的语义必须依赖于被触发事件的上下文约束，关于正确性的推理就存在问题。</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>特点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">系统由若干子系统构成且称为一个整体</p>
 </li>
 <li>
  <p style="line-height: inherit">系统有统一的目标</p>
 </li>
 <li>
  <p style="line-height: inherit">子系统有主从之分</p>
 </li>
 <li>
  <p style="line-height: inherit">每一子系统有自己的事件收集和处理机制</p>
 </li>
</ul>
<h2 style="" id="%E8%99%9A%E6%8B%9F%E6%9C%BA%E9%A3%8E%E6%A0%BC"><strong>虚拟机风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-tseq.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 925px">
  <colgroup>
   <col style="width: 100px">
   <col style="width: 100px">
   <col style="width: 100px">
   <col style="width: 100px">
   <col style="width: 525px">
  </colgroup>
  <tbody>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <th colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px;">
     <p style=""><strong>子分类</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>优点</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>缺点</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>特点</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="525" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>适合领域</strong></p>
    </th>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">解释器</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">可以灵活应对自定义场景</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">复杂度较高</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">适用于需要“自定义规则”的场合</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="525" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style=""></p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">规则为中心</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">可以灵活应对自定义场景</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">复杂度较高</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="100" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">在解释器的基础上增加经验规则</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="525" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">适用于专家系统</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<h2 style="" id="%E4%BB%A5%E6%95%B0%E6%8D%AE%E4%B8%BA%E4%B8%AD%E5%BF%83%E9%A3%8E%E6%A0%BC"><strong>以数据为中心风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hqoe.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 970px">
  <colgroup>
   <col style="width: 126px">
   <col style="width: 304px">
   <col style="width: 239px">
   <col style="width: 161px">
   <col style="width: 140px">
  </colgroup>
  <tbody>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <th colspan="1" rowspan="1" colwidth="126" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px;">
     <p style=""><strong>子分类</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="304" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>优点</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="239" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>缺点</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="161" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>特点</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="140" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>适合领域</strong></p>
    </th>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="126" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">数据库系统</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="304" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">以数据为中心</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="239" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style=""></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="161" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style=""></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="140" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style=""></p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="126" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">黑办系统</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="304" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">可更改性和可维护性；可重用的知识源；容错性和健壮性</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="239" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">测试困难；不能保证有好的解决方案；难以建立好的控制策略；低效；开发困难；缺少并行机制</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="161" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">在以数据为中心的基础上，使用中心数据触发业务逻辑部件</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="140" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">语音识别、模式识别、图形处理、知识推理</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<h2 style="" id="%E9%97%AD%E7%8E%AF%E6%8E%A7%E5%88%B6%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC%EF%BC%88%E8%BF%87%E7%A8%8B%E6%8E%A7%E5%88%B6%EF%BC%89"><strong>闭环控制架构风格（过程控制）</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-swsj.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<ul>
 <li>
  <p style="line-height: inherit">适合于嵌入式系统，用于解决简单闭环控制问题。</p>
 </li>
 <li>
  <p style="line-height: inherit">经典应用：空调温控，定速巡航。</p>
 </li>
</ul>
<h2 style="" id="c2%E9%A3%8E%E6%A0%BC"><strong>C2风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-khcv.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit">基本规则</p>
<ul>
 <li>
  <p style="line-height: inherit">构建和连接件都有一个顶部和一个底部。</p>
 </li>
 <li>
  <p style="line-height: inherit">构建的顶部要连接到连接件的底部，构建的底部要连接到连接件的顶部，构建之间不允许直接连接</p>
 </li>
 <li>
  <p style="line-height: inherit">一个连接件可以和任意数目的其他构件和连接件连接。</p>
 </li>
 <li>
  <p style="line-height: inherit">当两个连接件进行直接连接时，必须由其中一个的底部到另一个的顶部。</p>
 </li>
</ul>
<h2 style="" id="%E5%B1%82%E6%AC%A1%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>层次架构风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ohgz.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-zzmw.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<h2 style="" id="mvc%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>MVC架构风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-canh.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<ul>
 <li>
  <p style="line-height: inherit">Model 是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。</p>
 </li>
 <li>
  <p style="line-height: inherit">View 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。</p>
 </li>
 <li>
  <p style="line-height: inherit">Controller 是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据，控制用户输入，并向模型发送数据。</p>
 </li>
</ul>
<h2 style="" id="mvp%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>MVP架构风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-yxyv.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<ul>
 <li>
  <p style="line-height: inherit">MVP是MVC的变种</p>
 </li>
 <li>
  <p style="line-height: inherit">MVP实现了V与M之间的解耦（V不直接使用M，修改V不会影响M）</p>
 </li>
 <li>
  <p style="line-height: inherit">MVP更好的支持单元测试（业务逻辑在P中，可以脱离V来测试这些逻辑，可以将一个P用于多个V，而不需要改变P的逻辑）</p>
 </li>
 <li>
  <p style="line-height: inherit">MVP中V要处理界面事件，业务逻辑在P中，MVC中界面事件由C处理</p>
 </li>
</ul>
<h2 style="" id="mvvm%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>MVVM架构风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-nijd.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<h2 style="" id="ria%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>RIA架构风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-tuon.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<ul>
 <li>
  <p style="line-height: inherit">反应速度快</p>
 </li>
 <li>
  <p style="line-height: inherit">易于传播</p>
 </li>
 <li>
  <p style="line-height: inherit">交互性强</p>
 </li>
</ul>
<h2 style="" id="%E5%9F%BA%E4%BA%8E%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%9E%B6%E6%9E%84%EF%BC%88soa%EF%BC%89"><strong>基于服务的架构（SOA）</strong></h2>
<blockquote>
 <p style="line-height: inherit">服务是一种为了满足某项业务需求的操作、规则等的逻辑组合，它包含一系列有序活动的交互，为实现用户目标提供支持。</p>
</blockquote>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-uqkd.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-uncb.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<ul>
 <li>
  <p style="line-height: inherit">服务构件粗粒度，传统构件细粒度居多</p>
 </li>
 <li>
  <p style="line-height: inherit">服务构件的接口是标准的，主要是WSDL接口，传统构件常以具体API形式出现</p>
 </li>
 <li>
  <p style="line-height: inherit">服务构件的实现与语言无关，传统构件绑定某种特定语言</p>
 </li>
 <li>
  <p style="line-height: inherit">服务构件可以通过构件容器提供QoS的服务，传统构件完全由程序代码直接控制</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>SOA的实现方式——WebService</strong></p>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ledh.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<ul>
 <li>
  <p style="line-height: inherit">底层传输层</p>
 </li>
 <li>
  <p style="line-height: inherit">服务通信协议层</p>
 </li>
 <li>
  <p style="line-height: inherit">服务描述层</p>
 </li>
 <li>
  <p style="line-height: inherit">服务层</p>
 </li>
 <li>
  <p style="line-height: inherit">业务流程层</p>
 </li>
 <li>
  <p style="line-height: inherit">服务注册层</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>SOA的实现方式——ESB</strong></p>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-phrj.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit"><strong>服务请求者与服务提供者之间解耦</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">提供位置透明性的消息路由和寻址服务</p>
 </li>
 <li>
  <p style="line-height: inherit">提供服务注册和命名的管理功能</p>
 </li>
 <li>
  <p style="line-height: inherit">支持多种的消息传递范型</p>
 </li>
 <li>
  <p style="line-height: inherit">支持多种可以广泛使用的传出协议</p>
 </li>
 <li>
  <p style="line-height: inherit">支持多种数据格式及其相互转换</p>
 </li>
 <li>
  <p style="line-height: inherit">提供日志和监控功能</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>关键技术</strong></p>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 667px">
  <colgroup>
   <col style="width: 182px">
   <col style="width: 485px">
  </colgroup>
  <tbody>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <th colspan="1" rowspan="1" colwidth="182" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px;">
     <p style=""><strong>功能</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="485" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: center;">
     <p style=""><strong>协议</strong></p>
    </th>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="182" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">发现服务</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="485" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style=""><strong>UDDI</strong>、DISCO</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="182" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">描述服务</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="485" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style=""><strong>WSDL</strong>、XML Schema</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="182" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">消息格式层</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="485" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style=""><strong>SOAP、REST</strong></p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="182" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">编码格式层</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="485" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">XML（DOM，SAX）</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="182" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">传输协议层</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="485" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: center;">
     <p style="">HTTP、TCP/IP、SMTP等</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<h2 style="" id="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>微服务架构风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-umtk.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit"><strong>优点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">小服务【专注于一件事】</p>
 </li>
 <li>
  <p style="line-height: inherit">轻量级的通讯机制</p>
 </li>
 <li>
  <p style="line-height: inherit">松耦合</p>
 </li>
 <li>
  <p style="line-height: inherit">独立测试</p>
 </li>
 <li>
  <p style="line-height: inherit">独立部署【简单部署】</p>
 </li>
 <li>
  <p style="line-height: inherit">独立运行【每个服务独立在独立进程中】</p>
 </li>
 <li>
  <p style="line-height: inherit">支持异构【例如每个服务使用不同数据库】</p>
 </li>
 <li>
  <p style="line-height: inherit">更好的可用性与弹性</p>
 </li>
 <li>
  <p style="line-height: inherit">化整为零，易于小团队开发</p>
 </li>
</ul>
<p style="line-height: inherit"><strong>缺点</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">分布式环境下的数据一致性【更复杂】</p>
 </li>
 <li>
  <p style="line-height: inherit">测试的复杂性【服务间依赖测试】</p>
 </li>
 <li>
  <p style="line-height: inherit">运行的复杂性</p>
 </li>
</ul>
<h3 style="" id="%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%B8%8Esoa%E5%AF%B9%E6%AF%94"><strong>微服务与SOA对比</strong></h3>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 865px">
  <colgroup>
   <col style="width: 311px">
   <col style="width: 554px">
  </colgroup>
  <tbody>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <th colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px;">
     <p style=""><strong>微服务</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; font-weight: bold; border-width: 1px 1px 0px; border-style: solid solid none; border-color: rgb(223, 226, 229) rgb(223, 226, 229) currentcolor; border-image: none; margin: 0px; text-align: left;">
     <p style=""><strong>SOA</strong></p>
    </th>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">能拆分的就拆分</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">是整体的，服务能放在一起都放在一起</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">纵向业务划分</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">是水平分多层</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">由单一组织负责</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">按层级划分不同部门的组织负责</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">细粒度</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">粗粒度</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">两句话可以解释明白</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">几百字只相当于SOA的目录</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">独立的子公司</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">类似于大公司里面划分了一些业务单元（BU）</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">组件小</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">存在较复杂的组件</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px; background-color: rgb(248, 248, 248);">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">业务逻辑存在于每一个服务中</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">业务逻辑横跨多个业务领域</p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; break-inside: avoid; break-after: auto; border: 1px solid rgb(223, 226, 229); margin: 0px; padding: 0px;">
    <td colspan="1" rowspan="1" colwidth="311" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px;">
     <p style="">使用轻量级的通讯方式，如HTTP</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="554" style="box-sizing: border-box; --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); margin: 0px; min-width: 32px; text-align: left;">
     <p style="">企业服务产总线（ESB）充当了服务之间通讯的角色</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<h2 style="" id="%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>云原生架构风格</strong></h2>
<blockquote>
 <p style="line-height: inherit">【云原生】是基于分布部署和统一运管的分布式云，以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。</p>
</blockquote>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hioh.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-smcq.png&amp;size=m" width="60%" height="100%" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-iivz.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit"></p>
<p style="line-height: inherit"><strong>云原生架构设计原则</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">服务化原则</p>
 </li>
 <li>
  <p style="line-height: inherit">弹性原则</p>
 </li>
 <li>
  <p style="line-height: inherit">可观测原则</p>
 </li>
 <li>
  <p style="line-height: inherit">韧性原则</p>
 </li>
 <li>
  <p style="line-height: inherit">自动化原则</p>
 </li>
</ul>
<h2 style="" id="mda%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>MDA架构风格</strong></h2>
<p style="text-align: center; line-height: inherit"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-dopa.png&amp;size=m" width="60%" height="100%" style="display: inline-block"></p>
<p style="line-height: inherit"><strong>MDA的3种核心模型</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">平台独立模型（PIM）：具有高抽象层次、独立于任何实现技术的模型。</p>
 </li>
 <li>
  <p style="line-height: inherit">平台相关模型（PSM）：为某种特定实现技术量身定做，让你用这种技术中可用的实现构造来描述系统的模型。PIM会被变换成一个或多个PSM。</p>
 </li>
 <li>
  <p style="line-height: inherit">代码Code：用源代码对系统的描述（规约）。每个PSM都将被变换成代码。</p>
 </li>
</ul>
<h2 style="" id="adl%E6%9E%B6%E6%9E%84%E9%A3%8E%E6%A0%BC"><strong>ADL架构风格</strong></h2>
<blockquote>
 <p style="line-height: inherit"><strong>ADL是这样一种形式化语言</strong>，它在底层语义模型的支持下，为软件系统的概念体系结构建模提供了具体语法和概念框架。如：Aesop、MetaH、C2、Rapide、SADL、Unicon等。</p>
</blockquote>
<p style="line-height: inherit"><strong>ADL的三个基本元素</strong></p>
<ul>
 <li>
  <p style="line-height: inherit">构建：计算或数据存储单元、</p>
 </li>
 <li>
  <p style="line-height: inherit">连接件：用于构件之间交互建模的体系结构构造块及其支配这些交互的规则。</p>
 </li>
 <li>
  <p style="line-height: inherit">架构配置：描述体系结构的构件与连接件的连接图。</p>
 </li>
</ul>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/lXWWsS23</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fstacked-of-cube-buildings-at-daytime.jpg&amp;size=m" type="image/jpeg" length="124626"/><category>架构设计</category><pubDate>Tue, 11 Feb 2025 09:26:31 GMT</pubDate></item><item><title><![CDATA[最全Linux命令总结]]></title><link>https://jzy.cc/archives/M1YufWQJ</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E6%9C%80%E5%85%A8Linux%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93&amp;url=/archives/M1YufWQJ" width="1" height="1" alt="" style="opacity:0;">
<h3 style="" id="1%E3%80%81%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4">1、基本命令</h3>
<pre><code>uname -m 显示机器的处理器架构
uname -r 显示正在使用的内核版本
dmidecode -q 显示硬件系统部件
(SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息
arch 显示机器的处理器架构
uname -m 显示机器的处理器架构
uname -r 显示正在使用的内核版本
dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)
hdparm -i /dev/hda 罗列一个磁盘的架构特性
hdparm -tT /dev/sda 在磁盘上执行测试性读取操作
cat /proc/cpuinfo 显示CPU info的信息
cat /proc/interrupts 显示中断
cat /proc/meminfo 校验内存使用
cat /proc/swaps 显示哪些swap被使用
cat /proc/version 显示内核的版本
cat /proc/net/dev 显示网络适配器及统计
cat /proc/mounts 显示已加载的文件系统
lspci -tv 罗列 PCI 设备
lsusb -tv 显示 USB 设备
date 显示系统日期
cal 2007 显示2007年的日历表
date 041217002007.00 设置日期和时间 - 月日时分年.秒
clock -w 将时间修改保存到 BIOS</code></pre>
<h3 style="" id="2%E3%80%81%E5%85%B3%E6%9C%BA">2、关机</h3>
<pre><code>shutdown -h now 关闭系统(1)
init 0 关闭系统(2)
telinit 0 关闭系统(3)
shutdown -h hours:minutes &amp; 按预定时间关闭系统
shutdown -c 取消按预定时间关闭系统
shutdown -r now 重启(1)
reboot 重启(2)
logout 注销</code></pre>
<h3 style="" id="3%E3%80%81%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95">3、文件和目录</h3>
<pre><code>cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入个人的主目录
cd ~user1 进入个人的主目录
cd - 返回上次所在的目录
pwd 显示工作路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls *[0-9]* 显示包含数字的文件名和目录名
tree 显示文件和目录由根目录开始的树形结构(1)
lstree 显示文件和目录由根目录开始的树形结构(2)
mkdir dir1 创建一个叫做 'dir1' 的目录'
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树
rm -f file1 删除一个叫做 'file1' 的文件'
rmdir dir1 删除一个叫做 'dir1' 的目录'
rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . 复制一个目录到当前工作目录
cp -a dir1 dir2 复制一个目录
ln -s file1 lnk1 创建一个指向文件或目录的软链接
ln file1 lnk1 创建一个指向文件或目录的物理链接
touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm)
file file1 outputs the mime type of the file as text
iconv -l 列出已知的编码
iconv -f fromEncoding -t toEncoding inputFile &gt; outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)</code></pre>
<h3 style="" id="4%E3%80%81%E6%96%87%E4%BB%B6%E6%90%9C%E7%B4%A2">4、文件搜索</h3>
<pre><code>find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 'user1' 的文件和目录
find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件
find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件
find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限
find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件，忽略光驱、捷盘等可移动设备
locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令
whereis halt 显示一个二进制文件、源码或man的位置
which halt 显示一个二进制文件或可执行文件的完整路径</code></pre>
<h3 style="" id="5%E3%80%81%E6%8C%82%E8%BD%BD%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F">5、挂载一个文件系统</h3>
<pre><code>mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在
umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出
fuser -km /mnt/hda2 当设备繁忙时强制卸载
umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用
mount /dev/fd0 /mnt/floppy 挂载一个软盘
mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom
mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件
mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统
mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享</code></pre>
<h3 style="" id="6%E3%80%81%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4">6、磁盘空间</h3>
<pre><code>df -h 显示已经挂载的分区列表
ls -lSr |more 以尺寸大小排列文件和目录
du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间'
du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统)
dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统)</code></pre>
<hr>
<h3 style="" id="7%E3%80%81%E7%94%A8%E6%88%B7%E5%92%8C%E7%BE%A4%E7%BB%84">7、用户和群组</h3>
<pre><code>groupadd group_name 创建一个新用户组
groupdel group_name 删除一个用户组
groupmod -n new_group_name old_group_name 重命名一个用户组
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户
useradd user1 创建一个新用户
userdel -r user1 删除一个用户 ( '-r' 排除主目录)
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性
passwd 修改口令
passwd user1 修改一个用户的口令 (只允许root执行)
chage -E 2005-12-31 user1 设置用户口令的失效期限
pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户
grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组
newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组</code></pre>
<hr>
<h3 style="" id="8%E3%80%81%E6%96%87%E4%BB%B6%E7%9A%84%E6%9D%83%E9%99%90">8、文件的权限</h3>
<pre><code>ls -lh 显示权限
ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示
chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读（r ）、写(w)和执行(x)的权限
chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限
chown user1 file1 改变一个文件的所有人属性
chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性
chgrp group1 file1 改变文件的群组
chown user1:group1 file1 改变一个文件的所有人和群组属性
find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件
chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限
chmod u-s /bin/file1 禁用一个二进制文件的 SUID位
chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ，不过这是针对目录的
chmod g-s /home/public 禁用一个目录的 SGID 位
chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件
chmod o-t /home/public 禁用一个目录的 STIKY 位
chmod +x 文件路径 为所有者、所属组和其他用户添加执行的权限
chmod -x 文件路径 为所有者、所属组和其他用户删除执行的权限
chmod u+x 文件路径 为所有者添加执行的权限
chmod g+x 文件路径 为所属组添加执行的权限
chmod o+x 文件路径 为其他用户添加执行的权限
chmod ug+x 文件路径 为所有者、所属组添加执行的权限
chmod =wx 文件路径 为所有者、所属组和其他用户添加写、执行的权限，取消读权限
chmod ug=wx 文件路径 为所有者、所属组添加写、执行的权限，取消读权限</code></pre>
<h3 style="" id="9%E3%80%81%E6%96%87%E4%BB%B6%E7%9A%84%E7%89%B9%E6%AE%8A%E5%B1%9E%E6%80%A7">9、文件的特殊属性</h3>
<blockquote>
 <p style="line-height: inherit">使用 “+” 设置权限，使用 “-” 用于取消</p>
</blockquote>
<pre><code>chattr +a file1 只允许以追加方式读写文件
chattr +c file1 允许这个文件能被内核自动压缩/解压
chattr +d file1 在进行文件系统备份时，dump程序将忽略这个文件
chattr +i file1 设置成不可变的文件，不能被删除、修改、重命名或者链接
chattr +s file1 允许一个文件被安全地删除
chattr +S file1 一旦应用程序对这个文件执行了写操作，使系统立刻把修改的结果写到磁盘
chattr +u file1 若文件被删除，系统会允许你在以后恢复这个被删除的文件
lsattr 显示特殊的属性</code></pre>
<h3 style="" id="10%E3%80%81%E6%89%93%E5%8C%85%E5%92%8C%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6">10、打包和压缩文件</h3>
<pre><code>bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件
bzip2 file1 压缩一个叫做 'file1' 的文件
gunzip file1.gz 解压一个叫做 'file1.gz'的文件
gzip file1 压缩一个叫做 'file1'的文件
gzip -9 file1 最大程度压缩
rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包
rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1'
rar x file1.rar 解压rar包
unrar x file1.rar 解压rar包
tar -cvf archive.tar file1 创建一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
tar -tf archive.tar 显示一个包中的内容
tar -xvf archive.tar 释放一个包
tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下
tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包
tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包
tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包
zip file1.zip file1 创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip 解压一个zip格式压缩包</code></pre>
<h3 style="" id="11%E3%80%81rpm-%E5%8C%85">11、RPM 包</h3>
<ul>
 <li>
  <p style="line-height: inherit">（Fedora, Redhat及类似系统）</p>
 </li>
</ul>
<pre><code>rpm -ivh package.rpm 安装一个rpm包
rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告
rpm -U package.rpm 更新一个rpm包但不改变其配置文件
rpm -F package.rpm 更新一个确定已经安装的rpm包
rpm -e package_name.rpm 删除一个rpm包
rpm -qa 显示系统中所有已经安装的rpm包
rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包
rpm -qi package_name 获取一个已安装包的特殊信息
rpm -qg "System Environment/Daemons" 显示一个组件的rpm包
rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表
rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表
rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表
rpm -q package_name --whatprovides 显示一个rpm包所占的体积
rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l
rpm -q package_name --changelog 显示一个rpm包的修改历史
rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供
rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表
rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书
rpm --checksig package.rpm 确认一个rpm包的完整性
rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性
rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间
rpm -Va 检查系统中所有已安装的rpm包- 小心使用
rpm -Vp package.rpm 确认一个rpm包还未安装
rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包
rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包</code></pre>
<h3 style="" id="12%E3%80%81yum-%E8%BD%AF%E4%BB%B6%E5%8C%85%E5%8D%87%E7%BA%A7%E5%99%A8">12、YUM 软件包升级器</h3>
<ul>
 <li>
  <p style="line-height: inherit">（Fedora, RedHat及类似系统）</p>
 </li>
</ul>
<pre><code>yum install package_name 下载并安装一个rpm包
yum localinstall package_name.rpm 将安装一个rpm包，使用你自己的软件仓库为你解决所有依赖关系
yum update package_name.rpm 更新当前系统中所有安装的rpm包
yum update package_name 更新一个rpm包
yum remove package_name 删除一个rpm包
yum list 列出当前系统中安装的所有包
yum search package_name 在rpm仓库中搜寻软件包
yum clean packages 清理rpm缓存删除下载的包
yum clean headers 删除所有头文件
yum clean all 删除所有缓存的包和头文件</code></pre>
<h3 style="" id="13%E3%80%81deb-%E5%8C%85">13、DEB 包</h3>
<p style="line-height: inherit">(Debian, Ubuntu 以及类似系统)</p>
<pre><code>dpkg -i package.deb 安装/更新一个 deb 包
dpkg -r package_name 从系统删除一个 deb 包
dpkg -l 显示系统中所有已经安装的 deb 包
dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包
dpkg -s package_name 获得已经安装在系统中一个特殊包的信息
dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表
dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表
dpkg -S /bin/ping 确认所给的文件由哪个deb包提供
APT 软件工具 (Debian, Ubuntu 以及类似系统)
apt-get install package_name 安装/更新一个 deb 包
apt-cdrom install package_name 从光盘安装/更新一个 deb 包
apt-get update 升级列表中的软件包
apt-get upgrade 升级所有已安装的软件
apt-get remove package_name 从系统删除一个deb包
apt-get check 确认依赖的软件仓库正确
apt-get clean 从下载的软件包中清理缓存
apt-cache search searched-package 返回包含所要搜索字符串的软件包名称</code></pre>
<h3 style="" id="14%E3%80%81%E6%9F%A5%E7%9C%8B%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9">14、查看文件内容</h3>
<pre><code>cat file1 从第一个字节开始正向查看文件的内容
tac file1 从最后一行开始反向查看一个文件的内容
more file1 查看一个长文件的内容
less file1 类似于 'more' 命令，但是它允许在文件中和正向操作一样的反向操作
head -2 file1 查看一个文件的前两行
tail -2 file1 查看一个文件的最后两行
tail -f /var/log/messages 实时查看被添加到一个文件中的内容</code></pre>
<hr>
<h3 style="" id="15%E3%80%81%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86">15、文本处理</h3>
<pre><code>cat file1 file2 ... | command &lt;&gt; file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc...) &gt; result.txt 合并一个文件的详细说明文本，并将简介写入一个新文件中
cat file1 | command( sed, grep, awk, grep, etc...) &gt;&gt; result.txt 合并一个文件的详细说明文本，并将简介写入一个已有的文件中
grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug"
grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇
grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行
grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug"
sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2"
sed '/^$/d' example.txt 从example.txt文件中删除所有空白行
sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行
echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容
sed -e '1d' result.txt 从文件example.txt 中排除第一行
sed -n '/stringa1/p' 查看只包含词汇 "string1"的行
sed -e 's/ *$//' example.txt 删除每一行最后的空白字符
sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部
sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容
sed -n '5p;5q' example.txt 查看第5行
sed -e 's/00*/0/g' example.txt 用单个零替换多个零
cat -n file1 标示文件的行数
cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行
echo a b c | awk '{print $1}' 查看一行第一栏
echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏
paste file1 file2 合并两个文件或两栏的内容
paste -d '+' file1 file2 合并两个文件或两栏的内容，中间用"+"区分
sort file1 file2 排序两个文件的内容
sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u 删除交集，留下其他的行
sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容
comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容
comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分</code></pre>
<h3 style="" id="16%E3%80%81%E5%AD%97%E7%AC%A6%E8%AE%BE%E7%BD%AE%E5%92%8C%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2">16、字符设置和文件格式转换</h3>
<pre><code>dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX
unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS
recode ..HTML &lt; page.txt &gt; page.html 将一个文本文件转换成html
recode -l | more 显示所有允许的转换格式</code></pre>
<hr>
<h3 style="" id="17%E3%80%81%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%88%86%E6%9E%90">17、文件系统分析</h3>
<pre><code>badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块
fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性
fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性
fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性</code></pre>
<h3 style="" id="18%E3%80%81%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F">18、初始化一个文件系统</h3>
<pre><code>mkfs /dev/hda1 在hda1分区创建一个文件系统
mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统
mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统
mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统
fdformat -n /dev/fd0 格式化一个软盘
mkswap /dev/hda3 创建一个swap文件系统</code></pre>
<h3 style="" id="19%E3%80%81swap%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F">19、SWAP文件系统</h3>
<pre><code>mkswap /dev/hda3 创建一个swap文件系统
swapon /dev/hda3 启用一个新的swap文件系统
swapon /dev/hda2 /dev/hdb3 启用两个swap分区</code></pre>
<h3 style="" id="20%E3%80%81%E5%A4%87%E4%BB%BD">20、备份</h3>
<pre><code>dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份
dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份
restore -if /tmp/home0.bak 还原一个交互式备份
rsync -rogpav --delete /home /tmp 同步两边的目录
rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync
rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录
rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作
dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件
tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作
( cd /tmp/local/ &amp;&amp; tar c . ) | ssh -C user@ip_addr 'cd /home/share/ &amp;&amp; tar x -p' 通过ssh在远程目录中复制一个目录内容
( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home &amp;&amp; tar x -p' 通过ssh在远程目录中复制一个本地目录
tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方，保留原有权限及链接
find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录
find /var/log -name '*.log' | tar cv --files-from=- | bzip2 &gt; log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容</code></pre>
<h3 style="" id="21%E3%80%81%E5%85%89%E7%9B%98">21、光盘</h3>
<pre><code>cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容
mkisofs /dev/cdrom &gt; cd.iso 在磁盘上创建一个光盘的iso镜像文件
mkisofs /dev/cdrom | gzip &gt; cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件
mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件
cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件
gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件
mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件
cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中
cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中（参数-3）
cdrecord --scanbus 扫描总线以识别scsi通道
dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码，例如一张 CD</code></pre>
<h3 style="" id="22%E3%80%81%E7%BD%91%E7%BB%9C">22、网络</h3>
<ul>
 <li>
  <p style="line-height: inherit">（以太网和WIFI无线）</p>
 </li>
</ul>
<pre><code>ifconfig eth0 显示一个以太网卡的配置
ifup eth0 启用一个 'eth0' 网络设备
ifdown eth0 禁用一个 'eth0' 网络设备
ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址
ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing)
dhclient eth0 以dhcp模式启用 'eth0'
route -n show routing table
route add -net 0/0 gw IP_Gateway configura default gateway
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16'
route del 0/0 gw IP_gateway remove static route
echo "1" &gt; /proc/sys/net/ipv4/ip_forward activate ip routing
hostname show hostname of system
host www.example.com lookup hostname to resolve name to ip address and viceversa(1)
nslookup www.example.com lookup hostname to resolve name to ip address and viceversa(2)
ip link show show link status of all interfaces
mii-tool eth0 show link status of 'eth0'
ethtool eth0 show statistics of network card 'eth0'
netstat -tup show all active network connections and their PID
netstat -tupl show all network services listening on the system and their PID
tcpdump tcp port 80 show all HTTP traffic
iwlist scan show wireless networks
iwconfig eth1 show configuration of a wireless network card
hostname show hostname
host www.example.com lookup hostname to resolve name to ip address and viceversa
nslookup www.example.com lookup hostname to resolve name to ip address and viceversa
whois www.example.com lookup on Whois database</code></pre>
<h3 style="" id="23%E3%80%81%E5%88%97%E5%87%BA%E7%9B%AE%E5%BD%95%E5%86%85%E5%AE%B9">23、列出目录内容</h3>
<pre><code>ls -a：显示所有文件（包括隐藏文件）；
ls -l：显示详细信息；
ls -R：递归显示子目录结构；
ls -ld：显示目录和链接信息；
ctrl+r：历史记录中所搜命令（输入命令中的任意一个字符）；
Linux中以.开头的文件是隐藏文件；
pwd:显示当前目录</code></pre>
<h3 style="" id="24%E3%80%81%E6%9F%A5%E7%9C%8B%E6%96%87%E4%BB%B6%E7%9A%84%E7%B1%BB%E5%9E%8B">24、查看文件的类型</h3>
<pre><code>file:查看文件的类型</code></pre>
<h3 style="" id="25%E3%80%81%E5%A4%8D%E5%88%B6%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%E7%AD%89%E6%93%8D%E4%BD%9C">25、复制文件目录等操作</h3>
<pre><code>1、cp：复制文件和目录 cp源文件（文件夹）目标文件（文件夹）
常用参数：-r:递归复制整个目录树；-v：显示详细信息；复制文件夹时要在cp命令后面加一个-r参数：如：cp -r 源文件夹 目标文件夹
2、touch+文件名：当文件不存在的时候，创建相应的文件；当文件存在的时候，修改文件的创建时间。欢迎关注我们，公号终码一生。功能：生成一个空文件或修改文件的存取/修改的时间记录值。touch * ：将当前下的文件时间修改为系统的当前时间
touch –d 20040210 test：将test文件的日期改为20040210
touch abc ：若abc文件存在，则修改为系统的当前时间；若不存在，则生成一个为当前时间的空文件
3、mv 文件 目标目录：移动或重命名文件或目录（如果指定文件名，则可以重命名文件）。可以将文件及目录移到另一目录下，或更改文件及目录的名称。格式为：mv [参数]&lt;源文件或目录&gt; &lt;目标文件或目录&gt;
mva.txt ../：将a.txt文件移动上层目录
mv a.txt b.txt：将a.txt改名为b.txt
mvdir2 ../：将dir2目录上移一层
4、rm：删除文件；常用参数：-i：交互式 -r：递归的删除包括目录中的所有内容
5、mkdir +文件夹名称：创建文件夹；6、rm -r +文件夹名称：删除文件夹（空文件夹和非空文件夹都可删除）
rmdir 文件夹名称：删除文件夹（只能删除空文件夹）
7、mkdir -p dir1/dir2 ：在当前目录下创建dir1目录，并在dir1目录下创建dir2目录， 也就是连续创建两个目录（dir1/和dir1/dir2）
8、rmdir –p dir1/dir2：删除dir1下的dir2目录，若dir1目录为空也删除它
9、rm * ：删除当前目录下的所有文件
10、-f参数：强迫删除文件 rm –f *.txt：强迫删除所有以后缀名为txt文件
11、-i参数：删除文件时询问
rm –i * ：删除当前目录下的所有文件会有如下提示：rm:backup:is a directory 遇到目录会略过
rm: remove ‘myfiles.txt’ ? Y
删除文件时会询问,可按Y或N键表示允许或拒绝删除文件 
12、-r参数：递归删除（连子目录一同删除，这是一个相当常用的参数）
rm -r test ：删除test目录（含test目录下所有文件和子目录）
rm -r *：删除所有文件（含当前目录所有文件、所有子目录和子目录下的文件） 一般在删除目录时r和f一起用，避免麻烦
rm -rf test ：强行删除、不加询问
13、grep：功能：在文件中搜索匹配的字符并进行输出
格式：grep[参数] &lt;要找的字串&gt; &lt;要寻找字 串的源文件&gt;
greplinux test.txt：搜索test.txt文件中字符串linux并输出
14、ln命令
功能：在文件和目录之间建立链接
格式：ln [参数] &lt;源文件或目录&gt; &lt;目标文件或目录&gt;
链接分“软链接”和“硬链接”
1.软链接:
ln–s /usr/share/do doc ：创建一个链接文件doc,并指向目录/usr/share/do
2.硬链接:
ln /usr/share/test hard：创建一个硬链接文件hard，这时对于test文件对应 的存储区域来说，又多了一个文件指向它</code></pre>
<h3 style="" id="26%E3%80%81%E7%B3%BB%E7%BB%9F%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4">26、系统常用命令</h3>
<h4 style="" id="1%E3%80%81%E6%98%BE%E7%A4%BA%E5%91%BD%E4%BB%A4">1、显示命令</h4>
<pre><code>date:查看或设置当前系统的时间：格式化显示时间：+%Y--%m--%d；date -s:设置当前系统的时间
hwclock(clock)：显示硬件时钟时间(需要管理员权限)；cal：查看日历
格式cal [参数] 月年
cal：显示当月的日历 cal4 2004 ：显示2004年4月的日历
cal- y 2003：显示2003年的日历
uptime：查看系统运行时间</code></pre>
<h4 style="" id="2%E3%80%81%E8%BE%93%E5%87%BA%E6%9F%A5%E7%9C%8B%E5%91%BD%E4%BB%A4">2、输出查看命令</h4>
<pre><code>echo：显示输入的内容 追加文件echo "liuyazhuang" &gt;&gt; liuyazhuang.txt
cat：显示文件内容,也可以将数个文件合并成一个文件。格式：格式：cat[参数]&lt;文件名&gt;
cat test.txt：显示test.txt文件内容
cat test.txt | more ：逐页显示test.txt文件中的内容
cat test.txt &gt;&gt; test1.txt ：将test.txt的内容附加到test1.txt文件之后
cat test.txt test2.txt &gt;readme.txt : 将test.txt和test2.txt文件合并成readme.txt 文件
head:显示文件的头几行（默认10行） -n:指定显示的行数格式：head -n 文件名
tail：显示文件的末尾几行（默认10行）-n：指定显示的行数 -f：追踪显示文件更新 （一般用于查看日志，命令不会退出，而是持续显示新加入的内容）
格式：格式：tail[参数]&lt;文件名&gt;
tail-10 /etc/passwd ：显示/etc/passwd/文件的倒数10行内容
tail+10 /etc/passwd ：显示/etc/passwd/文件从第10行开始到末尾的内容
more：用于翻页显示文件内容（只能向下翻页）
more命令是一般用于要显示的内容会超过一个画面长度的情况。为了避免画 面显示时瞬间就闪过去，用户可以使用more命令，让画面在显示满一页时暂停，此时可按空格健继续显示下一个画面，或按Q键停止显示。ls -al |more：以长格形式显示etc目录下的文件列表，显示满一个画面便暂停，可 按空格键继续显示下一画面，或按Q键跳离
less：翻页显示文件内容（带上下翻页）按下上键分页，按q退出、‘
less命令的用法与more命令类似，也可以用来浏览超过一页的文件。所不同 的是less 命令除了可以按空格键向下显示文件外，还可以利用上下键来卷动文件。当要结束浏览时，只要在less命令的提示符“：”下按Q键即可。ls -al | less：以长格形式列出/etc目录中所有的内容。用户可按上下键浏览或按Q键跳离</code></pre>
<h4 style="" id="3%E3%80%81%E6%9F%A5%E7%9C%8B%E7%A1%AC%E4%BB%B6%E4%BF%A1%E6%81%AF">3、查看硬件信息</h4>
<pre><code>Ispci：查看PCI设备 -v：查看详细信息
Isusb：查看USB设备 -v：查看详细信息
Ismod：查看加载的模块(驱动)</code></pre>
<h4 style="" id="4%E3%80%81%E5%BD%92%E6%A1%A3%E3%80%81%E5%8E%8B%E7%BC%A9">4、归档、压缩</h4>
<pre><code>zip:压缩文件 zip liuyazhuang.zip myfile 格式为：“zip 压缩后的zip文件文件名”
unzip：解压文件 unzip liuyazhuang.zip
gzip：压缩文件 gzip 文件名
tar：归档文件
tar -cvf out.tar liuyazhuang 打包一个归档（将文件"liuyazhuang"打包成一个归档）
tar -xvf liuyazhuang.tar 释放一个归档（释放liuyazhuang.tar归档）
tar -cvzf backup.tar.gz/etc 
-z参数将归档后的归档文件进行gzip压缩以减少大小。-c：创建一个新tar文件
-v：显示运行过程的信息
-f：指定文件名
-z：调用gzip压缩命令进行压缩
-t：查看压缩文件的内容
-x：解开tar文件
tar -cvf test.tar *：将所有文件打包成test.tar,扩展名.tar需自行加上
tar -zcvf test.tar.gz *：将所有文件打包成test.tar,再用gzip命令压缩
tar -tf test.tar ：查看test.tar文件中包括了哪些文件
tar -xvf test.tar 将test.tar解开
tar -zxvf foo.tar.gz 解压缩
gzip各gunzip命令
gziptest.txt ：压缩文件时，不需要任何参数
gizp–l test.txt.gz：显示压缩率</code></pre>
<h4 style="" id="5%E3%80%81%E6%9F%A5%E6%89%BE">5、查找</h4>
<pre><code>locate：快速查找文件、文件夹：locate keyword
此命令需要预先建立数据库，数据库默认每天更新一次，可用updatedb命令手工建立、更新数据库。欢迎关注我们，公号终码一生。find查找位置查找参数
如：find . -name *liuyazhuang* 查找当前目录下名称中含有"liuyazhuang"的文件
find / -name *.conf 查找根目录下（整个硬盘）下后缀为.conf的文件
find / -perm 777 查找所有权限是777的文件
find / -type d 返回根目录下所有的目录
find . -name "a*"-exec ls -l {} \;
find功能：用来寻找文件或目录。格式：find [&lt;路径&gt;] [匹配条件]
find / -name httpd.conf 搜索系统根目录下名为httpd.conf的文件
7、ctrl+c :终止当前的命令
8、who或w命令
功能：查看当前系统中有哪些用户登录
格式：who/w[参数]
9、dmesg命令 功能：显示系统诊断信息、操作系统版本号、物理内存的大小以及其它信息
10、df命令 功能：用于查看文件系统的各个分区的占用情况
11、du命令
功能：查看某个目录中各级子目录所使用的硬盘空间数
格式：du [参数] &lt;目录名&gt;
12、free命令
功能：用于查看系统内存，虚拟内存（交换空间）的大小占用情况</code></pre>
<h3 style="" id="27%E3%80%81vim">27、VIM</h3>
<p style="line-height: inherit">VIM 是一款功能强大的命令行文本编辑器，在 Linux 中通过 vim 命令可以启动 vim编辑器。</p>
<p style="line-height: inherit">一般使用 vim + 目标文件路径的形式使用vim。</p>
<p style="line-height: inherit">如果目标文件存在，则 vim 打开目标文件，如果目标文件不存在，则 vim 新建并打开该文件。</p>
<pre><code>:q：退出vim编辑器</code></pre>
<h4 style="" id="vim%E6%A8%A1%E5%BC%8F">VIM模式</h4>
<h5 style="" id="vim%E6%8B%A5%E6%9C%89%E4%B8%89%E7%A7%8D%E6%A8%A1%E5%BC%8F%EF%BC%9A">vim拥有三种模式：</h5>
<h6 style="" id="%EF%BC%881%EF%BC%89%E5%91%BD%E4%BB%A4%E6%A8%A1%E5%BC%8F%EF%BC%88%E5%B8%B8%E8%A7%84%E6%A8%A1%E5%BC%8F%EF%BC%89">（1）命令模式（常规模式）</h6>
<p style="line-height: inherit">vim启动后，默认进入命令模式，任何模式都可以通过esc键回到命令模式（可以多按几次），命令模式下可以键入不同的命令完成选择、复制、粘贴、撤销等操作。</p>
<p style="line-height: inherit">命名模式常用命令如下：</p>
<ul>
 <li>
  <p style="line-height: inherit">i：在光标前插入文本；</p>
 </li>
 <li>
  <p style="line-height: inherit">o：在当前行的下面插入新行；</p>
 </li>
 <li>
  <p style="line-height: inherit">dd：删除整行；</p>
 </li>
 <li>
  <p style="line-height: inherit">yy：将当前行的内容放入缓冲区（复制当前行）</p>
 </li>
 <li>
  <p style="line-height: inherit">n+yy：将n行的内容放入缓冲区（复制n行）</p>
 </li>
 <li>
  <p style="line-height: inherit">p：将缓冲区中的文本放入光标后（粘贴）</p>
 </li>
 <li>
  <p style="line-height: inherit">u：撤销上一个操作</p>
 </li>
 <li>
  <p style="line-height: inherit">r：替换当前字符</p>
 </li>
 <li>
  <p style="line-height: inherit">/：查找关键字</p>
 </li>
</ul>
<h6 style="" id="%EF%BC%882%EF%BC%89%E6%8F%92%E5%85%A5%E6%A8%A1%E5%BC%8F">（2）插入模式</h6>
<p style="line-height: inherit">在命令模式下按 “ i “键，即可进入插入模式，在插入模式可以输入编辑文本内容，使用esc键可以返回命令模式。</p>
<h6 style="" id="%EF%BC%883%EF%BC%89ex%E6%A8%A1%E5%BC%8F">（3）ex模式</h6>
<p style="line-height: inherit">在命令模式中按” : “键可以进入ex模式，光标会移动到底部，在这里可以保存修改或退出vim。</p>
<p style="line-height: inherit">ex模式常用命令如下：</p>
<ul>
 <li>
  <p style="line-height: inherit">:w 保存当前的修改</p>
 </li>
 <li>
  <p style="line-height: inherit">:q 退出</p>
 </li>
 <li>
  <p style="line-height: inherit">:wq! 强制退出，保存修改</p>
 </li>
 <li>
  <p style="line-height: inherit">:x 保存并退出，相当于:wq</p>
 </li>
 <li>
  <p style="line-height: inherit">:set number 显示行号</p>
 </li>
 <li>
  <p style="line-height: inherit">:! 系统命令 执行一个系统命令并显示结果</p>
 </li>
 <li>
  <p style="line-height: inherit">:sh 切换到命令行，使用ctrl+d切换回vim</p>
 </li>
</ul>
<h3 style="" id="28%E3%80%81%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%AE%A1%E7%90%86%E5%91%BD%E4%BB%A4(rpm)">28、软件包管理命令(RPM)</h3>
<h4 style="" id="1%E3%80%81%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%9A%84%E5%AE%89%E8%A3%85">1、软件包的安装</h4>
<p style="line-height: inherit">使用RPM命令的安装模式可以将软件包内所有的组件放到系统中的正确路径，安装软件包的命令是：rpm –ivh wu-ftpd-2.6.2-8.i386.rpm</p>
<p style="line-height: inherit">i：作用rpm的安装模式，v: 校验文件信息，h: 以＃号显示安装进度。</p>
<h4 style="" id="2%E3%80%81%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%9A%84%E5%88%A0%E9%99%A4">2、软件包的删除</h4>
<p style="line-height: inherit">删除模式会将指定软件包的内容全部删除，但并不包括已更改过的配置文件，删除RPM软件包的命令如下：rpm -e wu-ftpd</p>
<p style="line-height: inherit">注意：这里必须使用软件名“wu-ftpd”或”wu-ftpd-2.6.2-8而不是使用当初安装时的软件包名.wu-ftpd-2.6.2-8.i386.rpm</p>
<h4 style="" id="3%E3%80%81%E8%BD%AF%E4%BB%B6%E5%8C%85%E5%8D%87%E7%BA%A7">3、软件包升级</h4>
<p style="line-height: inherit">升级模式会安装用户所指定的更新版本，并删除已安装在系统中的相同软件包，升级软件包命令如下：rpm -Uvh wu-ftpd-2.6.2-8.i386.rpm -Uvh：升级参数</p>
<h4 style="" id="4%E3%80%81%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%9B%B4%E6%96%B0">4、软件包更新</h4>
<p style="line-height: inherit">更新模式下，rpm命令会检查在命令行中所指定的软件包是否比系统中原有的软件 包更新。如果情况属实，rpm命令会自动更新指定的软件包；反之，若系统中并没有指定软件包的较旧版本，rpm命令并不会安装此软件包。而在升级模式下，不管系统中是否有较旧的版本，rpm命令都会安装指定的软件包。</p>
<pre><code>rpm –Fvhwu-ftpd-2.6.2-8.i386.rpm -Fvh：更新参数</code></pre>
<h4 style="" id="5%E3%80%81%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%9F%A5%E8%AF%A2">5、软件包查询</h4>
<p style="line-height: inherit">若要获取RPM软件包的相关信息，可以使用查询模式。使用-q参数可查询一个已 安装的软件包的内容</p>
<pre><code>rpm –q wu-ftpd</code></pre>
<h4 style="" id="6%E3%80%81%E6%9F%A5%E8%AF%A2%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%89%80%E5%AE%89%E8%A3%85%E7%9A%84%E4%BD%8D%E7%BD%AE%EF%BC%9Arpm-%E2%80%93ql-package-name">6、查询软件包所安装的位置：rpm –ql package-name</h4>
<pre><code>rpm –ql xv (l参数：显示文件列表)</code></pre>
<p style="">
 <br>
</p>]]></description><guid isPermaLink="false">/archives/M1YufWQJ</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1714846201700-35b42d937158%3Fixid%3DM3w2NzIxMjF8MHwxfHNlYXJjaHw1NXx8bGludXglMjB0ZXh0fGVufDB8fHx8MTczNTI3MzIzMHww%26ixlib%3Drb-4.0.3&amp;size=m" type="image/jpeg" length="5272568"/><category>Linux</category><pubDate>Fri, 27 Dec 2024 04:20:53 GMT</pubDate></item><item><title><![CDATA[处理Android证书链的问题]]></title><link>https://jzy.cc/archives/F1wfbVDw</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E5%A4%84%E7%90%86Android%E8%AF%81%E4%B9%A6%E9%93%BE%E7%9A%84%E9%97%AE%E9%A2%98&amp;url=/archives/F1wfbVDw" width="1" height="1" alt="" style="opacity:0;">
<p style=""><span fontsize="" color="">在编写移动端应用的时候，我们常常会使用RESTful形式的API作为数据服务来使用，这就意味着数据服务端是基于HTTP的。随着近些年对于HTTP安全的越发重视，HTTPS越来越在更加广泛的范围内被推荐。但是TLS加密使用的证书这个东西，其实并不复杂，我们甚至在本地通过一些工具就可以生成一个供使用。这就带来了一个SSL证书使用时的一个安全问题：如何确保通讯过程中使用的SSL证书是安全的？</span></p>
<h2 style="" id="%E8%AF%81%E4%B9%A6%E9%93%BE"><span fontsize="" color=""><strong>证书链</strong></span></h2>
<p style="line-height: inherit"><span fontsize="" color="">在HTTPS通讯过程中，服务器会向客户端提供一个CA证书（Certificate Authority）用来向客户端表明自己的身份。客户端可以通过验证这个证书的有效性来确认服务器的身份，从而达到保证通讯安全的目的。这个CA证书就是我们常说的SSL证书。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">但是这里就有一个问题了，客户端是怎么确定服务器提供的这个CA证书是有效的？</span></p>
<p style="line-height: inherit"><span fontsize="" color="">服务器所提供的CA证书实际上是由其他第三方机构颁发的，相当于第三方担保。举个例子，这个第三方机构就相当于公证处，它向你要见的人（路人甲）提供了一张证明，来证明他的身份；你并不认识这个路人甲，所以并不相信他，但是你信任这个提供身份证明的公证处，所以你也就相信了你所见到的这个人就是路人甲。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">这个例子看起来比较容易懂，因为在现实生活中，公证处往往是具有一定权威性的，所以不太容易产生一些其他的疑虑。但是在互联网上，就会出现一个质疑溯源的问题，那就是，我作为客户端，怎么确定颁发CA证书的第三方机构也是可信的？</span></p>
<p style="line-height: inherit"><span fontsize="" color="">要解决这个问题，实际上跟最开始的解决方案一样，再找一个机构来证明就好了。也就是这个新的机构在证明之前颁发CA证书的那个机构的可信度。这就已经开始形成一个只有两个环节的链条了，但是由于这种质疑溯源的存在，这个链条必然会无穷无尽的循环下去，形成一个非常长的链条。这个链条实际上就是由各个认证机构颁发的证书形成的，上面一级的机构签发下面一级机构的CA证书，所以这也就可以称为证书链，在很多情况下也常常称为受信证书锚点（Trust Anchor）。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">但是在实际生活中，这个证书链并不是无穷无尽的。证书链的尽头就是根证书。根证书全称是根CA证书，是最顶级的证书颁发机构，这些机构也是被广泛信任的，它们的主要职责就是向其他的机构颁发和管理证书。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">所以在进行HTTPS通讯的时候，客户端会根据服务器提供的CA证书，根据其中的签发信息，沿着证书链一直验证到根证书。能够完成整条证书链验证的CA证书，才是一个有效的CA证书。而且在Windows、Linux、macOS等操作系统中，实际也已经提前预装了一些根证书颁发机构的根证书，这样客户端就可以根据这些预装的根证书来验证服务器提供的CA证书了。</span></p>
<h2 style="" id="%E5%9C%A8android%E5%BC%80%E5%8F%91%E4%B8%AD%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98"><span fontsize="" color=""><strong>在Android开发中遇到的问题</strong></span></h2>
<p style="line-height: inherit"><span fontsize="" color="">其实我在完成Android开发过程中遇到的问题其实非常具有误导性。我的Android应用是使用React Native开发的，其中有一些功能需要访问RESTful形式的数据服务，所以也就需要使用</span><code>fetch</code><span fontsize="" color="">来完成基于HTTP的访问功能。为了方便调试，我将数据服务通过FRP映射到了用于开发的域名上，并且启用了HTTPS。然后在Android模拟器中运行的时候，</span><code>fetch</code><span fontsize="" color="">函数就报出了一个令人莫名其妙的</span><code>Network request failed</code><span fontsize="" color="">错误。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">这个错误乍一看起来像是模拟器的网络不可用，而且模拟器上的Wifi和移动网络上的确也是挂着一个</span><code>!</code><span fontsize="" color="">标记。既然存在错误使设计功能不能正常运行，那么就需要研究一下了。</span></p>
<h3 style="" id="%E7%A1%AE%E5%AE%9A%E7%BD%91%E7%BB%9C%E9%97%AE%E9%A2%98"><span fontsize="" color=""><strong>确定网络问题</strong></span></h3>
<p style="line-height: inherit"><span fontsize="" color="">经过在网络上的搜索，很多答案都集中到了模拟器的DNS设置上。因为模拟器的DNS始终展现为</span><code>10.0.2.3</code><span fontsize="" color="">，无法确定其是不是存在问题，所以只能通过</span><code>adb shell</code><span fontsize="" color="">来确认一下。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">为了避免可能存在的问题，我在启动模拟器的时候就已经使用</span><code>-dns-server "114.114.114.114,8.8.8.8"</code><span fontsize="" color="">的参数为模拟器设置了DNS服务器，从院里上来说，如果这时在Shell里PING一些Ineternet上的网站，应该是没有问题的。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">为了简化问题的排查，我直接选择了PING数据服务所在的域名。结果毫无疑问，网络是通畅的，不存在网络链路上的问题。</span></p>
<h3 style="" id="%E7%A1%AE%E5%AE%9A%E4%B8%AD%E9%97%B4%E4%BB%B6%E9%97%AE%E9%A2%98"><span fontsize="" color=""><strong>确定中间件问题</strong></span></h3>
<p style="line-height: inherit"><span fontsize="" color="">既然不是网络本身的问题，那么问题就集中在应用本身或者系统上了。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">首先考虑的是应用中用来完成数据服务访问的是</span><code>fetch</code><span fontsize="" color="">，不是其他项目中常见的</span><code>axios</code><span fontsize="" color="">。所以更换一下数据访问的支持库来确定一下是否</span><code>fetch</code><span fontsize="" color="">在功能和实现上与其他项目中反映没有问题的</span><code>axios</code><span fontsize="" color="">存在区别。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">替换的过程很简单，结果也很明确，更换成的</span><code>axios</code><span fontsize="" color="">同样报出了</span><code>Network request failed</code><span fontsize="" color="">错误。</span></p>
<h3 style="" id="%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8%E5%9F%BA%E4%BA%8Ehttp%E7%9A%84%E6%98%8E%E6%96%87%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1"><span fontsize="" color=""><strong>尝试使用基于HTTP的明文数据服务</strong></span></h3>
<p style="line-height: inherit"><span fontsize="" color="">在网络上有一个搜索结果是反映，如果数据服务使用的是HTTP明文传输的话，是不存在这种问题的。那么这是可以比较容易验证的，只需要给数据服务主机上的Nginx配置调整一下即可。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">这一次试验的结果，基本上把问题而核心锁定在了SSL证书上。因为在切换成使用基于HTTP的明文数据服务以后，</span><code>fetch</code><span fontsize="" color="">可以正常与数据服务通讯了。</span></p>
<h3 style="" id="%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8native-module%E7%A1%AE%E5%AE%9A%E9%97%AE%E9%A2%98%E6%89%80%E5%9C%A8"><span fontsize="" color=""><strong>尝试使用Native Module确定问题所在</strong></span></h3>
<p style="line-height: inherit"><code>fetch</code><span fontsize="" color="">封装了非常多的内容，不可能用来完成进一步针对SSL证书的调试。想要完成进一步的检查，还需要使用更加贴近底层的方法。对于React Native来说，那就是使用OkHttp编写一个Native Module，自行控制网络访问。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">如何编写一个基于OkHttp的Native Module，在网络上的示例很多，甚至ChatGPT也能给出一个能够直接使用的简短示例，所以这里不再赘述。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">在使用Native Module访问基于HTTPS的数据服务以后，应用报出的错误发生了变化，从原来的</span><code>Network request failed</code><span fontsize="" color="">，变成了</span><code>java.security.cert.CertPathValidatorException: Trust anchor for certification path not found</code><span fontsize="" color="">。这种提示就已经非常明确了：无法找到可信的证书验证路径。换句话就是证书链不存在。</span></p>
<h2 style="" id="%E8%A7%A3%E5%86%B3%E8%AF%81%E4%B9%A6%E9%93%BE%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98"><span fontsize="" color=""><strong>解决证书链不存在的问题</strong></span></h2>
<p style="line-height: inherit"><span fontsize="" color="">其实这个问题不是App或者React Native亦或是哪个中间件的问题，而是Android中存在的问题。这主要受Android严格的外部数据访问策略影响的，现目前比较常用的Android版本中，Android要求外部数据服务必须是基于HTTPS的。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">这并不是说Android不允许访问基于HTTP的数据服务，而是如果要使用基于HTTP的数据服务，需要进行额外的配置。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">但是现在能够提供免费SSL证书的机构有不少，这实际上对数据安全造成了一定的漏洞。为了安全起见，Androi系统中就没有预置这些机构的CA证书。所以如果数据服务使用的是这些证书颁发机构提供的SSL证书，那么在Android中就一定会报出这个缺少证书链的错误。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">要解决这个问题主要有两种方法：</span></p>
<ol>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">数据服务降级到HTTP使用，放弃更加安全的HTTPS通讯。</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">找一个能够补充证书链的方法。</span></p>
 </li>
</ol>
<p style="line-height: inherit"><span fontsize="" color="">很显然，第一种方法比较省事，但这并不是我所需要的。所以目标就集中在了如何向Android系统提供有效的证书链上。所幸，我所使用的证书颁发机构提供了一个现成的证书链，在我的文件系统中，这个证书链的文件名是</span><code>fullchain.cert</code><span fontsize="" color="">，看名字就知道这是服务器SSL证书的完整证书链。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">在Android 7.0（API 24）以上的版本中，提供了一个细粒度管理网络安全的设置。这个配置需要在Android项目的</span><code>res/xml</code><span fontsize="" color="">目录中放置一个名为</span><code>network_security_config.xml</code><span fontsize="" color="">的文件来描述网络安全方面的配置。在这个文件中有一项功能就是为应用添加证书链，为了方便引用证书链文件，现在将</span><code>fullchain.cert</code><span fontsize="" color="">文件放置到Android项目目录的</span><code>res/raw</code><span fontsize="" color="">文件夹下。然后就可以编写以下配置。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">首先是编写</span><code>network_security_config.xml</code><span fontsize="" color="">文件。</span></p>
<pre><code class="language-xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
  &lt;base-config cleartextTrafficPermitted="true"&gt;
 &nbsp;  &lt;trust-anchors&gt;
 &nbsp; &nbsp;  &lt;certificates src="system" /&gt;
 &nbsp; &nbsp;  &lt;certificates src="@raw/fullchain" /&gt;
 &nbsp;  &lt;/trust-anchors&gt;
  &lt;/base-config&gt;
&lt;/network-security-config&gt;</code></pre>
<p style="line-height: inherit"><span fontsize="" color="">在这个配置文件中声明了</span><code>cleartexttrafficPermitted</code><span fontsize="" color="">为</span><code>true</code><span fontsize="" color="">，这是因为在React Native开发过程中有一些功能需要使用到明文传输，如果设置为</span><code>false</code><span fontsize="" color="">可能会出现应用无法加载的问题。配置文件中通过</span><code>&lt;trust-anchors&gt;</code><span fontsize="" color="">来配置仅针对应用真神起效的证书链，也就是应用本身信任的证书链。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">这里将服务器CA证书颁发机构提供的证书链文件通过</span><code>&lt;certificates&gt;</code><span fontsize="" color="">引入，就完成了应用所使用证书链的扩展。接下来就是在</span><code>AndroidManifest.xml</code><span fontsize="" color="">文件中登记新编写的</span><code>network_security_config.xml</code><span fontsize="" color="">文件配置。</span></p>
<p style="line-height: inherit"><span fontsize="" color="">在</span><code>AndroidManifest.xml</code><span fontsize="" color="">文件中找到</span><code>&lt;application&gt;</code><span fontsize="" color="">元素，在其中添加</span><code>android:networkSecurityConfig</code><span fontsize="" color="">配置项。</span></p>
<pre><code class="language-xml">​
  &lt;uses-permission android:name="android.permission.INTERNET" /&gt;
  &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;
  &lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;
​
  &lt;application
 &nbsp; &nbsp;  android:networkSecurityConfig="@xml/network_security_config"
 &nbsp; &nbsp;  android:name=".MainApplication"
 &nbsp; &nbsp;  android:label="@string/app_name"
 &nbsp; &nbsp;  android:icon="@mipmap/ic_launcher"
 &nbsp; &nbsp;  android:roundIcon="@mipmap/ic_launcher_round"
 &nbsp; &nbsp;  android:allowBackup="false"
 &nbsp; &nbsp;  android:theme="@style/AppTheme"&gt;
 &nbsp;  &lt;activity
 &nbsp; &nbsp; &nbsp;  android:name=".MainActivity"
 &nbsp; &nbsp; &nbsp;  android:label="@string/app_name"
 &nbsp; &nbsp; &nbsp;  android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
 &nbsp; &nbsp; &nbsp;  android:launchMode="singleTask"
 &nbsp; &nbsp; &nbsp;  android:windowSoftInputMode="adjustResize"
 &nbsp; &nbsp; &nbsp;  android:exported="true"&gt;
 &nbsp; &nbsp;  &lt;intent-filter&gt;
 &nbsp; &nbsp; &nbsp;  &lt;action android:name="android.intent.action.MAIN" /&gt;
 &nbsp; &nbsp; &nbsp;  &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
 &nbsp; &nbsp;  &lt;/intent-filter&gt;
 &nbsp;  &lt;/activity&gt;
  &lt;/application&gt;
&lt;/manifest&gt;</code></pre>
<p style="line-height: inherit"><span fontsize="" color="">完成增加这个配置以后，重新启动React Native应用，现在</span><code>fetch</code><span fontsize="" color="">已经可以正常的访问基于HTTPS的数据服务了。</span></p>
<h2 style="" id="network_security_config.xml%E4%B8%AD%E5%8F%AF%E4%BB%A5%E5%AE%8C%E6%88%90%E7%9A%84%E9%85%8D%E7%BD%AE%E5%8A%9F%E8%83%BD"><code>network_security_config.xml</code><span fontsize="" color=""><strong>中可以完成的配置功能</strong></span></h2>
<p style="line-height: inherit"><code>network_security_config.xml</code><span fontsize="" color="">文件中常用的配置功能主要有以下几种：</span></p>
<ol>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">进行全局明文流量配置，这个已经在上面的示例中见到了，就是在</span><code>&lt;base-config&gt;</code><span fontsize="" color="">元素中定义属性</span><code>cleartextTrafficPermitted</code><span fontsize="" color="">的值，将其值设置为</span><code>false</code><span fontsize="" color="">可以允许直接访问基于HTTP的数据服务。</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">配置针对于特定域的配置，这是通过</span><code>&lt;domain-config&gt;</code><span fontsize="" color="">系列元素来完成的。</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">为特定域以及特定路径增加受信证书链。</span></p>
 </li>
 <li>
  <p style="line-height: inherit"><span fontsize="" color="">配置调试证书。</span></p>
 </li>
</ol>
<p style="line-height: inherit"><code>network_security_config.xml</code><span fontsize="" color="">文件的根元素是</span><code>&lt;network-security-config&gt;</code><span fontsize="" color="">，其中可用的配置元素以及节点结构可以参考以下格式示范。</span></p>
<pre><code class="language-xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
  &lt;!--base-config节点至多可以出现一次，用于配置domain-config未覆盖的连接--&gt;
  &lt;base-config cleartextTrafficPermitted="true|false"&gt;
 &nbsp;  &lt;!--配置受信证书链--&gt;
 &nbsp;  &lt;trust-anchors&gt;
 &nbsp; &nbsp;  &lt;!--system证书表示使用系统提供的证书链--&gt;
 &nbsp; &nbsp;  &lt;certificates src="system"/&gt;
 &nbsp; &nbsp;  &lt;!--certificates节点可以有任意数量用来定义受信证书链，自定义证书链需要放置在应用项目内，并在此引用--&gt;
 &nbsp; &nbsp;  &lt;certificates src="system|user|raw resource" overridePins="true|false"/&gt;
 &nbsp;  &lt;/trust-anchors&gt;
  &lt;/base-config&gt;
  &lt;!--domain-config节点可以有任意数量，用于配置特定目标的安全策略--&gt;
  &lt;domain-config cleartextTrafficPermitted="true|false"&gt;
 &nbsp;  &lt;!--至少包含一个domain配置，用来设定domain-config的特定目标，includeSubdomains用来指示当前配置是否适用于子域名--&gt;
 &nbsp;  &lt;domain includeSubdomains="true|false"&gt;example.com&lt;/domain&gt;
 &nbsp;  &lt;trust-anchors&gt;
 &nbsp; &nbsp;  &lt;certificates src=""/&gt;
 &nbsp;  &lt;/trust-anchors&gt;
 &nbsp;  &lt;!--pin-set节点用于定义一组公钥固定，用于信任安全链接的配置--&gt;
 &nbsp;  &lt;pin-set expiration="date"&gt;
 &nbsp; &nbsp;  &lt;pin digest="SHA-256"&gt;公钥base64编码&lt;/pin&gt;
 &nbsp;  &lt;/pin-set&gt;
  &lt;/domain-config&gt;
  &lt;!--debug-overrides节点用来在调试构建时覆盖以上的配置--&gt;
  &lt;debug-overrides&gt;
 &nbsp;  &lt;trust-anchors&gt;
 &nbsp; &nbsp;  &lt;certificates src="" overridePins=""/&gt;
 &nbsp;  &lt;/trust-anchors&gt;
  &lt;/debug-overrides&gt;
&lt;/network-security-config&gt;</code></pre>
<p style="line-height: inherit"><span fontsize="" color="">如果计划在服务器上使用自签名证书来使数据服务支持HTTPS，那么可以直接在域名的</span><code>&lt;domain-config&gt;</code><span fontsize="" color="">节点的</span><code>&lt;trust-anchors&gt;</code><span fontsize="" color="">中配置生成的证书即可。或者还可以将公钥的Base64编码的SHA-256 Hash值写在</span><code>&lt;pin-set&gt;</code><span fontsize="" color="">节点中来直接配置域名所使用的自签名公钥。</span></p>
<p style="">
 <br>
</p>]]></description><guid isPermaLink="false">/archives/F1wfbVDw</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1512149673953-1e251807ec7c%3Fixid%3DM3w2NzIxMjF8MHwxfHNlYXJjaHwyfHxhbmRyb2lkfGVufDB8fHx8MTczNTE5NTI4NXww%26ixlib%3Drb-4.0.3&amp;size=m" type="image/jpeg" length="606925"/><pubDate>Thu, 26 Dec 2024 06:56:37 GMT</pubDate></item><item><title><![CDATA[日本深度自由行攻略]]></title><link>https://jzy.cc/archives/dFKZsGKO</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E6%97%A5%E6%9C%AC%E6%B7%B1%E5%BA%A6%E8%87%AA%E7%94%B1%E8%A1%8C%E6%94%BB%E7%95%A5&amp;url=/archives/dFKZsGKO" width="1" height="1" alt="" style="opacity:0;"><iframe src="https://jzy.cc/upload/%E6%97%A5%E6%9C%AC%E6%B7%B1%E5%BA%A6%E8%87%AA%E7%94%B1%E8%A1%8C%E6%94%BB%E7%95%A5.pdf" width="600" height="500"></iframe>]]></description><guid isPermaLink="false">/archives/dFKZsGKO</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1589209781140-b21556a8fd54%3Fixid%3DM3w2NzIxMjF8MHwxfHNlYXJjaHw1MHx8JUU4JTg3JUFBJUU3JTk0JUIxJUU4JUExJThDfGVufDB8fHx8MTczMjg3MzE3OXww%26ixlib%3Drb-4.0.3&amp;size=m" type="image/jpeg" length="7558109"/><category>旅游</category><pubDate>Fri, 29 Nov 2024 09:38:48 GMT</pubDate></item><item><title><![CDATA[凡事先干起来，就能解决80%的焦虑]]></title><link>https://jzy.cc/archives/Qm7u13Ub</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E5%87%A1%E4%BA%8B%E5%85%88%E5%B9%B2%E8%B5%B7%E6%9D%A5%EF%BC%8C%E5%B0%B1%E8%83%BD%E8%A7%A3%E5%86%B380%25%E7%9A%84%E7%84%A6%E8%99%91&amp;url=/archives/Qm7u13Ub" width="1" height="1" alt="" style="opacity:0;">
<p style=""><span style="font-size: 16px; color: rgb(55, 65, 81)">原创 喵异界</span></p>
<p style="text-align: center"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F1-mngi.png&amp;size=m" width="50%" height="512px" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F2.png&amp;size=m" width="50%" height="554px" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F3.png&amp;size=m" width="50%" height="100%" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F4.png&amp;size=m" width="50%" height="100%" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F5.png&amp;size=m" width="50%" height="100%" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F6.png&amp;size=m" width="50%" height="100%" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F7.png&amp;size=m" width="50%" height="100%" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F8.png&amp;size=m" width="50%" height="100%" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F9.png&amp;size=m" width="50%" height="Infinitypx" style="display: inline-block"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F10.png&amp;size=m" width="50%" height="100%" style="display: inline-block"></p>]]></description><guid isPermaLink="false">/archives/Qm7u13Ub</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1615199951711-efaf9391bfc8%3Fixid%3DM3w2NzIxMjF8MHwxfHNlYXJjaHw2fHxzdW58ZW58MHx8fHwxNzMxNjM2NzQ5fDA%26ixlib%3Drb-4.0.3&amp;size=m" type="image/jpeg" length="1566786"/><category>默认分类</category><pubDate>Fri, 15 Nov 2024 02:12:38 GMT</pubDate></item><item><title><![CDATA[宝塔搭建Halo]]></title><link>https://jzy.cc/archives/5a471df0-e9a4-4be9-8d87-b9c81009afb2</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E5%AE%9D%E5%A1%94%E6%90%AD%E5%BB%BAHalo&amp;url=/archives/5a471df0-e9a4-4be9-8d87-b9c81009afb2" width="1" height="1" alt="" style="opacity:0;">
<p>在宝塔面板上搭建Halo博客程序主要包括以下步骤</p>
<h3 id="1-环境准备">1. 环境准备</h3>
<ol>
 <li><strong>安装宝塔面板</strong>：确保你的服务器上已经安装了宝塔面板（支持 Linux 服务器，如 CentOS、Ubuntu 等）。</li>
 <li><strong>安装环境</strong>：Halo 是用 Java 开发的，建议安装 JDK 11 或以上版本。</li>
</ol>
<h3 id="2-创建网站目录">2. 创建网站目录</h3>
<p>在宝塔面板中，创建一个目录用于存放 Halo 文件，例如 <code>/www/wwwroot/halo</code>。</p>
<h3 id="3-下载-halo-并进行配置">3. 下载 Halo 并进行配置</h3>
<ol>
 <li><strong>下载 Halo</strong>：前往 <a href="https://github.com/halo-dev/halo/releases">Halo GitHub Release 页面</a>下载最新的 Halo 程序，选择 <code>.jar</code> 文件。</li>
 <li><strong>上传文件</strong>：将 <code>.jar</code> 文件上传至 <code>/www/wwwroot/halo</code> 目录。</li>
 <li><strong>配置数据库</strong>：Halo 支持 MySQL 和 SQLite，可以选择在宝塔面板中创建一个新的 MySQL 数据库，记录下数据库信息（地址、用户名、密码等）。</li>
</ol>
<h3 id="4-配置-halo-启动文件">4. 配置 Halo 启动文件</h3>
<p>在 <code>/www/wwwroot/halo</code> 目录中创建一个新的配置文件 <code>application.yaml</code>，内容如下：</p>
<pre><code>`spring:
  datasource:
    url: jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false
    username: 数据库用户名
    password: 数据库密码
halo:
  work-dir: ./halo_data  # 指定数据目录
server:
  port: 8090  # 设置端口号` 
</code></pre>
<p>替换其中的 <code>数据库名称</code>、<code>数据库用户名</code> 和 <code>数据库密码</code>。</p>
<h3 id="5-创建并运行-halo-启动脚本">5. 创建并运行 Halo 启动脚本</h3>
<p>在 <code>/www/wwwroot/halo</code> 中创建一个 <code>start.sh</code> 脚本文件，内容如下：</p>
<pre><code>`#!/bin/bash
java -jar halo.jar --spring.config.location=application.yaml` 
</code></pre>
<p>给脚本执行权限：</p>
<pre><code>`chmod +x start.sh` 
</code></pre>
<p>然后启动 Halo：</p>
<pre><code>`./start.sh` 
</code></pre>
<h3 id="6-配置反向代理">6. 配置反向代理</h3>
<p>为了通过域名访问 Halo，可以在宝塔面板中进行反向代理设置：</p>
<ol>
 <li><strong>添加站点</strong>：在宝塔面板的“网站”中添加站点，设置你的域名。</li>
 <li><strong>配置反向代理</strong>：进入站点设置 -&gt; 反向代理，设置代理目标为 <code>http://127.0.0.1:8090</code>，然后保存。</li>
</ol>
<h3 id="7-初始化-halo">7. 初始化 Halo</h3>
<p>访问你的域名，例如 <code>http://yourdomain.com</code>，按照提示初始化 Halo，创建管理员账户并完成设置。</p>
<h3 id="8-设置开机启动可选">8. 设置开机启动（可选）</h3>
<p>可以通过 <code>screen</code> 或 <code>nohup</code> 来使 Halo 程序在后台运行，确保重启后自动启动：</p>
<pre><code>`nohup java -jar halo.jar --spring.config.location=application.yaml &gt; halo.log 2&gt;&amp;1 &amp;` 
</code></pre>
<p>至此，你的 Halo 博客就可以通过域名正常访问了。</p>]]></description><guid isPermaLink="false">/archives/5a471df0-e9a4-4be9-8d87-b9c81009afb2</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1729067915080-9a14aaf2a96a%3Fixid%3DM3w2NzIxMjF8MHwxfHRvcGljfHxibzhqUUtUYUUwWXx8fHx8Mnx8MTczMTYzNjczMHw%26ixlib%3Drb-4.0.3&amp;size=m" type="image/jpeg" length="5957164"/><pubDate>Fri, 15 Nov 2024 01:46:56 GMT</pubDate></item><item><title><![CDATA[执行一条SQL查询语句，期间发生了什么？]]></title><link>https://jzy.cc/archives/2ded0307-8df9-481a-814d-d90c7c98f5fb</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E6%89%A7%E8%A1%8C%E4%B8%80%E6%9D%A1SQL%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5%EF%BC%8C%E6%9C%9F%E9%97%B4%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F&amp;url=/archives/2ded0307-8df9-481a-814d-d90c7c98f5fb" width="1" height="1" alt="" style="opacity:0;">
<h1>执行一条SQL查询语句，期间发生了什么？</h1>
<p>MySQL 的架构大致可分为两层：<strong>Server 层</strong> 和 <strong>存储引擎层</strong>。</p>
<h2><strong>Server 层：</strong></h2>
<p>Server 层是MySQL的核心，负责处理大多数的核心服务功能，如连接器、查询缓存、预处理器、优化器、执行器以及所有的内置函数（如数学、日期和时间、加密函数）等。此外，还有跨存储引擎的功能（如存储过程、触发器、视图等）。</p>
<h2><strong>存储引擎层：</strong></h2>
<p>存储引擎层是 MySQL 数据存储和管理的核心部分。MySQL 支持多种存储引擎，每种存储引擎都有其特定的存储格式、索引方式和管理策略。最常见的存储引擎包括 InnoDB、MyISAM 和 Memory 等。</p>
<p>每种存储引擎都有其使用的场景。如，InnoDB 提供了事务支持、行级锁定和外键约束等特性，适用于需要高并发和复杂事务处理的场景；而 MyISAM 则提供了全文索引和压缩功能，适用于只读或大量读操作的场景。</p>
<hr>
<p>那么，执行一条SQL查询语句，期间发生了什么？</p>
<h3><strong>连接器：</strong></h3>
<p>处理客户端的连接请求，验证用户身份，管理连接的生命周期。</p>
<h3><strong>查询缓存：</strong></h3>
<p>如果直接命中缓存，则直接返回结果，否则继续往下执行。在 MySQL 8.0 版本后移除。</p>
<h3><strong>解析器：</strong></h3>
<p>负责对SQL语句进行词法、语法分析，并将SQL语句解析成语法树，为后续的优化和执行做准备。</p>
<h3><strong>执行SQL：</strong></h3>
<ol>
 <li>
  <p><strong>预处理阶段（Prepare）：</strong> 验证表或字段是否存在；扩展通配符（如把 <code>SELECT *</code> 扩展为具体的列名）。</p>
 </li>
 <li>
  <p><strong>优化阶段（Optimize）</strong>：选择最佳的查询执行计划。这个过程会考虑多种因素，如索引的使用、连接顺序、聚合操作等。</p>
 </li>
 <li>
  <p><strong>执行阶段（Execute）</strong>：根据优化后的执行计划来执行 SQL 查询语句，将结果返回客户端（如果涉及多个表，还会进行整合处理）。</p>
 </li>
</ol>
<p><a href="https://jzy.cc/upload/2024-04-18T22-04-21-eqwlcglv.webp"><img src="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=.%25E6%2589%25A7%25E8%25A1%258C%25E4%25B8%2580%25E6%259D%25A1SQL%25E6%259F%25A5%25E8%25AF%25A2%25E8%25AF%25AD%25E5%258F%25A5%25EF%25BC%258C%25E6%259C%259F%25E9%2597%25B4%25E5%258F%2591%25E7%2594%259F%25E4%25BA%2586%25E4%25BB%2580%25E4%25B9%2588%25EF%25BC%259F%2F2024-04-18T22-04-21-eqwlcglv.webp&amp;size=m" alt=""> 
  <br></a></p>]]></description><guid isPermaLink="false">/archives/2ded0307-8df9-481a-814d-d90c7c98f5fb</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1554098415-788601c80aef%3Fixid%3DM3w2NzIxMjF8MHwxfHNlYXJjaHwyfHxzcWx8ZW58MHx8fHwxNzMxNjM3MzcyfDA%26ixlib%3Drb-4.0.3&amp;size=m" type="image/jpeg" length="4644918"/><pubDate>Mon, 4 Nov 2024 10:55:17 GMT</pubDate></item><item><title><![CDATA[如何在苹果官网提取IPCC文件？]]></title><link>https://jzy.cc/archives/4b15926e-7f5f-4162-9dd6-fcaf84c0253b</link><description><![CDATA[<img src="https://jzy.cc/plugins/feed/assets/telemetry.gif?title=%E5%A6%82%E4%BD%95%E5%9C%A8%E8%8B%B9%E6%9E%9C%E5%AE%98%E7%BD%91%E6%8F%90%E5%8F%96IPCC%E6%96%87%E4%BB%B6%EF%BC%9F&amp;url=/archives/4b15926e-7f5f-4162-9dd6-fcaf84c0253b" width="1" height="1" alt="" style="opacity:0;">
<p>经常有网友为了各种不同的原因而下载 IPCC 文件，比如 2G/3G/4G 开关或者在不升级系统的情况下使用更高级的运营商版本等等。为了解决这个问题，今天给大家总结了一个从苹果官网<a href="http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStore.woa/wa/com.apple.jingle.appserver.client.MZITunesClientCheck/version">立即下载</a>上下载 IPCC 文件的方法。</p>
<p>如果你要搜索 27.1 版本的 IPCC 文件，可以先按下 Ctrl + F，然后在查找框中输入 27.1 字段，这比输入 27.1 更加便于查找。接下来，我们就可以下载对应的 IPCC 文件了。</p>
<p>举个例子，以下字段就是移动的运营商 IPCC，我们需要做的就是将该字段复制到浏览器地址栏打开，即可下载：</p>
<blockquote>
 <p><a href="http://appldnld.apple.com/ios10.2/031-91680-20161212-E50EE76A-BCE7-11E6-9816-52B482FDB0CC/CMCC%5C_cn%5C_iPhone.ipcc">http://appldnld.apple.com/ios10.2/031-91680-20161212-E50EE76A-BCE7-11E6-9816-52B482FDB0CC/CMCC\_cn\_iPhone.ipcc</a></p>
</blockquote>
<p>此外，我们还可以输入 10.2 查找 iOS 10.2 固件下面应该有的 IPCC，然后在对应的运营商下查看是否有想要的 IPCC。</p>
<p>中国三大移动运营商对应的格式如下：</p>
<blockquote>
 <p>中国移动：CMCC_cn_iPhone.ipcc 或者 CMCC_cn_iPad.ipcc</p>
 <p>中国联通：Unicom_cn_iPhone.ipcc 或者 Unicom_cn_iPad.ipcc</p>
 <p>中国电信：ChinaTelecom_USIM_cn_iPhone.ipcc 或者 ChinaTelecom_USIM_cn_iPad.ipcc</p>
 <p>中国广电**：** CBN_cn_iPhone.ipcc 或者Bouygues_fr_iPad.ipcc <strong>（iOS</strong> 16.4 开始提供，通过热更新支持，在 ipsw 固件里暂时没有），<code>Unknown.bundle</code> 由于 Apple 没有下发运营商配置文件，目前使用公版配置</p>
</blockquote>]]></description><guid isPermaLink="false">/archives/4b15926e-7f5f-4162-9dd6-fcaf84c0253b</guid><dc:creator>版主</dc:creator><enclosure url="https://jzy.cc/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1687226013074-5d59ffeb2625%3Fixid%3DM3w2NzIxMjF8MHwxfHRvcGljfHxibzhqUUtUYUUwWXx8fHx8Mnx8MTczMTYzNjczMHw%26ixlib%3Drb-4.0.3&amp;size=m" type="image/jpeg" length="981332"/><pubDate>Mon, 4 Nov 2024 10:55:17 GMT</pubDate></item></channel></rss>