1.��Ʒѡ��Դ��
2.低代码平台选型(二)部署篇
3.golang本地缓存(bigcache/freecache/fastcache等)选型对比及原理总结
4.unibest uniapp + vue3 模板 UI 框架选型
5.从 Egg.js 到 NestJS,产品产品爱码客后端选型之路
6.我找外包公司开发了一个APP,选型选型现在外包公司倒闭了怎么办?
��Ʒѡ��Դ��
云HIS医院管理系统源码,SaaS模式+Java云HIS系统融合B/S版开箱即用
一、源码源码云HIS系统简介
基于SaaS服务的产品产品Java版云HIS系统,适用于公立二甲医院,选型选型历经三年持续优化,源码源码动力线源码系统稳定、产品产品功能全面,选型选型界面布局合理、源码源码操作简便。产品产品采用云端服务形式,选型选型用户通过浏览器即可访问,源码源码无需关注系统部署、产品产品维护、选型选型升级等问题。源码源码系统采用模板化、配置化、智能化、扩展化设计,覆盖基层医疗机构主要工作流程,与监管系统对接有序,满足未来扩展需求,是基层医院所需的健康云产品。支持病患预约挂号、问诊、电子病历、开药发药、会员管理、统计查询、医生工作站、护士工作站等常规功能,并能与公卫、PACS、HIS等外部系统融合,实现多层机构间的融合管理。
二、云HIS总体框架
技术选型包括前后端分离模式,前端选用原生HTML、JS、CSS、Jquery、BootStrap、layui等技术,后端采用SpringBoot框架、Mybatis-Plus、WebSocket、Stomp、Vintage-Engine、Thymeleaf等技术,数据库使用MySQL。系统架构采用Angular+Nginx+ Java+Spring,SpringBoot+ MySQL + MyCat。
三、云HIS系统亮点
1. 融合B/S版电子病历系统,gif语言源码支持四级电子病历,拥有自主知识产权。
2. 全系统云部署,一套系统支持多家医院共用。
3. 适用于二级医院、基层医疗机构,可作为区域HIS使用,扩展后可用于医联体/医共体。
4. 提供独立SaaS模式运维管理系统,支持远程运维,运维功能丰富、便捷。
5. 前后端分离架构,前端用Angular、JavaScript开发,后端使用Java。
6. 遵循服务化、模块化原则开发,具有强大扩展性,二次开发简便快捷。
7. 提供全面开发文档和产品文档,助力快速熟悉源码,售后服务完善。
四、云HIS系统功能模块
包含系统管理、电子病历、门诊管理、门诊医生工作站、住院管理、住院医生管理、护士工作站、药房管理、药库管理、统计分析、财务管理、病案管理、就诊卡管理、项目收费查询、病历质控、医保结算接口等功能。
云HIS分为综合管理和业务系统两大模块,综合管理系统面向运营商、开发商和监管机构,提供运营管理、运维管理和综合监管服务;业务系统面向基层医院,支撑医院各类业务运转。
常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、表单类源码媒体管理等,为医院管理提供有力支持。HIS系统以财务信息、病人信息和物资信息为主线,通过收集、存储、传递、统计、分析、查询、报表输出和信息共享,为医院领导及各部门管理人员提供全面、准确的数据服务。
低代码平台选型(二)部署篇
选型低代码平台时,评估其部署能力至关重要。私有化部署,即针对特定企业定制开发,其服务器、存储空间由客户自行管理,或由第三方服务商托管在私有云,资源通过私有网络提供。与之相对的公有化部署,即“SaaS”服务,其服务器、存储空间由第三方管理,资源通过互联网提供。私有化部署类似于企业自行购房,公有化部署则类似于租房。
私有化部署具备成本较低、灵活性高、安全性能强的特点。由于部署在企业内部,服务稳定性和数据安全得到极大保障。这使得私有化部署在数据安全性和隐秘性方面具有天然优势,尤其适合金融、敏感数据行业等对数据安全有极高要求的领域。此外,对于企业系统复杂性高、调整优化需求大的情况下,私有化部署的低代码开发平台能够通过开放接口集成新系统,实现对原有系统的改造升级,降低调整成本。
不同行业和企业用户对软件需求各异,通用软件难以满足特定管理需求。企业处于不同发展阶段,管理需求也不同。因此,个性化定制需求强烈时,选择私有化部署平台成为必要。企业具备服务器和一定技术人员时,直接购买软件不再适合,此时,私有化部署的打车源码下载低代码开发平台可为其量身定制。
市面上的低代码开发厂商众多,但能提供私有化部署的平台并不多。天翎作为国内老牌厂商,自年研发至今已有年历史,拥有丰富的低代码开发经验,能够提供硬核技术和高质量服务。天翎低代码平台支持多种私有化部署方案,可根据用户需求选择,系统响应时间通常在0.5-3秒以内。部署在本地的数据更安全可控,用户能自主二次开发,增强系统扩展性。
天翎提供全部源码,确保用户在不同应用阶段、规模和服务需求下都能得到满足,解决后顾之忧。平台内置Webservice、RestFul、SAP等接口,支持与企业原有系统或智能硬件快速整合,实现互通互联。技术方面,采用SpringBoot微服务架构、SpringCloud模式、前后端分离模式、高可用性架构等,确保系统快速开发、灵活拓展、无缝集成和高性能应用。
golang本地缓存(bigcache/freecache/fastcache等)选型对比及原理总结
以下内容来自腾讯后台研发工程师jayden
导语:提到本地缓存大家都不陌生,只要是个有点经验的后台开发人员,都知道缓存的作用和弊端。本篇文章我们就来简单聊聊在golang做业务开发的过程中,本地缓存的一些可选的开源方案,分析它们的特点,以及内部的实现原理。
1.本地缓存需求分析
首先来梳理一下业务开发过程中经常面临的本地缓存的一些需求。我们一般做缓存就是为了能提高系统的读写性能,缓存的命中率越高,也就意味着缓存的效果越好。其次本地缓存一般都受限于本地内存的大小,所有全量的数据一般存不下。那基于这样的场景一方面是想缓存的数据越多,则命中率理论上也会随着缓存数据的增多而提高;另外一方面是想,既然所有的数据存不下那就想办法利用有限的内存存储有限的数据。这些有限的数据需要是经常访问的,同时有一定时效性(不会频繁改变)的。基于这两个点展开,我们一般对本地缓存会要求其满足支持过期时间、支持淘汰策略。最后再使用自动管理内存的语言例如golang等开发时,还需要考虑在加入本地缓存后引发的GC问题。
分析完我们日常本地缓存的slam源码阈值诉求,再结合我们日常开发用到的golang语言,我们可以提炼得到golang本地缓存组件必须具备以下几个能力:
分析清楚了我们的需求,也明确了我们需要的能力。那自然优先考虑golang内置的标准库中是否存在这样的组件可以直接使用呢?很遗憾,没有。golang中内置的可以直接用来做本地缓存的无非就是map和sync.Map。而这两者中,map是非并发安全的数据结构,在使用时需要加锁;而sync.Map虽然是线程安全的。但是需要在并发读写时加锁。此外二者均无法支持数据的过期和淘汰,同时在存储大量数据时,又会产生比较频繁的GC问题,更严重的情况下导致线上服务无法稳定运行。
既然标准库中没有我们满足上述需求的本地缓存组件,那我们就想只有两种解决方案了
那首先面临的第一个问题就是方案的调研和选型,没有合适的方案时自己再来动手构建。下面我们就来给大家介绍下golang中哪些可以直接来使用的本地缓存组件吧。
2.golang本地缓存组件概览
golang中本地缓存方案可选的有如下一些:
下面通过笔者一段时间的调研和研究,将golang可选的开源本地缓存组件汇总为下表,方便大家在方案选型时作参考。
在上述方案中,freecache、bigcache、fastcache、ristretto、groupcache这几个大家根据实际的业务场景首选,offheap有定制需求时可考虑。
通过上表的总结,个人想再此再谈几点关于本地缓存组件的理解:
(1)上述本地缓存组件中,实现零GC的方案主要就两种:
a.无GC:分配堆外内存(Mmap)
b.避免GC:map非指针优化(map[uint]uint)或者采用slice实现一套无指针的map
c.避免GC:数据存入[]byte slice(可考虑底层采用环形队列封装循环使用空间)
(2)实现高性能的关键在于:
a.数据分片(降低锁的粒度)
3. 主流缓存组件实现原理剖析
在本节中我们会重点分析下freecache、bigcache、fastcache、offheap这几个组件内部的实现原理。
3.1 freecache实现原理
首先分析下freecache的内部实现原理。在freecache中它通过segment来进行对数据分片,freecache内部包含个segment,每个segment维护一把互斥锁,每一条kv数据进来后首先会根据k进行计算其hash值,然后根据hash值决定当前的这条数据落入到哪个segment中。
对于每个segment而言,它由索引、数据两部分构成。
索引:其中索引最简单的方式采用map来维护,例如map[uint]uint这种。而freecache并没有采用这种做法,而是通过采用slice来底层实现一套无指针的map,以此避免GC扫描。
数据:数据采用环形缓冲区来循环使用,底层采用[]byte进行封装实现。数据写入环形缓冲区后,记录写入的位置index作为索引,读取时首先读取数据header信息,然后再读取kv数据。
在freecache中数据的传递过程是:freecache->segment->(slot,ringbuffer) 下图是freecache的内部实现框架图。
总结: freecache通过利用数据分片减小锁的粒度,然后再存储时索引并没有采用内置的map来维护而是采用自建map减少指针来避免GC,同时数据存储时采用预先分配内存然后后边循环使用。通过上述两种方法保证了在堆上分配内存同时减少GC对系统性能的影响。
3.2 bigcache实现原理
bigcache和freecache类似,也是一个零GC、高性能的cache组件,但是它的实现和freecache还是有些差异,这儿有篇 英文博客介绍bigcache设计原理的,内容稍长感兴趣的可以阅读下,下面我们介绍一下bigcache的实现原理。
bigcache同样是采用分片的方式构成,一个bigcache对象包含2^n 个cacheShard对象,默认是个。每个cacheShard对象维护着一把sync.RWLock锁(读写锁)。所有的数据会分散到不同的cacheShard中。
每个cacheShard同样由索引和数据构成。索引采用map[uint]uint来存储,数据采用entry([]byte)环形队列存储。索引中存储的是该条数据在entryBuffer写入的位置pos。每条kv数据按照TLV的格式写入队列。
不过值得注意的是,和bigcache和freecache不同的一点在于它的环形队列可以自动扩容。同时bigcache中数据的过期是通过全局的时间窗口维护的,每个单独的kv无法设置不同的过期时间。
下面是bigcache的内容实现原理框架图。
总结:bigcache思路和freecache大体相同,只不过在索引存储时更为巧妙,直接采用内置的map结构加上基础数据类型来实现。同时底层存储数据的队列也可以根据空间大小来决定是否扩容。唯一的缺陷是无法针对每个key进行设置不同的过期时间。这个个人认为如果想用bigcache同时想要这个特性,可以进行二次开发一下。
通过 性能测试数据来看,bigcache性能要比freecache稍微好一点。大家可以思考下他们性能的差异可能会在哪里呢?
3.3 fastcache实现原理
本节介绍下fastcache的实现原理,根据fastcache官方文档介绍,它的灵感来自于bigcache。所以整体的思路和bigcache很类似,数据通过bucket进行分片。fastcache由个bucket构成。每个bucket维护一把读写锁。在bucket内部数据同理是索引、数据两部分构成。索引用map[uint]uint存储。数据采用chunks二维的切片(二维数组)存储。不过值得注意的是fastcache有一个很大的特性是,它的内存分配是在堆外分配的,而不是在堆上分配的。堆外分配的内存。这样做也就避免了golang GC的影响。下图是fastcache内部实现框架图。
总结: fastcache一方面充分利用了分片来降低锁的粒度,另一方面在索引存储时采用了对map的优化,同时在分配内存时,直接从堆外申请内存,自己实现了分配和释放内存的逻辑。通过上述手段使得GC的影响降到了最低。fastcache唯一的缺陷是官方提供的版本没有提供针对kv数据的过期时间这个特性。所以如果需要这个特性的话,需要自己动手二次开发。整体从性能上来看是比bigcache和freecache都更优。
3.4 offheap实现原理
本节介绍下offheap的相关内容,offheap其实功能就比较简单了,就是一个基于堆外内存构建的哈希表。它通过直接调用系统调用函数来分配内存。然后在内部通过数组来实现哈希表。实现过程中当发生哈希冲突时,它是采用探测法来解决。由于是在堆外分配的内存上构建的哈希表。导致它的GC开销非常的小。下图是offheap的内部实现框架图。
总结:offheap内部由于是采用探测法解决哈希冲突的,所以当哈希冲突严重时数据删除、查询都会带来非常复杂的处理流程。而且性能也会有一些损耗。可以作为学习和研究的项目还是非常不错的。
4.总结
本文主要从日常需求出发,分析了日常业务过程中对本地缓存的需求,再调研了业界可选的一些组件并进行了对比,希望对本地缓存选型上起到一些参考和帮助。最后再对其中比较重要的几个组件如freecache、bigcache、fastcache、offheap等做了内部实现的简单介绍。上述内容只是从架构层面展开介绍,后续有时间再从源码层面做一些分析。由于篇幅限制本篇内容并未对map、sync.Map、go-cache、groupcache进行介绍。感兴趣的读者可以自行搜索资料进行阅读。如果大致理解了上述原理的童鞋也可以自己动手实践起来,造个轮子看看。
5.参考资料
欢迎点赞分享,关注 @鹅厂架构师,一起探索更多业界领先产品技术。
unibest uniapp + vue3 模板 UI 框架选型
在构建uniapp + vue3 + ts项目的unibest模板时,UI框架的选择显得尤为重要。uview虽曾是vue2时代的热门选项,但已不适用于当前项目需求。官方维护的uni-ui凭借全端支持和类型提示的特性,已内置在unibest中,可根据需要定制组件使用。另外,两个开源且部分收费的UI框架也值得考量。
在年2月日的对比中,uview系列脱颖而出,其中uv-ui凭借微弱优势胜过uview-plus。通过实地考察和组件对比,uv-ui最终被选定为unibest的UI框架。尽管源码仓库链接仅为查阅方便,但实际使用中,ts支持和类型提示是关键。
经过一番筛选,uv-ui以其开源热度、多端支持、丰富的组件库和对ts的良好支持,成为unibest项目的最佳选择。为支持开源社区,我已向uv-ui作者捐赠咖啡以示感谢。同样,对其他候选框架,我也尽微薄之力表示支持。
值得一提的是,unibest作为一款备受关注的开发模板,近一个月的star数和收藏数均有显著增长,表现出其在uniapp开发领域的强大实力。
从 Egg.js 到 NestJS,爱码客后端选型之路
爱码客3.0 开发,回顾一年历程,我从 Egg.js 转向 NestJS,选型之路,经历探索与挑战。
最初,Egg.js 以其约定大于配置的特性,简化了开发流程。然而,对于团队组织结构与代码分类的需求,Egg.js 的目录规范限制了灵活性。我深入研究 Egg.js 文档与源码,发现自定义 loader 实现个性化目录结构,需基于 Egg.js 创建新框架,过程复杂。
面临 Egg.js 对 TypeScript 支持的局限,我寻找替代方案,最终决定转向 NestJS。NestJS 原生支持 TypeScript,提供 OOP、FP 和 FRP 等功能,底层采用 Express 或 Fastify 等强大 HTTP Server。其设计理念与 Spring 类似,基于 IoC 原则,使用依赖注入,解耦模块,提高代码可测试性。
NestJS 的依赖注入机制,无需指定位置查找依赖,简化了目录结构组织。使用 @Injectable 修饰的 Service,可在注册后直接注入,无需关心具体位置,增强了模块间的解耦与灵活性。
选择 NestJS 后,代码结构清晰,开发效率提高。NestJS 的优势在于 TypeScript 支持、微服务架构和依赖自动扫描,适合集团内开发场景。在大规模项目中,NestJS 的设计理念和开发约束能提供显著的帮助。
回顾过去,从 Egg.js 到 NestJS 的选择,经历了多次尝试与调整。历史的推动力使我们最终选择了 NestJS。虽然中途 Egg.js 继续发展,成为集团内标准框架,但选择 NestJS 的决策已定。时间流转,技术迭代,爱码客项目顺利推进,选型之路,虽有曲折,但终达目的地。
经历的探索与挑战,不仅是一个技术选型的故事,更是个人成长与团队协作的见证。文章旨在分享这段历程,供参考与借鉴。希望对其他开发者有所启发,欢迎有激情的你加入 ES Studio,共同探索技术的奥秘。
我找外包公司开发了一个APP,现在外包公司倒闭了怎么办?
1、临时应急办法,找他们老板理论和索赔是不可能了,但是你们可以绕过老板找当初帮你们做这个app的技术人员,花点钱让他们做维护升级(当然你们得花点钱)或者看能不能让他们把源码交出来(当然你们得有技术人员接的过来);
2、长远的办法,找一家做开发平台的软件公司把现有的app进行快速重构,因为是基于开发平台快速配置的,所以技术难度不会比从底层源码开发的难,你们耶不至于处处受制于乙方,当然这要看你们的app是哪种类型了,如果是企业管理软件类(比如OA)那可以找天翎、起步、普元这种开发平台厂商,都是做了十几年的,不会出现你说的一下子倒闭了,如果是电商类app,恕我直言,我只能建议你们下次选型供应商的时候去启信宝查一查,公司成立没超过5年的一律过滤就对了!
有什么推荐的开发平台?
开发平台太多了;譬如:炎黄的、泛微的、天翎的、致远的、其实各自又自己维度的颗粒度:
1、产品是开放源码程度,并且尺度很大,譬如炎黄和天翎的部分版本,是提供全部源码
2、针对注册用户和并发用户等,针对平台工具,一般也有区别,泛微,致远,炎黄很多版本按照一定标准做好配置,那么天翎是不限制用户和注册以及部署环境的
3、针对产品的在二次开发依赖供货商依赖程度:譬如泛微、蓝凌致远、有些价格也会提供源码,但是你部分提供,提供客户需要应用的,不是所有的,炎黄集团版和天翎是企业版和集团版都是提供源码的,所以无论企业自己都是可以二开或配置,满足变更的需求的;但是泛微蓝凌和致远,就需要供货商才可以做好二开,并且这个如果理解的诉求偏离,那么工作量就是扩散了。
4、社区售后制度:每一家都有自己的售后团队,分别是整体服务,还是一对一服务,几个角度,再来结合升级的机制,技术协助,以及孵化客户开发团队的培养;最后就是针对孵化客户开发团队的培养。teemlink有自己的孵化团队,整理归档以往案例,结合用户统一培训和整体孵化他们互相间的合作协同,共同来学习使用软件
体验了下天翎平台的,对比了下炎黄的,各有优缺点,魔方的没有体验,所以没有发言权,找个时间体验下,感受各自的差异:
目前很多号称可以支持微服务和容器部署;体验了下,尤其是流程配置简洁性,或易学性,逐渐觉得还有很多成长空间