UMC面向Serverless的全栈开发架构,用后端体系开发原生移动应用

简介: 在使用serverless中的Faas,虽然有Spring Boot和net Core迁移方案,但有此迁移过于复杂,难以做到平滑无缝迁移,因此我们需要一套面对Serverless的开发架构,即能平滑无缝迁移到Faas,又能快速到本地启动,方便开发调试的架构。今天发现一个新的全栈开发架构UMC,他的特性好像为Serverless而生的,做到在本地和Serverless无缝集成。在计算机语言上也支持java和C#

UMC介绍

UMC的全名是UI Model Command,意思是让UI响应服务端的模块指令,实现上就是设计了一套客户端与服务端交互的文本协议,此协议能让就是客户端用标准请求服务端、服务端用标准JSON格式响应客户端。客户端分析出JSON端包含的事件,数据和UI组件,达到操控和绘制客户端目的,现在服务端我们已经用java.net实现了此标准协议(后期我们会实现其他计算机语言),现在java后端工程师和.net后端工程师只要用此架构开发,就能快速实现了原生Android和原生IOS端和H5端和小程序(嵌套H5,后期会用原生小程序实现),H5都已经开源,此协议用一套标准,统一实现PC和H5端,小程序端,安卓和苹果端的界面实现和后台逻辑。
这也意为做,一个统一的后台就可以管理各个终端,用此实现的业务不但开发维护简单,业务维护也更简单,对公司而言,有后端工程师就有各IOS和Android的团队班子,对于后端工程师更是赋能,现在他们能开发Android和IOS应用了,对于Android和IOS工程师,让他们告别杂乱UI绘制和UI跳转方式,进入终端的组件式开发,且只要对新组件实现就可以了,让终端开发更简单,对发布来太太减少APP版本发布次数,我也相信每个后台工程师和Android和IOS工程师都愿意掌握此技能。
UMC是在数据通信上是采用Http GET方式请求,为什么采用GET方式呢,客户端与服务端做为非文件交互,整体来说交互所要的数据是相当少,GET方式足可满足我们应用需要,如果需要文件交互,则采用先把资源上传到文件服务器,再来由UMC处理,这样就简单高效了,还不用占用带宽,又起服务器分流等做用,此设计为我分布式和API高性能网关提供了前期基础。
再来说交互路由吧,我们用GETQueryString来交互传参,我们保留jsonp参数做跨域使用,还有_model_cmd就是我们的ModelCommand,再除去_开头的参数就是这次有效请求的参数,就这样根据ModelCommand带着参数去路由,跑一遍,把再结果返回给客户端,就这样完成这次请求了,他的原理就是这样回事。下面我用java讲解如何实现。

UMC的IWebFactory、WebFlow、WebActivity

请求路由路线是由model和cmd来确认,他对应的后台路由类分别为IWebFactory接口,WebFlow基类、WebActivity基类,其中由IWebFactory来确认接收那此model并返回接收WebFlow类,再就WebFlow类确认cmd,由那个WebActivity处理,整个处理路由就是这样,下面我们就来讲解此逻辑

IWebFactory

//IWebFactory
public class FlowFactory implements IWebFactory {
    @Override
    public void init(WebContext context) {

    }

    @Override
    public WebFlow flowHandler(String mode) {
        switch (mode) {
            case "Account":
                return new AccountFlow();
        }
        return WebFlow.Empty;
    }
}

WebFlow

上例代码展示,此IWebFactory只接收Accountmodel,此模块的cmd路由由AccountFlow处理,下面我们就查看AccountFlow代码

public class AccountFlow extends WebFlow {
    @Override
    public WebActivity firstActivity() {
        switch (this.context().request().cmd()) {
            case "Login":
                return new AccountLoginActivity();
            case "Register":
                return new AccountRegisterActivity();
            case "Forget":
                return new AccountForgetActivity();
            case "Password":
                return new AccountPasswordActivity();
        }

        return WebActivity.Empty;
    }
}

从上列代码可以就看到AccountFlow,可以路由指令LoginRegisterForgetPassword,每个指令都有自己的WebActivity,WebActivity就是我们的业务实现了,处理业务业务方法在processActivity,下面我就用AccountLoginActivity来说明WebActivity的处理方式

WebActivity

public class AccountLoginActivity extends WebActivity {
    @Override
    public void processActivity(WebRequest request, WebResponse response) {

        WebMeta user = this.asyncDialog(d ->
        {
            UIFormDialog dialog = new UIFormDialog();
            dialog.title("账户登录");
            dialog.addText("用户名", "Username", "").put("placeholder", "手机/邮箱");
            dialog.addPassword("用户密码", "Password", "");
            dialog.submit("登录", request, "User");//事件对话框
            dialog.addUIIcon('\uf1c6', "忘记密码").put("Model", request.model()).put("Command", "Forget");
            dialog.addUIIcon('\uf234', "注册新用户").put("Model", request.model()).put("Command", "Register");
            return dialog;
        }, "Login");
        String username = user.get("Username");

        Membership userManager = WebADNuke.Security.Membership.Instance();
        int times = userManager.Password(username, passwork, maxTimes);
        switch (times) {
            case 0:
                Identity iden = userManager.Identity(username);

                AccessToken.login(iden, AccessToken.token(), request.isApp() ? "App" : "Client", true);

                this.context().send("User", true);

                break;
            case -2:
                this.prompt("您的用户已经锁定,请过后登录");
                break;
            case -1:
                this.prompt("您的用户不存在,请确定用户名");

                break;
            default:
                this.prompt(String.format("您的用户和密码不正确,您还有%d次机会", maxTimes - times));

                break;
        }
    }
}

我这里先说说processActivity方法的两个参数吧,request,response其中request是请求的所有参数信息都这里,包含客户端环境,是不是APP中,是不是微信中,客户的IP是多少,和QueryString参数,但requestQueryString规整化了,当请求中有modelcmd的时间,QueryString单值可以request.sendValue()获取,多值可以用request.sendValues()得到;当请求无modelcmd的时,则会把请求把QueryString规整化到了对话框中,以对话框的方式获取交互的值;response客户端响应对象,他可以完成数据输出或跳转。一句话就是request是获取客户端信息,response是操作响应内容的;
从上面讲解中,我们知道QueryString会规整到request请求参数中去,这里讲一讲请求参数与箭头函数的之间的关系。箭头函数在什么样的情况下执行呢,只有在请求参数或会话中找到这对话框的参数值,则执行箭头函数获得一个对话框给并返回到客户端;先声明一个对话框,对话框分为单值对话框和表单对话框,先说单值对话框与请求参数对应的关系吧,每个请求的对话框都有一个asyncId,也就是asyncDialog传入进去asyncId,确认asyncId是不是有值,先从会话参数中找,如果没有,从对话框参数池中找,如何不存在对话框参数,检测request.sendValue()还没有值,再用asyncId作为key来检测request.sendValues(),如果都没值的情况下,再去执行箭头函数获取对话框。这就是单值对话框获取值的逻辑,下面我们再说说表单对话框获取值的方式,第一步也是一样从会话参数中找,没有找到,再看对话框参数池是不是表单值,如果不是或没有,再看request.sendValues()是不是能与此次表单asyncId对应,(他的对应关系架构会自行处理)如果不是或没有,再去执行箭头函数获取表单对话框。这就是表单对话框获取值的逻辑;整个对话框都是为了让对话框的asyncId配对QueryString,这也说明只要做准备好WebActivity所要的的参数,就能执行完processActivity逻辑,中途就不会去执行箭头函数。
在对话框中从获取值的方式上,可分为两种,会话对话框和事件对话框,会话对话框前端提交之后就关闭,事件对话框是根据服务端返回的事件,进行关闭或者刷新。在我们的UIGridDialogUIFormDialog都支持这两种模式

现在我们讲解一下上面的AccountLoginActivityprocessActivity,此processActivity有登录表单对话框,此对话框并启用了事件对话框,看dialog.submit("登录", request, "User")这块表示启用了事件对话框模式,
说明这么多,实事上是希望大家理解此模式,这也就UMC架构的业务处理层的核心思想,其他的解译都是丰富这模式下的应用场景。
回头我们再看看AccountLoginActivityprocessActivity方法,可从代码中可以看出,此Activity有绘出一个用户登录的UIFormDialog,还关联到忘记密码和用户注册,这就是我们登录功能的全部代码,是不是简单,掌握他就能开发出高性能的Andord,IOS和H5和小程序,因为他们的对应的客户端都是用原生程序写的,不是比其他任何内嵌引擎的都要快,对应后端工程师来说,掌握他不并跨出后端的知识体系。他用的是后端架构思维,驱动各前端应用,是不是掌握他是不是更有价值呢。

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
9月前
|
数据采集 运维 Serverless
云函数采集架构:Serverless模式下的动态IP与冷启动优化
本文探讨了在Serverless架构中使用云函数进行网页数据采集的挑战与解决方案。针对动态IP、冷启动及目标网站反爬策略等问题,提出了动态代理IP、请求头优化、云函数预热及容错设计等方法。通过网易云音乐歌曲信息采集案例,展示了如何结合Python代码实现高效的数据抓取,包括搜索、歌词与评论的获取。此方案不仅解决了传统采集方式在Serverless环境下的局限,还提升了系统的稳定性和性能。
289 0
|
9月前
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
886 69
|
6月前
|
人工智能 Java API
后端开发必看:零代码实现存量服务改造成MCP服务
本文介绍如何通过 **Nacos** 和 **Higress** 实现存量 Spring Boot 服务的零代码改造,使其支持 MCP 协议,供 AI Agent 调用。全程无需修改业务代码,仅通过配置完成服务注册、协议转换与工具映射,显著降低改造成本,提升服务的可集成性与智能化能力。
1898 1
|
10月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
569 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
6月前
|
前端开发 Java 数据库连接
后端开发中的错误处理实践:原则与实战
在后端开发中,错误处理是保障系统稳定性的关键。本文介绍了错误分类、响应设计、统一处理机制及日志追踪等实践方法,帮助开发者提升系统的可维护性与排障效率,做到防患于未然。
|
8月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
509 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
8月前
|
数据采集 运维 监控
Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
随着互联网数据采集需求的增长,传统爬虫架构因固定IP易封禁、资源浪费及扩展性差等问题逐渐显现。本文提出基于Serverless与代理IP技术的新一代爬虫方案,通过动态轮换IP、弹性调度任务等特性,显著提升启动效率、降低成本并增强并发能力。架构图与代码示例详细展示了其工作原理,性能对比数据显示采集成功率从71%提升至92%。行业案例表明,该方案在电商情报与价格对比平台中效果显著,未来有望成为主流趋势。
341 0
Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
|
9月前
|
前端开发 JavaScript 关系型数据库
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
740 5
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
|
9月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
514 12
|
9月前
|
人工智能 小程序 NoSQL
【一步步开发AI运动小程序】二十一、如何将AI运动项目配置持久化到后端?
本文介绍基于云智「Ai运动识别引擎」的运动配置持久化方案,旨在优化小程序或Uni APP中AI运动识别能力。通过将运动检测参数(如`Key`、`Name`、`TickMode`、`rules`或`samples`)持久化到后端,可避免因频繁调整运动参数而重新发布应用,提升用户体验。持久化数据结构支持规则和姿态样本存储,适用于关系数据库、文件或文档数据库(如MongoDB)。此外,云智还提供运动自动适配工具及「AI乐运动」产品,助力快速实现AI体育、全民健身等场景。

相关产品

  • 函数计算