有赞是 SaaS 公司,向商家提供了全方位的软件服务,支撑商家进行采购、店铺、商品、营销、订单、物流等等管理服务。
在这个软件服务里,能够满足大部分的商家,为商家保驾护航。
但是很多大商家往往会有自己的特殊需求,如使用自己的优惠券、分期支付、定制的商品详情页、定制下单流程等等,为了能够满足这样的需求,让商家有更多的可能性,我们提供了很强的扩展能力,这是电商云的核心。
前面提到,为了满足商家的定制需求,提供商家更多可能性的能力,我们需要提供很强的扩展能力,扩展能力简单来说就是用代码开发扩展服务,然后通过界面配置来编排扩展服务。
用代码开发扩展服务,我们需要有一个应用框架来支持扩展服务代码的开发。
应用框架包含代码部署、应用开发框架、应用运行框架。
看到这里应该会提出几个问题,代码部署在哪里?扩展服务或者扩展点是什么?
扩展点是由有赞核心系统定义的一组扩展 API ,分为业务扩展点、消息扩展点和前端扩展点。
从技术上可以理解为 Java 的 SPI ,举个例子,有赞核心系统价格中心提供了附加费用计算扩展点
,对于 Java 程序来说这就是一个接口类,开发者自己写一个实现类去实现该接口并在我们的控制台上进行相应的配置生效后,那么在进行价格计算时会调用开发者编写的附加费用计算扩展点
实现类,形成的结果就是在标准价格计算之外再会加上开发者实现类返回的附加费用(比如额外的关税、境外的运输费等等)。
一样的,消息扩展点从技术上可以理解为 Java 的 SPI。从命名上可以看出它是用来传递消息的,也就是说这个扩展点不会影响业务主流程。比如,有消费者进入店铺了,商家希望获得这个消息可以做一些事情去尽可能的挽留消费者;比如有消费者下单成功了,通过对应的消息扩展点发送一个消息,商家可以自己去做些更有价值的事情。
前端扩展点
业务扩展点和消息扩展点对应的都是后台逻辑,我对某个页面(如下单页)不满意或者想扩展里面的组件或者想自己添加一个组件怎么办?前端扩展点给了开发者进行完全前端定制的能力,这里举两个例子来说明:
如图中所示,横线(粗黑线)上方是电商云部分的服务和操作区,下方是开发者的操作区。
这里的代码提交和正常的 Git 管理代码方式不太一样,所以这个图也复杂一点:
所以在这个工程中会发现,电商云 Git 不承担团队管理、分支管理等等功能,他的作用主要是用来发布。
整体的 App 是一个 youzan-boot 项目,整体框架分两部分,内部核心模块和外部定制模块,两个模块单独维护单独开发,互相隔离。
这是一个可以单独运行的模块,在该模块里有很多子模块,定义了接口、工具类、实现类等等,除此之外还有应用启动器,这个模块的开发由有赞内部的开发人员负责开发,实现内容外部不可见,那么我们会在这个模块里做哪些事情呢?
这么做的好处是什么?
这个模块是通常意义上的 App ,也就是开发者可见并进行开发的 App,该模块同样有很多子模块,可以理解为正常的一个业务项目,只不过没有启动器没有启动框架,内部核心模块启动时会加载本模块。
通过上图可以看到,这个外部定制模块跟一般的 Maven 没什么区别:
电商云 App 是一个 maven 项目,根 pom 的 parent 是 cloud-parent ,cloud-parent 管理了 spring-boot、spring、jdk、内部对外的 API 等框架和 API 的版本。所以在 App 开发过程中开发者依赖这些体系的jar包时不需要指定版本。
扩展点开发是基于 Maven 框架去做的,有赞内部通过电商云把扩展点接口发布到有赞云 Maven 仓库,开发人员在本地配置有赞云 Maven 仓库后就可以拉取扩展点接口包,进行扩展点实现的开发。
上图中可以看到,开发者将外部定制模块开发完后通过电商云控制台进行发布,此时会将 App 打成一个 Jar 包发到服务器上,发布系统会启动内部核心模块,在启动时内部核心模块会启动 Aladdin (有赞Jar包加载容器),Aladdin 会将外部定制模块的 Jar 包加载进来,启动里面的业务逻辑,完成发布。
其实前面讲了很多 App 的总体框架,也讲了一些这样做的好处,这里主要列举三点来阐述一下:组件开放、组件升级和安全性。
在设计电商云应用框架时,考虑到的一点就是如何更便捷更快速的把我们有赞的能力开放出去,如何做更新的迭代,如今天开放了数据库组件、明天开放队列服务?如何做到先准备后开放?如何让开发者的接入成本最低?
有赞内部其实有很多很好的组件,有些可以开放在开发者,有些可能无法开放。同时开源也有很多组件,如何把这些能力集成到电商云平台上?
经过讨论和思考,决定以接口声明的模式(对于 Java 来说就是 Interface Jar包)对外提供服务。
这种方式对于开发者来说是非常便捷的:
结合电商云控制台来完成组件申请和配置初始化,开发者只需要在代码里写 Bean 注入代码就行,比如 Redis:
@Autowire
private RedisTemplate redisTemplate;
................
...............
如上所示,开发者只需要写这样的代码就可以使用,无需关注配置,也不需要做太多的依赖。
组件开放也很简单:
在这个过程中,由于电商云组件的使用方式是统一的,都通过一定规范的 Interface 开放,所以不需要做太多的 SDK 兼容去兼容开发者各种各样的使用场景。
开发者也只需要一种学习姿势,不会遇到不同的组件用不同的方式的困惑。除此之外也建立了电商云组件开放的规范。
有赞通过 Interface 的方式对外开放组件服务,那么该组件的实现类就会落到内部核心模块里,也就是说我们的服务实现对于开发者来说是个黑盒,有赞来负责对这个实现的开发、监控、管理,在未来的发展过程中,由于一些原因可能需要对实现进行修改和升级,这是很正常的情况,通过这种模式,开发者无感,开发者只关注业务扩展、方案实现。
组件的实现方式也分两种,一种是组件的实现源码直接写在内部核心模块工程里,另一种是单独一个 Jar 包(内部核心模块依赖这个 Jar 包)。
对于第二种模式,有赞有对应的 Jar 包管理工具 Aladdin,在应用启动时会匹配当前版本是否为最新版本,不是的话就会升级。
同时在这个开发过程中,假如核心模块和外部模块都依赖了同一个 Jar 包,但是不同的版本怎么办? Aladdin 也会去识别出来,只加载一个版本。
对于开发者可见的只有自己的业务代码,组件对于开发者来说是个黑盒,开发者无法去对组件实现植入代码,这样保证了组件实现的安全可控运行。
如果不是这种模式,而是将组件作为一个client开放给开发者,首先开发者能够看到我们组件的逻辑,第二个能够对组件实现做一些入侵(如修改字节码)。
如上图所示,app-biz 即开发者部分的 App,和有赞进行实线连接的只有我们提供的接口层(Java 的 Interface),接口层的实现由 App 基础框架来负责,来访问配置、访问数据库、访问缓存。
虽然每个 App 的数据库、缓存等等相互之间是隔离的,但是他们可能都在一个机房或者一个网络环境,如果不做这种封装,让 App 直接访问这些资源,很难保证不会对其他 App 的数据库、缓存等等造成影响或者攻击。
目前这种模式天然的保证了每个 App 的私有资产的安全性。
电商云目前处于开荒后的创世阶段,我们希望能够让开发者和商家有更多的可能性,那么落到应用框架上,就需要有更多的灵活性和更多的能力来支持。
首先、完善组件,开放更多的组件;
第二、支持多语言,目前不管是组件还是应用框架都只支持 Java;
第三、支持本地运行,前面讲到 App 无法自己运行,也就说明 App 无法在开发者本地运行,所以未来要支持本地运行;
第四、支持远程调试;
第五、完善应用框架,如监控、热加载等等;
其他。。。
创世阶段需要更多人才,也希望各路神仙加入展现绝技。
欢迎关注我们的公众号
Original url: Access
Created at: 2019-09-26 16:25:59
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论