1.【Nacos系列】创建ConfigService实例源码分析
2.MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的商户商户最佳姿势)
3.靠谱的无代码低代码开发平台有哪些,求推荐?
4.å°ç¨åºä½ä»£ç å¼åå¹³å°ï¼
5.å½å
ä½ä»£ç å¹³å°åªå®¶å¼ºï¼
6.图解+源码讲解 Nacos 客户端动态监听配置机制
【Nacos系列】创建ConfigService实例源码分析
在学习Nacos的过程中,我们关注的租户租户重点是创建ConfigService实例的实现。Nacos通过NacosFactory的源码源码createConfigService方法创建ConfigService实例,这个工厂类是商户商户获取各种服务对象的统一入口。
ConfigService是租户租户配置服务接口,负责配置的源码源码qq客服验证源码获取、发布、商户商户管理等操作,租户租户其核心实现类NacosConfigService。源码源码同样,商户商户Nacos的租户租户命名服务和维护服务也是通过NacosFactory创建实例的,如NamingService用于服务实例的源码源码注册与管理,NamingMaintainService则直接与Nacos服务器交互。商户商户
创建ConfigService的租户租户具体流程中,首先通过ConfigFactory的源码源码createConfigService方法,构造器会进行一些参数校验,并初始化命名空间。例如,校验contextPath属性的合法性,确保其不包含连续的/。然后,会根据用户租户信息、环境变量或配置属性获取namespace值。
ConfigFilterChainManager和ServerListManager的构造也非常重要,前者管理配置过滤器,后者负责维护服务器列表,能够通过配置属性或动态请求获取最新的服务器信息。当创建ConfigService实例时,还会启动长轮询定时任务,如ClientWorker的冒泡函数源码源executeConfigListen方法,通过ServerHttpAgent进行HTTP请求以获取和管理配置数据。
总结来说,创建ConfigService实例涉及工厂方法的调用、参数处理、服务实例初始化以及与Nacos服务器的交互。通过本文的深入分析,你将更好地理解Nacos配置服务的初始化过程。
MASA Framework源码解读- MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
闲来无事,偶然接触到了MASA Framework,此框架是MASA Stack系列中专门用于构建web系统的开源框架。通过在几个小型项目中的应用,我发现它确实拥有诸多优点。为深入理解其内部结构和设计思路,我决定详细阅读MASA Framework的源代码,并记录整个阅读过程。如有任何错误或疑问,还请各位指正。
MASA Framework是一个功能全面且易于扩展的框架,主要由三个部分组成:BuildingBlocks(抽象层)、Contrib(BuildingBlocks的实现)以及Utils(工具库)。官方将BuildingBlocks称为构建块,实际上,这个层将日常开发中频繁使用到的功能抽象出来,如多租户、多语言、仓储、配置中心等,形成易于替换的接口,大大提高了框架的web前端源码资料灵活性和可扩展性。
MASA Framework包含个主要模块,几乎涵盖了日常开发所需的所有组件,从基础服务到高级功能应有尽有。这些模块协同工作,共同构建了一个强大且功能丰富的框架。
让我们从MASA Framework的核心设计——构建工厂(MasaFactory)开始探讨。构建工厂在框架中起着至关重要的作用,它负责通过配置选项来创建不同实现的实例。在实际项目中,构建工厂设计用于解决接口具有多种实现时的依赖注入问题,比如在面对多实现的场景时,如何优雅地注入并使用特定的实现类。以下是构建工厂解决多实现问题的具体步骤:
首先,通过下载MASA Framework的源码(地址:github.com/masastack/MA...)进行研究。我们首先关注的是Masa.BuildingBlocks.Data.Contracts类库的设计。MASA Framework的构建工厂通过选项配置,允许为接口的每个实现类指定一个简短的名称。根据传入的不同名称,构建工厂类的Create方法能够创建对应的实例。
通过使用MASA Framework的构建工厂,我们能够轻松地创建与特定名称对应的面单消息转换类,而无需依赖于IEnumerable集合进行复杂的筛选。这种方法在实现多实现场景时明显更加直观且高效。
以物流面单申请为例,不同销售订单对应不同的商家店铺,而每个商家店铺可能选择不同的物流商。利用MASA Framework构建工厂实现不同物流商的面单申请,不仅简化了开发过程,而且在使用层面保持了无感的斗地主代理源码效果。
总结而言,MASA Framework提供了强大的构建工厂设计,以解决多实现接口的依赖注入问题,简化了开发流程。这个设计不仅限于构建工厂模块,其他模块同样采用了类似的设计理念,允许用户根据需要替换官方实现或结合自定义实现,以适应不同场景和需求。
MASA Framework的其他模块同样采用了构建工厂的设计,用户既可以替换官方实现,也可以在程序内同时共存官方实现和自定义实现。例如,Service Caller模块不仅支持使用dapr的服务调用,还提供了HTTP服务调用等选项。
靠谱的无代码低代码开发平台有哪些,求推荐?
learun .net/java 低代码快速开发平台是一套基于智能化可扩展组件式的软件系统项目,使用了当前主流的应用开发技术,框架内置工作流、向导式智能开发组件、即时通讯组件、APP开发组件、微信组件、通用权限等一系列组件,以及可扩展的系统机制,开发人员通过一系列简单配置就可以快速构建高质量的信息系统。高效率
框架内置企业信息化系统中常用的基础功能组件和高效的可视化开发工具,包括:向导式智能开发组件、即时通讯组件、APP开发组件、微信组件、北京到南京源码工作流引擎、通用权限、专业表单、BI大屏等一系列组件,能实现绝大数功能的低代码开发。
高颜值
具有独立研发的UI界面,前端采用当前主流的VUE框架,内置多套风格UI模板,如:简约、炫酷、经典等,可根据需要进行选择,为您的产品提供颜值保障。
全开源
产品拥有稳定的架构、规范的编码,购买后提供全部源代码,一次授权终身使用。同时,基于框架所开发出的产品,无需再次授权即可直接销售。
力软开发框架能做什么
框架是一个拓展性很强的搭建平台,平台集合了多种常用功能模块,可快速实现复杂的业务场景。
使用框架进行开发,其中%敲代码的事情已经全部做好了,企业只需要专注于个性化业务逻辑,用力软所提供的组件像拼积木一样就能搭建起任何自己所需的功能。像是一个采购入库单,只需要做好表单,再利用工作流将各种表单集成统合、数据互通,就可以完成了。
利用这种简单的开发方式,可以便捷的开发出ERP、OA、CRM、HRM、BI、MIS、SAAS、移动app、微信公众号、微信小程序、电商系统后台等各类企业信息系统。
全新的开发模式,省心到家!
力软开发框架有哪些优势
*提高开发效率
已集成大量业务模板和公共组件,开发人员只需根据开发向导进行设置就可快速完成开发工作,比起传统开发至少要节约%工作量,能大大提升开发效率。
如果需要二次开发,可以直接修改生成的源代码。
*保证软件质量
拥有规范的编码、专业的架构、稳定高效的底层。基于力软框架做开发,可以大幅度地提升软件质量,提升软件稳定性。
*降低开发成本
相较于定制开发和从基础自主搭建,采用力软开发方案仅需一套框架的成本,并且对框架使用人员的技术没有硬性要求,新手也可快速上手。
*提升用户满意
UI作为一款产品的“脸面”,势必影响产品的第一直观印象。框架已经为开发人员提供了多套美观简洁的UI,使开发人员有更多的精力在功能开发上。配合框架良好的编码规范,开发出的产品用户体验友好度必定大大提升,用户满意度也会大大提高。
更多优势
*采用 SOA 架构,系统核心功能均可以通过服务的方式提供给外部调用,方便系统与 ERP 系统及周边系统、硬件设备接口交互能力,解决企业信息化孤岛问题。
*系统前后台通 Ajax 交互,这样使得前台不必依赖于后台的开发语言,日后要重构成php、JSP 后台的话,UI 层完全不用动。
*开发框架完美支持 Oracle、SQL Server、MYSQL 数据库,并且还支持在框架中同时操作多数据库。
*提供自定义报表功能,可通过编写SQL等作为数据来源进行构建不同类型的图形报表。
*提供工作流引擎组件,开发者可以直接在开发框架中使用自定义表单来承载业务数据进行流程审批;也可以编写代码完成复杂表单然后调用流程引擎服务进行流程审批。
*强大的权限管理组件,基于框架开发出功能后就可以直接给被授权角色授予该功能的权限。
*提供 SSO(单点登陆)服务,方便多系统统一登陆管理。
*框架支持 Websocket,消息实时达。
*提供微信企业号开发组件功能。
*提供 APP 开发功能。
*框架支持 redis 缓存集群。
*原班开发人员售后支持。
如需了解更多详情,可以前往力软官网体验
å°ç¨åºä½ä»£ç å¼åå¹³å°ï¼
è·ªæ±ä½ä»£ç å¼åæåªäºï¼
å¹´å½å 家ä¼ç§ä½ä»£ç å¼åå¹³å°æ±æ»çç¹ï¼
1ãå®æââé¿é
å®ææ¯é¿éå·´å·´èªç çä½ä»£ç åºç¨æ建平å°ï¼å¯æ大æé«å¼åæçãäºå¹´3æä¸çº¿ï¼ç¨æ·å¯ä»¥å¨å¯è§åçé¢ä¸ä»¥æææ½çæ¹å¼ç¼è¾åé 置页é¢ã表ååæµç¨ï¼å¹¶ä¸é®åå¸å°PCåææºç«¯ã
2ãç»ä¿¡Informatââåºç³åä½
ç»ä¿¡Informatæ¯é¢åä¸å¡äººåçä½/é¶ä»£ç å¹³å°ï¼å ·æé«åº¦çµæ´»çâæ°æ®+æé+æµç¨âå¨æä¿¡æ¯ç®¡ç模åï¼ç¨æ·ä¸éè¦ä¾èµä»£ç å¼åï¼å¯ä»¥éè¿èªä¸»é ç½®çæ¹å¼ï¼å¿«éæ建ä¼ä¸è¿è¥æéçå类管çç³»ç»ï¼äº®ç¹æ¯æä¾æ°¸ä¹ å è´¹çè¯ç¨ã
3ãç±éæââç¾åº¦
ç±éææ¯ç¾åº¦æºè½äºæ¨åºçä½ä»£ç å¼åå¹³å°ï¼æ¯æå¤ç§åºç¨é¡µé¢æ建形å¼åæ°æ®æ¥é©³æ¹å¼ï¼æ¢å¯èªå»ºæ°æ®æ¨¡åï¼ä¹å¯çµæ´»æ¥é©³å®¢æ·å·²ææ°æ®æºæ对æ¥å¤é¨APIï¼æ¯ææµ·éåè½ç»ä»¶ï¼å¹¶æ¯æèªå®ä¹ä»£ç ãç³»ç»åéåæ¥å£éé è½åï¼çµæ´»åº¦åª²ç¾ä»£ç å¼åã
4ãè½»èââç½æ
ç½æè½»èæ¯ç½ææ¨åºçä½ä»£ç å¹³å°ï¼ä»¥æ¨¡å驱å¨çæ¹å¼ï¼æ¯æææ½å³å¯æ建ä¸å¡æ¨¡åï¼æµç¨å¼æï¼æ¯æææ½çææ ååä¸å¡æµç¨ãæ¯æå¤å±æ¬¡ãç»ç²åº¦èµäº§å¤ç¨ï¼ä¸æ¬¡å¼åï¼å¤å¤ä½¿ç¨ï¼åºäºäºåçåºåº§ï¼ä¸é®åå¸ï¼èªå¨åé¨ç½²è¿ç»´ã
5ãå¾®æââè ¾è®¯
è ¾è®¯äºå¾®æä½ä»£ç 以äºå¼åä½ä¸ºåºå±æ¯æï¼éè¿è¡ä¸å模æ¿ãææ½å¼ç»ä»¶åå¯è§åé 置快éæ建å¤ç«¯åºç¨ï¼å°ç¨åºãH5ãPCWebåºç¨çï¼ï¼å å»äºä»£ç ç¼åå·¥ä½ï¼åºäºè ¾è®¯ççæé¾ï¼å®å¯ä»¥éæä¼ä¸å¾®ä¿¡ãé¾æ¥è ¾è®¯SaaSçæãå¿«éæ建å°ç¨åºã
6ãIVXå¹³å°ââäºå¨åç§æ
0代ç å¯è§åç¼ç¨å·¥å ·ï¼å¯ä»¥å¿«éçæç½ç«ï¼æ¬æºAPPåå®å ¨éæçâ微信å°ç¨åºâå¼åç¯å¢ãæ¨ä¹å¯ä»¥ç´æ¥çææºä»£ç ã带æ¥äºç¼ç¨æ¹æ³åç¼ç¨è¯è¨çå级ã
7ãæ´»åæ ¼ââè¡èå
æ´»åæ ¼å ·ææ´å¼ºçå¼æ¾æ§åæ©å±è½åï¼å ç½®æ°æ®åºéæãWebAPIéæã串å£éæåç¼ç¨æ©å±è½åï¼å¯ä¸è¿è¡å¨å±åç½çå类软件ã硬件以åææ°çäºèç½æå¡æ ç¼éæï¼ä¸ºæéç°æ软硬件ï¼æ建ä¼ä¸æ°ååå¹³å°æä¾åå®çææ¯ä¿éã
8ãç®éäºââå¸è½¯
ç®éäºæ¯ä¸ä¸ªçµæ´»ä¸æäºä½¿ç¨çåºç¨ç¨åºæ建平å°ï¼å æ¬èªå®ä¹è¡¨åï¼èªå®ä¹æ¥åï¼èªå®ä¹æµç¨å¼æï¼æ¶æ¯æéåå ¶ä»æ¨¡åãæ é代ç ï¼æ¨å¯ä»¥å¿«éèçµæ´»å°æ建ä¸å¡ç®¡çç³»ç»ï¼ä»¥æ»¡è¶³ä¼ä¸ç个æ§å管çã
9ãæéäºââä¸ä¼æé
ç¨æ·ä¸éè¦ä»£ç å¼åå°±è½å¤æ建åºç¨æ·ä½éªä¸ä½³çéå®ãè¿è¥ã人äºãéè´çæ ¸å¿ä¸å¡åºç¨ï¼æéä¼ä¸å é¨æ°æ®ï¼ä¹è½å¤éè¿APIåWebhookåå ¶ä»ç³»ç»å¯¹æ¥ãå¹³å°å çèªå¨åå·¥ä½æµè¿å¯ä»¥å®ç°å®¡æ¹ãå¡«åçæ§å¶æµç¨åä¸å¡èªå¨åï¼å¦æç¨æ·ä¼ä¸ä½¿ç¨ééæä¼ä¸å¾®ä¿¡ï¼ä¹å¯ä»¥å°å¹³å°å æ建çåºç¨ç´æ¥å¯¹æ¥å°å·¥ä½å°ä¸ã
ãäºè¡¨ââä¹é软件
äºè¡¨æ¯ä¸ä¸ªåºäºäºç«¯çé¢åæç»ç¨æ·çä¿¡æ¯ç³»ç»è®¾è®¡ä¸è¿è¡å¹³å°ï¼åºäºWeb表åçæ¦å¿µå¼åçæ建表åçåè½é常快éä¸æäºä½¿ç¨ï¼é¢åä¸å¡ï¼éç¨è¡¨æ ¼å¼ç¼ç¨æ¹æ³ï¼è®¾è®¡è ä¸åéè¦å¦ä¹ ä¼ ç»ä»£ç ç¼ç¨åæ°æ®åºè®¾è®¡ã
ãææäºââä¹ç« ä¿¡æ¯
ææäºæ¯ä¸ä¸ªä½ä»£ç åºç¨ç¨åºå¹³å°ï¼è¯¥å¹³å°å°ä¼ä¸çå端åå端è¿æ¥èµ·æ¥ãå¯ä»¥èªå®ä¹åç§ä¼ä¸åºç¨ç¨åºå¹¶å°å ¶ç¨äºäºå¸æ·ï¼å¹¶ä¸å¯ä»¥å®æ¶å¨çº¿è¿è¡è°æ´ãå¼å人åè¿å¯ä»¥éè¿ä»£ç èªç±å¼åã
ãJePaaSââå¯ç¹ä¼ä¸
JEPaaSæ¯å½å å®ç¨çä½ä»£ç å¿«éå¼åå¹³å°ï¼å ·æå¹´çææ¯æ²æ·ï¼å¯è§åå¼åç¯å¢ï¼ä½ä»£ç ææ¾é ç½®å¼å以åæå ¶ç®åçæä½ï¼å¯ä»¥æ大å°å¸®å©å ¬å¸åå°äººå·¥åæ¶é´ææ¬ã
ãåçéæ¹ââåç软件
åçéæ¹åæ°ç使ç¨é ç½®æ件æ¥æè¿°ä¸å¡æ¨¡ååä¸å¡åè½ãå¼å人ååªéè¦ç¼åç®åçé ç½®æ件å³å¯æ建ä¼ä¸çº§åºç¨ç¨åºãå¯ä»¥éè¿è®¾ç½®åæ°æ¥é ç½®æ°ç¾ä¸ªç³»ç»åè½ã
ãAPICloudââç¨å软件
é¢å ç移å¨åºç¨ç¨åºäºæå¡å¹³å°ä¸ºå¼å人åæä¾äºåç§APPå¼åå·¥å ·ï¼éç¹æ¯ç§»å¨APPå¼åï¼ç§»å¨APPç产çã
ãè½»æµââææ ¡ä¿¡æ¯
å¨çº¿ä¸å¡æµç¨ç³»ç»å¯ä»¥éè¿è½»æµè¿è¡å®å¶ãéè¿äººåï¼æµç¨åæ°æ®ç管çï¼å¢å¼ºä¼ä¸ä»·å¼æµï¼éè¿å¨çº¿åä½ï¼å ±äº«ï¼ä¸å¡æ²éï¼å建âæ°ä¸ä»£âä¼ä¸å¨ææ°æ®åºãå¼åçé¢è¶äºå¹´è½»åã
ãéæ¹ç½è¡¨ââéæ¹æä¹
Excelåºäºè¡¨åçå¼åå·¥å ·ï¼æ为å®å¶çæ°æ®åºåºç¨ç¨åºï¼å¹¶æä¾äºæ éçä¸å¡æ建åºç¨ç¨åºå¹³å°çèªç±ãå¨æ¯å¤©çå®æ½å¨æä¸ï¼Excelå°æ建åºç¨ç¨åºä»¥åæ建å®æ½åæä½éæã
ãClickPaaså¹³å°ââç±æ¹æ¯ç§æ
å´ç»å建è ï¼è¿æ¥å¨åé«å¼ºåº¦åºå±è¿ä¸ä¸ªæ¨¡åå¿«éæ建系ç»ååºç¨ç¨åºã模å驱å¨çå¼åæ¯è®¾è®¡æ¦å¿µï¼å æ¬æ¦å¿µæ¨¡åï¼æ°æ®æ¨¡åï¼é¡µé¢æ¨¡åï¼è¿ç¨æ¨¡åçã
ãJeecgBootââå½ç¬ä¿¡æ¯
JeecgBootæ¯ä¸æ¬¾åºäºBPMçä½ä»£ç 产åï¼æ¯æå¾®æå¡ãåè½å ¨é¢ï¼å¯ä¸é®çæåå端代ç ï¼ç®ååè½ä¹å¯å®å ¨å¨çº¿å®æãæ¢è½å¿«éæé«æçï¼èçç åææ¬ï¼åæ¶åä¸å¤±çµæ´»æ§ã
ãæ°äºââ奥å²
è·é¿éææï¼èé é¿é强å¿åå±ï¼ééåæ级å®å¶æå¡åï¼æä¾è¡¨åãæµç¨å¼æï¼æ¥è¡¨çåè½ã积æ¨å¼åºç¨æ建ï¼åæ¶å ·å¤ä»£ç å¼ååå¤é¨ç³»ç»éæè½åãä¸éééæï¼æ¯æPC端ä¸ç§»å¨ç«¯ä½¿ç¨ã
ãJ2PaaSââåé¼ç§æ
J2PaaSæ¯åé¼ç§æåºäºå¹´ææ¯æ²æ·å项ç®ç»éªèç åï¼æ©å¨å¹´å°±è·å¾å ç¼ç å½å®¶åæä¸å©ï¼ç®åç»è¿5次çæ¬è¿ä»£ï¼è¦ç软件项ç®éæ±åæã设计ãå¼åãæµè¯ãè¿è¡ãç»´æ¤ä¸ç®¡ççå ¨è¿ç¨ãJ2PaaSå¹³å°æ常è§éè¦ç¨åºåå®æçåè½éæå¨æ¡æ¶ä¸ï¼å°è£ 为å大åæ°ï¼å¼å人ååªéå ³æ³¨ä¸å¡é»è¾ï¼é¡µé¢ç»è£ åæµç¨è®¾è®¡çç¸å ³åè½å·²ç»å ç½®å®æï¼æ¯ä¸æ¬¾ä¼ä¸çº§ä½ä»£ç å¹³å°ã
ãå为äºAppCube
åºç¨éæ¹AppCubeï¼ç®ç§°AppCubeï¼æ¯ä¸æ¬¾ä½ä»£ç åºç¨å¼åå¹³å°ï¼æºäºå为åºç¨å¼ååæ°åå转åçå®è·µï¼æä¾äºäºä¸æ ç åãä½ç åãæ¯æå¤ç åçåºç¨å¼å模å¼ï¼å±è½äºææ¯çå¤ææ§ï¼æåäºä¼ä¸å¼åçæçãåæ¶æä¾åºç¨èµäº§çå¼åæ ååå¾®æå¡æ¡æ¶ï¼å©åä¼ä¸ä¸ææ²æ·å¯å¤å¶çå¥ä»¶ï¼å éåºç¨çå®å¶ï¼å¹¶éè¿å¼æ¾ççæï¼å®ç°å¥ä»¶èµäº§çåä¸åç°ã
ãé£ä¹¦å¤ç»´è¡¨æ ¼ââåè
åèè·³å¨é£ä¹¦å¤ç»´è¡¨æ ¼æ¯ä¸æ¬¾ä»¥è¡¨æ ¼ä¸ºåºç¡çæ°ä¸ä»£æçåºç¨ãå®å ·å¤è¡¨æ ¼çè½»çåä¸å¡ç³»ç»ç强大ï¼èåäºå¨çº¿åä½ãä¿¡æ¯ç®¡çåå¯è§åè½åï¼è½å¤èªéåºå¢éæç»´åä¸å¡åå±éæ±ï¼æ¯å ·å¤ä¸ªæ§åè½åçä¸å¡ç®¡çå·¥å ·ã
ãéè¶äºè穹ââéè¶è½¯ä»¶
éè¶äºè穹çå¼åæå¡äºæ¯åºäºéè¶ç¬åç第å代å¨æé¢å模å(KDDM)ï¼å¼åæå¡äºæä¾å¨æå»ºæ¨¡å·¥å ·ï¼æ¯æå¯è§åé ç½®ãä½ä»£ç å¼åï¼è½»æ¾æ建åºäºå¾®æå¡æ¶æçèªå®ä¹åºç¨ã为äºåºç¨(SaaSæå¡)çå¼åãé¨ç½²ãè¿è¡åè¿è¥æä¾ä¸ç³»åæå¡å管çå·¥å ·ï¼æ¶µçå¾®æå¡ç»ä»¶ãå¼åæå¡ãè¿è¡æå¡ãæå¡ç®¡çãAPIæå¡æ¡æ¶ãåºç¨å»ºæ¨¡ãäºæ¯ææå¡ä¸è¿ç»´æå¡çãéè¶äºÂ·è穹å¼åæå¡äºåºäºå¨æé¢å模åæä¾å¨æå»ºæ¨¡å·¥å ·ï¼æ¯æå¯è§åé ç½®ãä½ä»£ç å¼åï¼è½»æ¾æ建åºäºå¾®æå¡æ¶æçèªå®ä¹åºç¨ã
ãæ³å¾®ä½ä»£ç ââæ³å¾®
æ³å¾®ä»¥âç»ç»æéå¼æã建模å¼æãæµç¨å¼æãéæå¼æãå 容å¼æãé¨æ·ä»¥åæ¶æ¯å¼æâç7大å¼æ为æ¯æï¼å¸®å©ç»ç»æé å¼æ¾å ±äº«çä½ä»£ç åºç¨æ建平å°ãå¿«éæ建è½åæ¯æ³å¾®ä½ä»£ç æ建平å°çéè¦ç¹æ§ï¼ç»ç»éè¿åå°å¼æé ç½®æ¹å¼ï¼æææ½å³å¯æ建个æ§ååºç¨åºæ¯ãçµæ´»ç表å设计ãæµç¨æ建åè½ï¼è¿æå¨çº¿è°è¯ãæºè½ä¿®æ¹åè½ï¼è®©åºç¨æ建æ´å æ¹ä¾¿ãæºè½ãæ³å¾®ä½ä»£ç å¹³å°å®ç°äºå é¨ååï¼ç¡®ä¿å é¨æµç¨ãé¨æ·ãææ¡£ãæ°æ®ãè§è²ä¹é´çååå ³èï¼ç¹å»ä»»ä½ä¸ä¸ªå段ï¼å³å¯è¿½æº¯ä¸ä¹ç¸å ³çæ°æ®åå·¥ä½å 容ï¼äºè§£ä¸å¡å ¨è²ãéè¿æ³å¾®ä½ä»£ç ä¸å¡æ建平å°ï¼ç»ç»å¯ä»¥å¨ä¸ä¸ªå¹³å°è¿æ¥ãæ©å±åéæERPãCRMãHRMãSRMçåºç¨ã
ãiGIXââ浪潮
浪潮iGIXä¼ä¸æ°ååè½åå¹³å°ï¼å å«ææ¯ãæ°æ®ãä¸å¡ä¸å¤§ä¸å°ï¼åºäºäºåçææ¯ï¼å¾®æå¡æ¶æï¼èåå¼¹æ§è®¡ç®ãæºè½ç©èã大æ°æ®æ²»çãæºå¨å¦ä¹ ã认ç¥æå¡ãæ°åæ°æ®å¹³å°çåºç¡ææ¯ï¼æä¾ä½ä»£ç å¼åãDevOpsãæ··åäºéæãçæå¼æ¾çåºç¨åæ°å éè½åï¼å ç½®æ°æ®èµäº§ç®¡çä¸ä¸°å¯çæ°æ®æå¡ï¼æç ´æ°æ®å£åï¼å ¨é¢æ´åä¼ä¸æ°æ®èµæºï¼æ建åºäºæ°æ®çåæ°è½åï¼æ²æ·å ±äº«ä¸å¡æå¡ï¼æ建ä¸å¡æå¡è½åã浪潮iGIXæ¯æä¼ä¸ææ¯ãä¸å¡ãæ°æ®ä¸åä¸èååæ°ï¼èµè½ä¼ä¸æ建æ°ååä¸å°ï¼ä¸ºä¼ä¸å»ºç«æ´å ·åæ°çµæ´»çä¸å°ç»ç»æºå¶åä¸å¡æºå¶ï¼ä½¿åå°ä¸å¡æ´ææ·ãæ´å¿«éçéåºå¿«éå¤åçåä¸ç¯å¢ï¼å éä¼ä¸å®ç°æ°åå转åã浪潮iGIXæ¨å¨æé ä¸ä¸ªå®æ´çä¼ä¸åºç¨çæç³»ç»ï¼æ¢æ¯æµªæ½®äºERPGSCloudçåºç¡æ¯æå¹³å°ï¼ä¹æ¯é¢åä¼ä¸ä¿¡æ¯ä¸å¿/å ¬å¸ãåä½ä¼ä¼´ãç¬ç«è½¯ä»¶å¼ååï¼ISVï¼ççæèµè½å¹³å°ï¼æ¿åä¼ä¸æç»çæ°åååæ°è½åã
ãæ鲸äºââçé»çå¨
çé»çå¨æ鲸äºæ¯é¢å çä½ä»£ç åBPMPaaSæå¡åä¹ä¸ï¼äº§ååè½å·²è¦çä½ä»£ç ãæºè½æµç¨ãéæã移å¨ãä¸å¡è§åå¨å çPaaSè½åï¼æ¯ææ°åå转åä¸ååå±çº§å«çè½åè¦æ±ã产åå¸å±ä¸æä¾é¢å大ä¸åç»ç»çAWSPaaSä½ä»£ç å¼åå¹³å°åé¢åæé¿åç»ç»çæ鲸äºä½/æ 代ç äºåºç¨å¹³å°ï¼å¸®å©ç¨æ·å éæ°åå转ååè¿è¥åæ°ãæ æç¨æ·è¦çåå·¥ãéèãæ¿åºãæè²ãçµåé¶å®ãè½æºåå·¥ãå·¥ç¨å»ºççåç´è¡ä¸ãå¹´è·éå±±åå ¬A+è½®æç¥æèµï¼å ±å»ºææ¡£åä½+ä½ä»£ç PaaSåçæï¼æ»¡è¶³ä¸åè§æ¨¡ãä¸åé¢åç¨æ·å¯¹æ°åå转åçéæ±ã
ãèåä½ä»£ç ââèå软件
èå软件æ¯å½å ç¥åçç¥è¯ç®¡çãååOAæå¡åçãå¨åååå ¬å¸åºåé åºè¾é«çç¥å度ï¼ä¹æ¯ææ©ä¸äºèç½TOBçæèµ°çæè¿çèçååååãå¹´èå软件ä¸ééè¾¾ææç¥åä½ï¼ç´è³å¹´éé注èµï¼èå软件ä¸ééçæå¼å§ç´§å¯ç»åï¼ç±äºå ¶è¿å¾ç大é大客æ·é¡¹ç®ç»éªå产åæå¡ç积累ï¼èå软件å¨åºäºå¤§å®¢æ·çâè¡¨æ ¼+æµç¨+æ°æ®âçä½ä»£ç æå¡é¢åæçä¸å®çå åä¼å¿ï¼å½¢æäºå¯¹ééçæçå¸åºè¡¥å ãèå软件水桶å产åç¹å¾æ¯è¾çªåºï¼ä½ä¸ºä¸ä¸ªèçååOAåçï¼èå软件å°ä½ä»£ç ä½ä¸ºè½åä¹ä¸è¾åºç»å®¢æ·çå¾åæ´æµï¼å¦ä½å®ä½/平衡âä½ä»£ç âç产ååè·¯å¾å°æ¯èåçææä¹ä¸ã
ãä¼ä¼´äºââä¼ä¼´æºæ §
ä¼ä¼´äºï¼æ¯ç±æç年以ä¸è®ºå软件å¼ååä¸å°ä¼ä¸æå¡ç»éªçåDiscuz!å¢éæé çï¼åç»âä¼ä¼´äºè¡¨æ ¼âãâä¼ä¼´åå ¬âï¼éæ¥å级为ä¸ä¸ªä¸ºä¼ä¸ç»è¥æå¡çæ°æ®å¯è§åå¹³å°ï¼ä¸ºä¼ä¸çå ¨æµç¨è¿è¥ç®¡çä¸ç»è¥æ ¸ç®æä¾æ´ä½è§£å³æ¹æ¡ãéè¿å¼ºå¤§çæ°æ®åºå¼æåæéæ¶æï¼æé å¯çµæ´»å®å¶çæµç¨å¼æä¸å¤§æ°æ®åæå¼æï¼é åä¸å®¶çº§ç»è¥é¡¾é®ä¸æå¡ï¼æé å ¨æµç¨ãå®æ¶å¯è§åçç»è¥æ ¸ç®ä½ç³»ï¼ä¸ºä¼ä¸æ建起ä¸ä¸åå¿çç»è¥ä¼ä¼´å ³ç³»ï¼å®ç°åå·¥æç»æé¿ãç»ç»æç»åé©ãä¸ç»©æç»æé«ã
ãè½»éªå µââéç°ä»£
è½»éªå µä½ä»£ç å¼åå¹³å°ï¼HussarLCDPï¼æ¯ä¸æ¬¾éç°ä»£å»ºè®¾äºåä½å¹´çå¼åå¹³å°äº§åã使ç¨è¯¥äº§åå¯æ éç¼ç ï¼é¶ä»£ç ï¼æéè¿å°é代ç å°±å¯ä»¥å¿«éçæé«ä½éªçåºç¨ç¨åºãå¯è§ç¼ç¨ï¼æè§æå¾ï¼å¯è§åUIå¸å±æ¹æ¡ï¼æè§å³æå¾çå¼åä½éªï¼ä¸ç²¾äºä¸å¡æ°æ®ä¸å°çä¿¡æ¯èåçæ°æ®å¯è§åï¼éè¿å¾å½¢çé¢è½»æ¾æ建ä¸ä¸çå¯è§ååºç¨ï¼æ»¡è¶³æ¨æ¥å¸¸ä¸å¡çæ§ãè°åº¦ãä¼å±æ¼ç¤ºçå¤åºæ¯éæ±ã
ãæ°ç¿æ°æ®ââå京æ°ç¿
æ°ç¿æ°æ®æ¯ä¸å®¶æ°æ®é©±å¨çä¼ä¸çº§æ 代ç 软件平å°åï¼ä»¥â让人人尽享æ°æ®ä»·å¼â为ä¼ä¸æ¿æ¯ï¼â让天ä¸æ°æ®å¿«é使ç¨â为使å½ï¼å¤å¹´æ¥éè¿èªèº«ææ¯ä¼å¿å åèå大æ°æ®åè¡ä¸ä¸å¡ç§¯ç´¯ï¼å¸®å©ä¼ä¸æ大åæ°æ®ä»·å¼ï¼ä»¥åæ°ç软件å¼å模å¼ï¼å¼å¯è½¯ä»¶æºè½å¶é æ°é©å½ï¼ä¸ºä¸å½ä¼ä¸çæ°æºå转åæéãå ¶ç¬æçåå模åï¼è½å¤å®æ´è¦çæ°æ®ãåæã管çãè¿è¥å个é¢åï¼æ¶å客æ·è¡¨åãæµç¨ãæç´¢ãéæãåæçå ¨ä¸å¡çå½å¨æã
个平å°å ¨é¨çç¹å®æ¯ï¼å¸æ对大家ææ帮å©å~
æåªäºæ¯è¾å¥½ç¨çä½ä»£ç å¼åå¹³å°ï¼
æ¯è¾å¥½ç¨çä½ä»£ç å¼åå¹³å°æå®å¤©è½¯ä»¶ãå®æãç®éäºçã
ä½ä»£ç å¼åå¹³å°çæ ¸å¿ä»·å¼è§æ¯ä¸ºäºæé«åºç¨ç¨åºå¼åçæçï¼ä½ä»£ç å¼åå¹³å°ä¸»è¦ç使ç¨è æ¯ç¨åºåï¼ç¨åºåéè¿ä½¿ç¨ä½ä»£ç å¹³å°æé«äºå·¥ä½æçåå°äºIT积åãå¼åç³»ç»çæ ¸å¿ç®çæ¯ä¸ºäºæåæçï¼å轻人工çå·¥ä½éãå æ¤å¿ ç¶è¦å¤çå¾å¤å¤æçä¸å¡é»è¾ãæ¯å¦å¼åååä»æ¬¾ç®¡ççæ¶åè¯å®è¦è®¡ç®å·²ä»æ¬¾ãæªä»æ¬¾ãå¼åç©åç´ç¨çæ¶åè¦æ£é¤åºåï¼è¿äºé½éè¦ç¼åä¸å¡é»è¾ä»£ç ãæççä½ä»£ç å¼åå¹³å°ï¼åºè¯¥æä¾å®æ´çå ¥å£ï¼è®©å¼å人åå¯ä»¥ç¼ååç§ä¸å¡é»è¾ãä½ä»£ç å¼åå¹³å°éè¿é ç½®åçæ¹å¼æ建系ç»ååï¼ä¸è¾¹æ建ä¸è¾¹è¿è¡çææï¼æ ¹æ®ææéæ¥è°æ´åå®åãå¾å¿«å°±å¯ä»¥æ建åºç³»ç»ååãå³ä½¿ç³»ç»æ£å¼ä¸çº¿ï¼ä¹å¯ä»¥éæ¶æç §å®¢æ·çéæ±ï¼å¿«éä¿®æ¹ç³»ç»é ç½®ã
æ³äºè§£æ´å¤å ³äºä½ä»£ç çç¸å ³ä¿¡æ¯ï¼æ¨èå¨è¯¢å®å¤©è½¯ä»¶ãå®å¤©è½¯ä»¶ç»è¿å¹´çææ¯ä¸é¡¹ç®ç§¯ç´¯ï¼bpmç¸å ³åè½å·²ç»é常å®åï¼å¤§åå¤æçä¸å¡éæ±é½æ对åºçé 置项ï¼ä¸ææä½ï¼ç»ç«¯å®æ½äººåå¯ä»¥é ç½®å®ç°%çåºç¨ä¸æµç¨éæ±ï¼å°éä¼ä¸ä¸ªæ§åéæ±å¯ä»¥ç±å¼å人åå¨çº¿éæå¼åå¿«éå®ç°ï¼æ¢æ»¡è¶³ä¼ä¸ä½ææ¬å¿«é交ä»éæ±ï¼å满足ä¼ä¸ä¸ªæ§åéæ±ãã欢è¿ç¹å»å¨è¯¢å®å¤©è½¯ä»¶ï¼ã
ä¸è¬ä¼ä¸çº§ä½ä»£ç å¼åå¹³å°ï¼é½æåªäºå ·ä½åè½ï¼ä¼æå¨ç¥ï¼æ¯å®¶å ¬å¸å¨åå±è¿ç¨ä¸é½éè¦æ建大éçå é¨ç³»ç»ï¼å¦è¿è¥ä½¿ç¨çç¨æ·ç®¡çåå°ï¼éå®çº¿ç´¢åå°ï¼ååä¸æ´»å¨åå°çã许å¤å ¬å¸å é¨ä¹ä¼è请ä¸ä¸çç åå¢éè´è´£å¼ååç±»åå°åå é¨å·¥å ·ï¼å¤§éçå ¬å¸ä¸ºæ¤ä»åºäºé«é¢çææ¬ï¼å·¥ç¨å¸ä¹å éæ±é大åå¤æ建åºç¡ä»£ç ï¼å¹¶å¨è¿ç§éå¤é è½®åçè¡ä¸ºä¸ç£¨çäºåé ççæ ãé£ä¹ä¸æ¬¾ä½ä»£ç çåºç°ï¼å°±æ¾å¾å¼¥è¶³çè´µäºï¼é常æ¹ä¾¿ã
ä¸ãä½éªè¿ç¨
大è´æµç¨æä½éªè¿äºï¼æ们å æ¥ççå®å ·ä½æåªäºå¼å亮ç¹ï¼æ¹ä¾¿åé¢åç»åã
éé¢è³å°å å«è¡¨å建模ãæµç¨è®¾è®¡ãæ¥è¡¨å¯è§åã代ç çæå¨ãç³»ç»ç®¡çãå端UIçç»ä»¶ã
åä¸é¢è¿äºåè½ï¼å¯ä»¥ç´æ¥å¼ç¨ï¼æä»¬å°±æ²¡å¿ è¦éæ°é è½®åï¼ä» éæ©åéçç»ä»¶è¿è¡éæåäºæ¬¡å¼åï¼å³å¯èªä¸»å¼åä¸ä¸ªä½ä»£ç å¹³å°ã
ãè¿æ¥æ°æ®æº
æ¯æè¿æ¥å¤æ°æ®æºï¼å¸®å©åºç¨å¿«éä¸ç¬¬ä¸æ¹ç³»ç»å®ææ°æ®æ´åï¼å°ç¬¬ä¸æ¹ç³»ç»æ°æ®æ´åå¨å¹³å°éãæ¯æå æ¬ä¸»æµæ°æ®åºSQLServerãMySQLãOracleãPostgreSQLï¼åæ¶å ¼å®¹å½äº§æ°æ®åºè¾¾æ¢¦ã人大éä»çã
ã设计表å
å ç½®è¾ä¸ºä¸°å¯ä¾¿æ·ç表åå¼æï¼ææ½æ建å³å¯ï¼å®ç½æ¾ç¤ºæ¯ææä½ç§æ§ä»¶ï¼åæ¯å¯ä»¥æ»¡è¶³å¤ç§ä¸å¡åºæ¯ä¸çæ建éæ±ã
PC端设计好表ååï¼æ¯æ移å¨ç«¯åæ¥è®¾è®¡ï¼ä¸é®åå¸è³APPãå°ç¨åºãH5ç移å¨å¹³å°ä¸ï¼è¾ä¸ºé«æçå°±å®æäºå¤ç«¯èªå¨éé ï¼å®ç°ä¿¡æ¯äºèäºéã
ãæµç¨è®¾è®¡
强大æµç¨å®ä¹åè½ï¼èç¹å®¡æ¹ãåæµç¨ãæ¡ä»¶åæ¯ãéæ©åæ¯ã并åæ¯ãå®æ¶å¨çï¼ï¼ä¸å¡é»è¾ç®å好ç解ãä¸å¡æµç¨æ¢³çå¿«æ·æäºï¼åæ¶æ¯æä¸è¡¨åå¤æµç¨ç设置ã
å°è£ 大éå ·æä¸å½ç¹è²çæµç¨å¨ä½ï¼æ»¡è¶³å®¡æ¹éæ±ï¼å æ¬æé设置ãä¼ç¾ãæç¾ãé审ã转审ãå¬åãæ¤åãå ç¾ç审æ¹å¨ä½ã
ãå¾è¡¨åç°
éè¿ç®æé ç½®å³å¯èªå¨çæåç§ç±»åçæ¥è¡¨ï¼å 置大éå¯è§åæ§ä»¶ææï¼éè¿OLAPå¤ç»´åæåè½ï¼å¸®å©æ´å¯è§£å³æ°æ®èåçé®é¢ã
åæ¶æ¯æéææ°æ®ãæ°æ®åºåAPIçå¤ç§æ°æ®æºæ¥å ¥æ°æ®ï¼å¯æ»¡è¶³å¤å åçæ°æ®æ´åéæ±ã
ãç»ç»æ¶æ设置
JNPFæ¯æå¤ç§æ·æ¨¡å¼ï¼å¯æ ¹æ®ç®¡ç模å¼å·®å¼è¿è¡ä¸å¡ååºåºç¨ï¼æ¯æåæ¥ç®¡çå¤ä¸ªèµå·¥ä½åºç¯å¢ï¼å®ç°ååå·¥ä½åºçæ¥å¸¸ä½¿ç¨äºä¸å¹²æ°ã
å½ç¶ï¼ä¸ç¨æ å¿çæ¯ï¼ä¸åçååå ¬å¸å®ä¹æ¯æåå«å¯¹æ¥ä¼å¾®åééæ¶æã
äºãæçè¯ä»·
ææå®ç°ãæ´ä¸ªè¿ç¨æµç ï¼åºæ¬æ å¡é¡¿ï¼æäºç解åè°è¯ã
å¤ç«¯å¼åãPC端设置好表åå移å¨ç«¯åæ¥çæï¼å¾ä¾¿æ·ã
æç®åçåè½é ç½®ï¼ä¹æå¯ç¨äºé ç½®å¤æçåºæ¯ãåè ï¼å¯è½å¯¹äºä¸å¡äººåç¬ç«å¼åä¸è¦ä¸ç¹å夫ï¼ä½å¹¶ä¸å½±åå®çå ¨è½æ§ã
ä¸ãå°ç»
对äºæ´ä¸ªåºç¨å¼åæµç¨ä½éªå®æåã个人认为å®ç综å使ç¨æåå¸åºæ§ä»·æ¯ç®æ¯ä¸éçãåéå®æä¸ä¸ªåºç¡åºç¨ï¼2-3å°æ¶å°±è½æ¸æ¸ æ´å¥ç³»ç»ç使ç¨æµç¨ååºæ¬åè½çä½ç½®ï¼äº§åçåè½éæåæä½å¤æ平衡ä¹è¾ä¸ºåçã
å½å ä½ä»£ç å¹³å°åªå®¶å¼ºï¼
è¯ä¸å¤è¯´ï¼ç´æ¥ç»å¤§å®¶æ¨èå 个å½å æ¯è¾ä¸»æµçä½ä»£ç å¼åå¹³å°ï¼1ãç»ä¿¡Informatï¼æ¯æ·±å³åºç³åä½æ¨åºçé¢åä¸å¡äººåçä½/é¶ä»£ç å¼åå¹³å°ï¼å ·æé«åº¦çµæ´»çâæ°æ®+æé+æµç¨âå¨æä¿¡æ¯ç®¡ç模åï¼ç¨æ·ä¸åéè¦ä»¥æ¥ä»£ç å¼åï¼å¯ä»¥éè¿èªä¸»é ç½®çæ¹å¼ï¼å¿«éæ建ä¼ä¸è¿è¥æéçå类管çç³»ç»ãèä¸å®ä¸ä¼ä¸å¾®ä¿¡ãééç´§å¯éæï¼è½å¤å¤§å¹ è约ç åææ¬åæ¶é´ï¼å¸®å©ä¼ä¸å®ç°å ¨æ¹ä½çæ°åå转åãå®è¿æä¾äº+ç°æçåºç¨åè¡ä¸æ¨¡æ¿ï¼ä¼ä¸ä¸éè¦ä»é¶å¼å§ï¼ç´æ¥åºäºåºç¨æ模æ¿æ¥ä¿®æ¹ææå±åè½ï¼å¯ä»¥æ´å¿«éé«æå°æ建åºè´´è¿éæ±çåºç¨ã
第äºä¸ªï¼ééå®æï¼é¿éèªå·±å¼åçä½ä»£ç å¹³å°ï¼è·ééä¹ææ¯è¾æ·±åº¦çç»å®ï¼å ¶å®åè½é½æ¯å·®ä¸å¤çï¼éè¿æææ½çæ¹å¼è®¾è®¡è¡¨å设计æµç¨ï¼è®¾è®¡ä»ªè¡¨çä¹åï¼ä½ å¯ä»¥ä¸é®æå®åå¸å°çµè端åææºç«¯ï¼è®©ä½ å ¬å¸å ¶ä»åäºæ¥ä½¿ç¨ã
第ä¸ä¸ªæ¯å¥¥å²ï¼è¿ä¸ªä¹æ¯ééåè¡çãå®çç¹ç¹æ¯é¢åä¸åçåºæ¯åä¸åç人群åäºä¸äºç»åãæ¯å¦è¯´ï¼æé¢åä¸ä¸å¼åè çãé¢åä¸å¡äººç¾¤çãé¢åæ°åå管çåçï¼ä½ å¯ä»¥æ ¹æ®ä½ ä»¬å ¬å¸ä¸åçå¼åæ°´å¹³å»éæ©æä¸ä¸ªã
第å个æ¯ææ³äºãæä¹æ以ä»ç»è¿ä¸ç¹ï¼æ¯åç°ä»ä»¬æ OA å CRM åäºæéï¼ç¸å½äºæ¯ä¸æ³¨å¨æä¸ä¸ªç¹ä¸ãå¦æä½ å¯¹è¿æ¹é¢éæ±æ¯è¾å¼ºçè¯ï¼å¯ä»¥è¯ä¸è¯ã
第äºä¸ªå¢å°±æ¯ä¼ä¼´äºï¼åå§äººæ¯æ´å¿åº·ï¼è¿å»çååä¸åå°ï¼å½æ¶åä¸å°±åäºDiscuzï¼å½å ç论å软件ï¼å ¶å®ä¸ç´ä¹æ¯ To B å¾ï¼ä¹æ¯å½å ææ©ä¸æ¹åé¶ä»£ç å¼åå¹³å°çã
ä»ä»¬å ¶å®è·ä¼ä¸å¾®ä¿¡çæéæ¯è¾å¤ï¼ä½ å¨ä¼ä¸å¾®ä¿¡éè¾¹å线ä¸çéå®ï¼ä¸æ´å¥çCRMæµç¨ä»ä»¬åçæ¯æ¯è¾å®åçã
第å 个就æ¯æéäºï¼è¿ä¹æ¯ä¸ä¸ªé常èççåä¸å ¬å¸äºï¼ä»ææ©æéå»åä¼ä¸æå¡ï¼ç¶åç°å¨æéäºåçä½ä»£ç ãä»ä»¬å®¶çæä¸ä¸ªç¹ç¹å°±æ¯è½å¤æä¾ç§æåçé¨ç½²ã
å¦æä½ å¯¹æ°æ®å®å ¨åæ¹é¢æè¦æ±çè¯ï¼ä½ å°±å¯ä»¥è¯è¯ï¼ä»ä»¬æè§ä¼æ´éåä¸å¤§åçä¼ä¸ã
第ä¸ä¸ªå°±æ¯ç®éäºï¼æåç°ä»ä»¬çä»ç»åå¾ç¹å«å¥½ï¼ä½ ç¨å®å»åå¼åï¼åºæ¬ä¸å°±æ¯ä¸æ¥ï¼ç¬¬ä¸æ¥æ¯è®¾è®¡è¡¨åï¼ç¬¬äºæ¥è®¾è®¡æµç¨ï¼ç¬¬ä¸ä¸ªå°±æ¯ä»ªè¡¨çãç®åçåºç¨æ建ç¨å®è¿è¡ã
以ä¸å 容ï¼å¸æ大家ææ帮å©ï¼
图解+源码讲解 Nacos 客户端动态监听配置机制
图解+源码讲解 Nacos 客户端动态监听配置机制
在人生中第一要紧的是发现自己。为了这个目的,各位时常需要孤独和深思 —— 南森 Nacos 源码分析系列相关文章
从零开始看 Nacos 源码环境搭建
图解+源码讲解 Nacos 客户端发起注册流程
图解+源码讲解 Nacos 服务端处理注册请求逻辑
图解+源码讲解 Nacos 客户端下线流程
图解+源码讲解 Nacos 服务端处理下线请求
图解+源码讲解 Nacos 客户端发起心跳请求
图解+源码讲解 Nacos 服务端处理心跳请求
图解+源码讲解 Nacos 服务端处理配置获取请求
图解+源码讲解 Nacos 客户端动态监听配置机制
NacosConfigAutoConfiguration我们看到这里面其实注入了一个 Nacos 配置刷新的关键 NacosContextRefresherBean
@Configuration@ConditionalOnProperty(name?=?"spring.cloud.nacos.config.enabled",?matchIfMissing?=?true)public?class?NacosConfigAutoConfiguration?{ //?Nacos?配置属性@Beanpublic?NacosConfigProperties?nacosConfigProperties(ApplicationContext?context)?{ if?(context.getParent()?!=?null&&?BeanFactoryUtils.beanNamesForTypeIncludingAncestors(context.getParent(),?NacosConfigProperties.class).length?>?0)?{ return?BeanFactoryUtils.beanOfTypeIncludingAncestors(context.getParent(),NacosConfigProperties.class);}return?new?NacosConfigProperties();}//?Nacos?配置刷新属性@Beanpublic?NacosRefreshProperties?nacosRefreshProperties()?{ return?new?NacosRefreshProperties();}//?Nacos?刷新历史@Beanpublic?NacosRefreshHistory?nacosRefreshHistory()?{ return?new?NacosRefreshHistory();}//?Nacos?配置管理@Beanpublic?NacosConfigManager?nacosConfigManager(NacosConfigProperties?nacosConfigProperties)?{ return?new?NacosConfigManager(nacosConfigProperties);}//?Nacos?配置刷新@Beanpublic?NacosContextRefresher?nacosContextRefresher(NacosConfigManager?nacosConfigManager,NacosRefreshHistory?nacosRefreshHistory)?{ return?new?NacosContextRefresher(nacosConfigManager,?nacosRefreshHistory);}}NacosContextRefresher 配置中心刷新public?NacosContextRefresher(NacosConfigManager?nacosConfigManager,NacosRefreshHistory?refreshHistory)?{ //?获取配置属性信息this.nacosConfigProperties?=?nacosConfigManager.getNacosConfigProperties();//?刷新历史this.nacosRefreshHistory?=?refreshHistory;//?获取配置服务this.configService?=?nacosConfigManager.getConfigService();//?是否开启刷新,是truethis.isRefreshEnabled?=?this.nacosConfigProperties.isRefreshEnabled();}获取配置服务 getConfigServicenacosConfigManager.getConfigService(),这行代码其实就是为了创建 NcaosConfigService 对象,我们看看你是怎么创建的,其实核心代码就是通过 NacosFactory 反射创建的 NcaosConfigService 对象,这个对象是一个核心对象后续会讲到的
public?static?ConfigService?createConfigService(Properties?properties)?throws?NacosException?{ try?{ //?加载?NacosConfigService?类Class<?>?driverImplClass?=?Class.forName("com.alibaba.nacos.client.config.NacosConfigService");//?获取构造器Constructor?constructor?=?driverImplClass.getConstructor(Properties.class);//?创建实例ConfigService?vendorImpl?=?(ConfigService)?constructor.newInstance(properties);return?vendorImpl;}?catch?(Throwable?e)?{ throw?new?NacosException(NacosException.CLIENT_INVALID_PARAM,?e);}}监听器NacosContextRefresher 实现了 ApplicationListener ,一看这就是一个监听器了,我们看看这个在监听器里面做了什么操作
@Overridepublic?void?onApplicationEvent(ApplicationReadyEvent?event)?{ //?这是一个?CAS?操作,只设置一次if?(this.ready.compareAndSet(false,?true))?{ //?注册?Nacos?监听器对于应用this.registerNacosListenersForApplications();}}注册 Nacos 监听/**register Nacos Listeners. 注册Nacos监听器 */ private void registerNacosListenersForApplications() { // 默认是 true if (isRefreshEnabled()) { // 遍历Nacos属性资源中心 for (NacosPropertySource propertySource : NacosPropertySourceRepository .getAll()) { if (!propertySource.isRefreshable()) { continue; } // 获取资源ID ?String dataId = propertySource.getDataId(); // 通过组和 dataId 注册 Nacos 监听器 registerNacosListener(propertySource.getGroup(), dataId); } } }
private void registerNacosListener(final String groupKey, final String dataKey) { // 构建 Key 信息 String key = NacosPropertySourceRepository.getMapKey(dataKey, groupKey); // 在 listenerMap中放入了 key 对应 AbstractSharedListener 响应的方法 Listener listener = listenerMap.computeIfAbsent(key, lst -> new AbstractSharedListener() { @Override public void innerReceive(String dataId, String group, String configInfo) { // 刷新次数 refreshCountIncrement(); // 记录刷新历史,就是改变历史 nacosRefreshHistory.addRefreshRecord(dataId, group, configInfo); // 发布刷新事件 applicationContext.publishEvent( new RefreshEvent(this, null, "Refresh Nacos config")); } }); // 向配置服务中添加监听器 configService.addListener(dataKey, groupKey, listener);
}
####?向配置服务中添加监听器 此时调用的是?NacosConfigService?中的?addListener?方法,但是最终执行的还是?ClientWorker?中的?addTenantListeners?方法,后面会进行分析?ClientWorker?这个类的```java@Overridepublic?void?addListener(String?dataId,?String?group,?Listener?listener)?throws?NacosException?{ //?这个?ClientWorker?worker?也是一个核心类worker.addTenantListeners(dataId,?group,?Arrays.asList(listener));}构建 CacheData 信息此时向 ClientWorker 中的 CacheData 中添加数据,之后遍历监听器添加到 CacheData 中
创建 CacheData 对象public?CacheData(ConfigFilterChainManager?configFilterChainManager,?String?name,?String?dataId,?String?group,String?tenant)?{ //?dataId?不能为空if?(null?==?dataId?||?null?==?group)?{ throw?new?IllegalArgumentException("dataId="?+?dataId?+?",?group="?+?group);}this.name?=?name;this.configFilterChainManager?=?configFilterChainManager;this.dataId?=?dataId;?//?设置dataIdthis.group?=?group;?//?设置组信息this.tenant?=?tenant;?//?设置租户listeners?=?new?CopyOnWriteArrayList<ManagerListenerWrap>();?//?装饰器集合this.isInitializing?=?true;//?加载缓存数据从本地磁盘this.content?=?loadCacheContentFromDiskLocal(name,?dataId,?group,?tenant);//?计算本地缓存信息的MD5this.md5?=?getMd5String(content);}向 CacheData 中添加数据public?void?addTenantListeners(String?dataId,?String?group,List<?extends?Listener>?listeners)throws?NacosException?{ //?DefaultGroupgroup?=?null2defaultGroup(group);String?tenant?=?agent.getTenant();?//?是?""//?向缓存数据中添加监听器CacheData?cache?=?addCacheDataIfAbsent(dataId,?group,?tenant);for?(Listener?listener?:?listeners)?{ cache.addListener(listener);}}public?CacheData?addCacheDataIfAbsent(String?dataId,?String?group,?String?tenant)throws?NacosException?{ //?获取Key信息String?key?=?GroupKey.getKeyTenant(dataId,?group,?tenant);//?在缓存?Map?中获取缓存数据CacheData?cacheData?=?cacheMap.get(key);//?如果不为空的情况下那么就返回,如果为空那么就创建一个?CacheDataif?(cacheData?!=?null)?{ return?cacheData;}//?创建一个?CacheData?cacheData?=?new?CacheData(configFilterChainManager,?agent.getName(),dataId,?group,?tenant);//?将创建好的?cacheData?放入缓存?Map?中CacheData?lastCacheData?=?cacheMap.putIfAbsent(key,?cacheData);//?如果缓存数据为空的话那么从配置中心拉取,不过此时不为空if?(lastCacheData?==?null)?{ //fix?issue?#?if?(enableRemoteSyncConfig)?{ String[]?ct?=?getServerConfig(dataId,?group,?tenant,?L);cacheData.setContent(ct[0]);}//?计算任务IDint?taskId?=?cacheMap.size()?/?(int)?ParamUtil.getPerTaskConfigSize();//?设置任务IDcacheData.setTaskId(taskId);lastCacheData?=?cacheData;}//?缓存数据初始化完成//?reset?so?that?server?not?hang?this?checklastCacheData.setInitializing(true);LOGGER.info("[{ }]?[subscribe]?{ }",?agent.getName(),?key);MetricsMonitor.getListenConfigCountMonitor().set(cacheMap.size());//?返回最新的缓存数据return?lastCacheData;}到这里 CacheData 对象 和 cacheMap 集合已经构建完成了,后续会用到这个数据的
NacosConfigService 分析NacosConfigService这个类在创建的时候主要做了什么事情,这这里面创建了一个 ClientWorker对象,这个对象是一个核心的类,有关于配置的一些操作都是归功于 ClientWorker类
public?NacosConfigService(Properties?properties)?throws?NacosException?{ ......this.agent?=?new?MetricsHttpAgent(new?ServerHttpAgent(properties));this.agent.start();//?核心工作类this.worker?=?new?ClientWorker(this.agent,this.configFilterChainManager,?properties);}核心配置类 ClientWorker分析一下这个类都在做什么事情,都有哪些核心方法 其实能看到里面有一个构造函数、添加缓存数据、添加监听器、检查配置中心相关方法、获取服务配置、解析数据响应、移除缓存数据、删除监听器以及 shutdown方法
构造函数看到这里其实看到了定义了两个调度线程池,一个是用于配置检测的,一个是用于执行长轮询服务的
@SuppressWarnings("PMD.ThreadPoolCreationRule")public?ClientWorker(final?HttpAgent?agent,final?ConfigFilterChainManager?configFilterChainManager,?final?Properties?properties){ this.agent?=?agent;this.configFilterChainManager?=?configFilterChainManager;//?初始化操作init(properties);//?定义一个调度线程池,只有一个线程还是守护线程this.executor?=?Executors.newScheduledThreadPool(1,?new?ThreadFactory()?{ @Overridepublic?Thread?newThread(Runnable?r)?{ Thread?t?=?new?Thread(r);t.setName("com.alibaba.nacos.client.Worker."?+?agent.getName());t.setDaemon(true);return?t;}});//?定义一个多个线程的调度线程池,线程个数和CPU?核心数有关,也是守护线程,是一个长轮询this.executorService?=?Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(),?new?ThreadFactory()?{ @Overridepublic?Thread?newThread(Runnable?r)?{ Thread?t?=?new?Thread(r);t.setName("com.alibaba.nacos.client.Worker.longPolling."?+agent.getName());t.setDaemon(true);return?t;}});//?定义一个定时的调度任务,第一次执行的时候延时1毫秒,后续毫秒调度一次this.executor.scheduleWithFixedDelay(new?Runnable()?{ @Overridepublic?void?run()?{ try?{ //?检查配置信息方法checkConfigInfo();}?catch?(Throwable?e)?{ LOGGER.error("["?+?agent.getName()?+?"]?"+?"[sub-check]?rotate?check?error",?e);}}},?1L,?L,?TimeUnit.MILLISECONDS);}检查配置服务方法这个 cacheMap 包含了一些任务信息,这里面的任务是怎么来的呢,他是在添加监听器的时候添加的,上面已经分析过了
public?NacosContextRefresher(NacosConfigManager?nacosConfigManager,NacosRefreshHistory?refreshHistory)?{ //?获取配置属性信息this.nacosConfigProperties?=?nacosConfigManager.getNacosConfigProperties();//?刷新历史this.nacosRefreshHistory?=?refreshHistory;//?获取配置服务this.configService?=?nacosConfigManager.getConfigService();//?是否开启刷新,是truethis.isRefreshEnabled?=?this.nacosConfigProperties.isRefreshEnabled();}0长轮询任务 LongPollingRunnable第三届oceanbase数据库大赛决赛|赛题相关源码解析
第三届OceanBase数据库大赛决赛中,选手们需要掌握的比赛知识点已由官方答疑材料详尽解析,这里我们汇总了与比赛相关的架构和概念要点。OceanBase 4.0架构采用无共享集群,由对等节点组成,每个节点独立运行存储、SQL和事务引擎,提供高可用、高性能和低成本服务。单机分布式一体化设计使4.x版本在单机内操作时性能更优。
核心概念包括数据分区(如范围分区、哈希分区等),副本分布保证数据可靠性,OBServer管理分区数据并协调其他节点执行SQL请求。集群通过OBProxy和负载均衡层实现全集群负载均衡。
OceanBase中的关键组件如总控服务负责资源调度和元数据管理,元数据表如__all_core_table和__all_root_table存储系统和用户表信息。4.x版本引入meta租户和日志流优化,减少系统负载。
大赛涉及的模块源码解析中,如Bootstrap流程,涉及创建1号日志流和执行Bootstrap操作。Create tenant流程涉及状态机和核心函数执行顺序。
Bootstrap流程包括发起创建日志流和执行execute_bootstrap,create_all_schema函数是关键步骤。而数据分区的迁移在4.x版本通过动态绑定日志流实现自动化。
理解这些概念和流程对于参赛者来说至关重要,涉及到的模块源码如集群初始化、模式服务、DDL操作等都是比赛深入理解的基石。记住,对系统表如__all_core_table和简单模式的理解也是参赛者必须掌握的。