草庐IT

微服务低代码Serverless平台(星链)的应用实践

Jcloud 2023-03-28 原文

导读

星链是京东科技消金基础研发部研发的一款研发效能提升的工具平台,面向后端服务研发需求,尤其是集成性、场景化、定制化等难度不太高、但比较繁琐的需求,如服务前端的后端(BFF)、服务流程编排、异步消息处理、定时任务、运营后台、工作流程自动化、临时性需求等,以低代码方式开发微服务,以声明式进行Serverless部署,使研发人员聚焦业务逻辑而非各类细节,大幅提升研发效能、降本增效。

1 星链是什么

星链是京东科技消金基础研发部研发的一款研发效能提升的工具平台,面向后端服务研发需求,尤其是集成性、场景化、定制化等难度不太高、但比较繁琐的需求,如服务前端的后端(BFF)、服务流程编排、异步消息处理、定时任务、运营后台、工作流程自动化、临时性需求等,以低代码方式开发微服务,以声明式进行Serverless部署,使研发人员聚焦业务逻辑而非各类细节,大幅提升研发效能、降本增效。

星链提供了一个统一的Web界面,用户通过它可以完成微服务的开发、调试、构建、测试、部署完整流程。在开发方面,除了支持可视化配置、组件化流程编排,同时支持Java/JavaScript/Groovy等语言,支持引入第三方包,且与Git集成,在低代码的同时不降低灵活性与可控性。在部署方面,实现了声明式部署, 用户不需要关注服务器细节,系统跨集群分组统一智能调度共享的计算资源,在自动满足部署需求的同时节省计算成本,此外,星链是热加载,实现了秒级部署,还有,星链充分考虑了大中型企业内部的实际情况,不同团队的服务完全隔离,测试、预发、生产服务完全隔离,支持灰度发布、加密参数等,计算资源既支持传统虚机,也支持K8s,支持部署至私有云和其他公有云,实现了企业级Serverless。

星链自19年3月份第一版上线以来,不断迭代完善,除广泛支持消费金融各场景业务外,还支持了集团很多其他部门的业务,如财富、支付、营销中台、保险等,历经多次618、双11性能和稳定性考验。为了支持对外交付,应用于更为广泛的场景,星链在21年进行了模块化和产品化改造,不再依赖京东特有中间件,在22年3月份上线京东公有云,支持对外服务。

2 星链核心概念

星链有两个核心概念:VMS和Serverless,下面分别介绍。

2.1 VMS

VMS是指可视化微服务(Visual MicroService),表示一个轻量级微服务应用,是星链中开发和部署的基本单元,称为“可视化”主要是星链支持且提倡以可视化的方式来编排微服务逻辑,VMS同时表示一个简单灵活的微服务编程模型,如图1所示。

图1 VMS编程模型

这个模型的基本思路是让微服务应用的内外依赖组件化、配置化,使开发人员可以聚焦业务逻辑,包含三个核心概念:函数、连接器和触发器。函数封装业务逻辑,由标准的输入/输出以及函数体组成,支持代码函数和BPMN函数。代码函数支持Java、Groovy、JavaScript三种语言,未来会支持更多语言。BPMN函数利用BPMN标准可视化地编排业务逻辑,可以引用代码函数,也可以引用其他BPMN函数,构建复杂业务流程。连接器封装第三方服务,包括RPC服务、HTTP服务、异步消息、缓存服务、配置服务、数据库等。触发器封装函数对外提供服务的方式,支持RPC、HTTP REST API、定时任务和MQ消息触发,每个触发器关联一个函数。星链会不断拓展支持新的触发器和连接器类型,未来也会开放SDK给用户自定义星链不支持的类型。

2.2 Serveless

星链的Serverless概念不是没有服务器,而是尽量抽象,使用户尽量减少对服务器细节的关注。用户仍然需要关注计算资源,尤其在企业内,用户需要关注资源成本分摊,需要关注资源所处的机房以保证高可用性,星链对用户需要关注的事情进行了抽象,建立了一个计算资源模型和声明式部署模型。星链计算资源模型如图2所示。

图2 计算资源模型

这个模型既支持传统虚机,也支持K8s,集群和分组都是计算资源的抽象,一个集群下有多个分组。集群主要是为了方便管理多个分组,主要属性就是名称和备注,分组有一个环境属性:测试、预发或生产,还有资源类型属性,资源类型支持虚机和K8s。对于K8s类型,一个分组关联一个K8s namespace,星链自动创建和管理计算引擎Pod。对于虚机,需通过其他方式创建计算引擎,然后将引擎IP关联至星链分组。用户在开发、调试、测试阶段不需要申请任何计算资源。部署生产时,需自行申请K8s资源或虚机资源,然后关联到星链集群和分组,每个团队只需申请和配置一次。声明式部署对于K8s分组和虚机分组都是一样的,模型如图3所示。

图3 声明式部署模型

每个环境(测试、预发、生产)有不同的部署配置。每个环境下可以有多个部署配置,以流量入口加以区分。每个入口配置可能包括多个条目,每个条目声明在哪个集群分组、部署哪个版本、期望的实例个数配置等。系统将智能分配计算资源,监控运行状况,确保满足部署声明要求。

3 星链应用场景

星链有很多应用场景,下面分别介绍。

3.1 业务流程编排

在微服务系统中,有很多各类微服务,但可以粗分为两类,一类是相对稳定的、与场景关系不大的、沉淀下来的领域原子微服务,另一类是相对变化多端的、面向场景的、数量众多的场景化微服务,场景化微服务往往通过整合编排原子化微服务来实现业务流程,而针对不同场景,其流程是不同的,针对一个新的场景,通过创建VMS,可以快速可靠地编排流程,并且将流程可视化,使得业务、产品、测试也都能够理解该流程,提升协作效率,同时每个新场景独立开发和部署,易于管理,不影响现有业务。

3.2 服务前端的后端(BFF)

前端有多种介质,如PC、移动APP、H5、小程序等,每种介质需要的接口可能是不太一样的,前端需要的数据格式与后端微服务也可能不同,另外,前端一个接口需要的数据往往需要后端多个微服务组合提供,可以通过创建VMS来快速满足这些面向前端的接口数据聚合、接口数据适配等需求。

3.3 异步消息处理

在微服务架构中,不同微服务之间往往依赖异步消息进行协同,在一个系统中往往有大量的消息监听逻辑,其中很多处理逻辑往往比较简单,如只是维护缓存、同步状态、转换消息格式等,可以将这些胶水层的消息处理逻辑放到VMS中,以便开发和管理。

3.4 运营后台服务

运营后台往往有很多定制需求,这些需求往往只是一些查询需求,或者是一些简单的更新逻辑,实现这些需求难度不大,但很繁琐耗时,通过VMS来实现这些需求,使用流程编排和配置数据库相关连接器就可以满足需求,不需要写代码。

3.5 定时批处理任务

在一个微服务架构的系统中,往往有很多定时批处理任务,这些任务往往只是凌晨执行,将这些任务构建为VMS,Serverless部署可以大幅节省计算资源。

3.6 临时性业务需求

在实际业务中,往往有很多临时性的业务需求,如提供临时性的运营活动接口、报表、临时数据处理等,通过VMS来实现这些需求,一方面可以快速交付,另一方面Serverless部署,不需要关注计算资源,此外,与现有稳定业务代码相隔离,独立开发和部署,便于管理,不用时可以随时下线。

3.7 工作流程自动化

在日常工作中,往往有一些工作需要自动化,比如异常日志管理:每日查询线上异常日志,将重要的异常日志汇总,通过邮件发送给团队成员,团队成员进行反馈。传统方式是手工操作的,比较繁琐,用程序实现也比较麻烦,且没有合适的应用/服务器承载这些功能,通过星链开发和部署进行工作流程自动化,开发方便,部署简单。

3.8 工作流程自动化

一个VMS内可以创建多个触发器、函数和连接器,可以写Java/Groovy/JavaScript代码,可以引用第三库,可以通过配置的方式访问数据库,且支持事务,这样,业务逻辑不太复杂的普通业务需求都可以通过VMS来实现。

4 星链优势
星链所能做的事情,通过传统开发和部署也可以做,那用星链有什么优势呢?以下这些是来自大量用户的反馈。

  • 开发快:比如,原来开发一个功能要四五天,现在两三天就可以了,而且流程可视化,功能逻辑一目了然。
  • 部署快、省心:原来部署经常要1~2个小时,现在几秒钟就完成了;VMS部署粒度更小了,独立部署,不像原来一个大应用里改了部分公共代码,老担心影响其他业务流程。
  • 不用管理服务器:不用每个应用都申请计算资源,团队申请一次就可以了。
  • 节省成本:大多数服务器计算资源利用率都比较低,星链通过让多个VMS共享计算引擎和动态调度,可以大幅提升计算资源利用率,节省成本。
  • 常用库、中间件升级方便:公司内部各种中间件经常升级、由于安全漏洞等原因各种常用库也需要经常升级,使用星链,不需要用户修改代码,只需要一键更新星链引擎就可以了。
  • 便于协作:产品、研发、测试通过统一的Web视图进行协作,方案评审、代码评审不需要再画单独的流程图,BPMN图即真实流程,点击节点即可查看实现细节。
  • 赋能前端研发:后端很多服务只有Java SDK,而没有Node.js SDK,对于BFF层的工作,即使前端研发有时间可以做,也因为缺乏Java技能而做不了,星链提供了低代码平台,且支持JavaScript,这样,原来必须要后端做的事情前端研发也可以做了。
  • 促进产生更好的设计:通过BPMN图表达业务逻辑,可以更容易促使用户去思考和梳理整体逻辑,将实现细节封装到具体节点中,从而产生更清晰完善的设计。

5 星链产品功能

下面介绍星链提供的各种功能及特色。

5.1 可视化低代码 Cloud Web IDE

星链提供了一个低代码Cloud Web IDE,通过可视化微服务编排提高开发效率,如图4所示。

图4 Cloud Web IDE

星链IDE支持的特性有下面这些。

  • 可视化BPMN编排:支持编排各种连接器方法、代码函数、其他BPMN函数,支持分支、异常处理,支持DB事务,自动提示请求参数、环境变量、中间节点的输出结果等上下文信息,支持使用表达式表达复杂的条件分支、输入变量。
  • 自定义DB/HTTP连接器:可自定义连接器方法列表,出入参定义支持三种模式:表格、YAML、CSV,支持根据JSON示例推断参数定义,配置的连接器方法可用于BPMN编排和代码函数,DB连接器方法可参与事务。
  • 可视化触发器配置:各种触发器通过界面配置触发机制和调用的函数即可,不需要开发。
  • 表达式编辑器:支持语法高亮、代码提示,有方便的示例和帮助文档,有丰富的内置函数库,可方便构造Map和List组成的复杂对象,支持各种运算。
  • 在线开发代码函数:可视化定义函数出入参,支持Java/JavaScript/Groovy,语法高亮,内置API访问日志、各个连接器、环境变量等。
  • 在线函数Debug:可以在Web上直接运行函数,查看运行结果,查看日志,诊断问题。对于BPMN函数,可以可视化地显示执行轨迹,可显示执行经过的每个节点的输入、输出或异常信息。支持对于远程调用设置Mock返回值,以便于联调。
  • 多Tab页编辑:可以同时编辑多个函数,调试和运行历史都是独立的。
  • 实时保存和校验:实时保存用户的修改到Cloud工作区,实时校验并进行提示。

在DB/HTTP连接器中,可以自定义方法列表。图5展示了一个自定义DB连接器的例子,用户只要定义SQL、输入输出参数就能生成一个方法,在定义过程中,可以随时测试以验证定义是否正确。目前,需要用户使用MyBatis语法输入SQL,未来,星链会提供更为易用、更为智能的方式定义DB连接器。

图5 自定义DB连接器示例

图6展示了一个自定义HTTP连接器的例子,熟悉HTTP基本协议就能快速定义一个方法。未来,星链会提供更为易用和丰富的功能,且支持OpenAPI规范,导入OpenAPI定义文件即可生成HTTP连接器。

图6 自定义HTTP连接器示例

当在线调试BPMN函数时,星链会可视化地显示执行轨迹,方便用户定位问题,执行正确的以绿色显示,错误的以红色显示,且显示错误信息,如图7所示。未来,星链会支持BPMN断点调试。

图7 BPMN函数执行轨迹示例

5.2 自定义业务组件库

星链提供了独特的业务组件库功能,除了提供系统公共组件,星链还支持自定义团队组件。公共组件由系统维护,每个用户都可以使用。系统将不断完善公共组件库建设,在私有化部署中,客户可以自定义系统组件。团队组件由团队自己维护,对其他团队不可见。用户在VMS内自定义的连接器组件(如DB/HTTP连接器)可以导出为团队组件。用户可以在星链控制台中维护团队组件,包括组件分组等。在BPMN编排中,用户可以浏览、查询团队或公共组件,并直接拖拽到编排面板中。如图8所示。

图8 业务组件库

5.3 支持本地IDE开发

与大多数低代码平台是黑盒子不同, 星链开发的VMS保存在Git代码仓库上,源码是完全可见的,用户可以克隆到本地,使用本地IDE开发、调试和运行单测,在本地开发中,可以引入第三方包(如Java语言的jar包,JavaScript语言的npm包等),并在代码函数中使用这些包,而且,本地提交后,在Cloud Web IDE上也完全兼容可见。在Cloud Web IDE上也支持Git操作,包括切换分支、提交、查看提交历史、对比变更等,如图9所示。

图9 基于Git的本地与云协作开发

5.4 集成构建发布流程

星链支持一键在线构建打包,可以实时查看构建日志。为了管控上线质量,星链集成上线审批流程,如图10所示。

图10 集成构建发布流程

5.5 企业级Serveless

在星链中开发、测试、部署,不需要关注服务器细节,在部署时,只需要说明部署的集群分组、需要部署的实例个数、部署的版本即可,可以在一次部署中声明多个集群分组,这些分组可以位于不同的机房、可用区,系统自动调度。声明式部署可以方便地支持灰度发布、扩缩容,只需要修改版本声明、实例个数即可,系统自动调整。支持部署环境隔离,区分测试、预发、生产不同环境。复用计算引擎资源,没有冷启动,热加载,部署快。支持部署态加密环境变量,针对敏感变量加密存储,确保安全。示例部署配置如图11所示。

 

图11 声明式部署配置

星链有独立的Serverless部署控制网关和计算引擎模块,可以部署至私有云和其他公有云。用户创建的计算资源,系统提供若干管理功能,包括添加引擎、禁用引擎、启用引擎等,系统会根据可用引擎情况动态调度VMS。

5.6 集成的可观测性

星链部署状态一目了然,包括整体状态是否符合预期,部署的集群、分组、引擎详情等,如图12所示。

图12 部署状态

星链为函数主要执行节点自动添加日志。可以在部署状态设置日志级别,可以在星链上直接查看和搜索日志,以便于问题诊断,如图13所示。

图13 集成的日志

在京东内部和京东公有云上,星链集成了京东的日志、监控等更为专业的服务,用户可以利用这些工具进行日志查看、监控和报警。

5.7 高性能可拓展的多语言执行引擎

自19年3月份上线以来,星链执行引擎在京东内部应用中已历经多次618、双11考验。星链引擎是为高性能、低延时场景设计的,如果用户没有配置有状态节点(如在流程中间等待异步消息),星链是无状态内存执行的,相比业界大多基于数据库或消息系统的编排引擎,延时低,更适合服务编排,广泛应用于面向C端用户的高并发、低延时场景。此外,星链引擎是一个多语言执行引擎,目前支持Java、JavaScript、Groovy,各个语言都支持调用各种连接器方法、都提供常用API,也在规划支持更多语言(如Python)。此外,星链引擎采用了微内核、模块化架构,可以方便地根据场景进行扩展、调整。未来,也将允许用户自定义触发器、连接器、及其他功能组件。

5.8 团队协作与管理

星链提供了方便的VMS协作与管理功能。在星链中,VMS和计算资源都属于一个团队,团队中成员有四种角色:开发、测试、访客和管理员,每种角色有不同权限,管理员可以添加/删除成员。一个用户可以加入多个团队,默认有一个专属的个人团队,可以在其中试用星链,还会默认加入demo团队,以方便查看系统提供的示例VMS。在创建VMS时,可以通过克隆已有VMS的方式快速新建VMS。VMS支持分组、分级管理。管理员可以将VMS迁移至其他团队,以方便实现在大中型企业中经常发生的组织和业务调整需求。

6 小结

本文介绍了星链的功能、核心概念、应用场景、优势和主要产品功能,简单总结来说,星链是一个微服务低代码Serverless平台,用户通过统一的Web界面完成可视化微服务(VMS)的开发、调试、构建、测试、部署完整流程,以可视化、组件编排方式低代码开发微服务,以声明式进行Serverless部署,快速交付如服务前端的后端(BFF)、服务流程编排、异步消息处理、定时任务、运营后台、工作流程自动化、临时性需求等场景化、定制化业务研发需求,降本增效。星链的特色是满足高并发、低延时C端服务要求,低代码但不牺牲灵活性和可控性,支持企业级Serverless,计算资源利用率高、成本低。

有关微服务低代码Serverless平台(星链)的应用实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  10. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

随机推荐