前言
这是一个 JAVA 开发的订单后盾利用(没错!就是那个让有数大学生痛不欲生的订单后盾零碎),联合 Serverless 这一无服务器思维,尝试通过云函数 + API 网关 + 云数据库的组合来部署 Springboot 的胜利之作。
本文作者:Freeeeeedom
该利用提供了残缺的用户登录验证、接口数据验证、订单流 (CRUD) 等弱小的性能,而且在本地开发调试时也能模仿 API 网关调用云函数(本地 Java 开发云端部署不是问题),还兼容了云音讯队列 CMQ 的调用,以便后续开发引入云中间件。
同时,这种部署形式也能让其余的 Springboot 很快地转换为云函数部署。
为响应国家「十四五打算」的环保打算,顺便的钻研了一下传说中的 Serverless 计划(省服务器 ????),于是便有了这次尝试。
语言和框架
- JAVA 天下第一 **,当然 c/c++/c#/node/python/go/php/vb 这些也不错
- JAVA 的单体利用还能选什么呢?只能是 Springboot 啊
部署筹备
- 注册个腾讯云账号
- 开明以下产品权限(云函数、API 网关、对象存储)
- 财力容许的话还能够购买数据库服务(因为年少轻狂打折时我购买了这俩很长很长时间)
- mysql 数据库
- redis 数据库
部署计划
订单利用来说的话,必然是提供 restful 的接口,所以在对立 VPC 内采纳了云函数 + API 网关的模式提供接口,于是就有了以下计划:
- 利用主体部署在云函数
- 应用 API 网关作为函数入口
- 页面则是应用了对象存储部署
- 数据库方面则应用了同一 vpc 下的云数据库(财力无限只尝试了 mysql、redis,实践上其余应该都可行)
尝试部署
要让 JAVA 工程部署到云函数上,首先理解什么是云函数(以下摘自微信凋谢文档)
云函数即在云端(服务器端)运行的函数。在物理设计上,一个云函数可由多个文件组成,占用一定量的 CPU 内存等计算资源;各云函数齐全独立;可别离部署在不同的地区。开发者无需购买、搭建服务器,只需编写函数代码并部署到云端即可在小程序端调用,同时云函数之间也可相互调用。
云函数其实就是将业务拆分成函数粒度部署在云上,那么就写了个简略的 demo 部署到云函数上,并且配上了 API 网关尝试调用。
/**
* 纯 javascf 疾速开发部署(不走 springboot)
*
* @author Freeeeeedom
* @date 2020/10/24 10:31
*/
public class Scf {
/**
* log Object
*/
private static Logger log = LoggerFactory.getLogger(Scf.class);
private static DruidDataSource dataSource1 = new DruidDataSource();
static {
// 此处加载或批改数据源 多数据源配置多个
dataSource1.setUsername("Freeeeeedom");
dataSource1.setUrl("jdbc:mysql://Freeeeeedom?autoReconnectForPools=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
dataSource1.setPassword("Freeeeeedom");
dataSource1.setMinIdle(1);
dataSource1.setMaxActive(5);
dataSource1.setMaxWait(10000);
dataSource1.setValidationQuery("SELECT 1 from dual");
log.info("数据源加载 ok~");
}
/**
* 纯 scf 入口参数
*
* @param insertParam 入参
* @return java.lang.Object 执行后果
* @author Freeeeeedom
* @date 2020/10/24 10:31
*/
public Object pure(Map<String, Object> insertParam) {log.info("param:{}", gson.toJson(insertParam);
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
try {Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {log.error("外部解决异样", e);
}
Map response = new HashMap();
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource1);
Map order = jdbcTemplate.queryForMap("select order_id,create_time from `order` limit 1");
log.info(order.toString());
return buildResponse(gson, gson.toJson(order), response);
}
private Object buildResponse(Gson gson, String json, Map response) {Map<String, String> headers = new HashMap(1);
headers.put("Content-Type", "application/json");
response.put("statusCode", HttpStatus.OK.value());
response.put("headers", headers);
response.put("body", json);
return gson.toJson(response);
}
}
只须要打包好代码,而后将入口函数设置为 scf.Scf::pure
就实现了接收数据,而后从数据库查问了第一个订单的 id 和创立工夫并且返回的能力:
每一次通过 API 网关触发云函数都会触发 pure 这个办法(调用者 > 调用 API 网关 > 云函数 –> pure),但经测试发现 static 的数据源初始化并不会被反复加载,这也奠定了 springboot 可部署根底。
其中通过 log 打印 API 网关带来的参数,间接将其复制为 json,而后通过 main 函数模仿调用,这样就实现了本地模仿 serverless 部署后的调用。
log.info("param:{}", gson.toJson(insertParam);
有了这些根底,那么只须要有一个入口类模仿 springboot 启动的加载,而后再映射一下 API 网关过去入口参数,即可实现 springboot 在云函数上部署(其实就是下面 SCF 类的超级 plus 版本)。
API 网关配置
这里的门路参数对应 springboot 里的 mapping 门路
本地调试
有了下面那些 demo 后,可得悉咱们模仿云端部署运行曾经不是问题。那么怎么在本地调试呢?答案很简略,间接启动 springboot 而后调失常就完事了。
没错,就是间接用原生的 springboot 玩法即可。把 springboot 部署到云函数其实就是 外挂了一个 springboot 的启动类(设计模式上叫适配器模式?(+_+)?
性能
残缺的 springboot,能用 springboot 做的都能实现,我只是编写了一些小性能验证这个利用。
- [x] 与本地服务器数据库连贯
- [x] 云数据库连贯
- [x] vpc 数据库连贯
- [x] 内部接口调用(发短信验证码)
- [x] 实现简略的订单流 (crud)
- [x] 实现简略的登录能力
- [x] 实现简略的数据验证能力
整个我的项目性能简略但代码却不少。
平安
首先 “serverless”、” 腾讯 ”、” 云服务 ” 这几个词就足以代表平安了,但为了性能完整性我还是尝试加了点货色。
在这个零碎中,我抉择了 header 中加签名的形式验证数据,起因是啥,操作简略,无效呗。加密伎俩和计划暂且不说,就从流程上来看,是很不便的:
- 从 API 网关调用参数中获取到 header,body
- 验证数据有效性
- 申请转入业务模块
- 验证数据有效性
- 参数进入功能模块
- 验证数据有效性
- ………………
其实只有 123 步骤是最无效的,前面的 45678 如果你想的话……更不用说 API 网关自身提供的鉴权性能了。
性能
内存的话对于订单零碎来说单次申请加上 JVM 也才 300mb,而云函数单个函数执行内存能拉到 3GB,哪怕有点量的分布式计算应该问题也不大。
并发的话云函数上的预置并发下限 200 个,订单零碎嘛,QPS1000?10000?100000? ezpz 了,再怎么也比自家机柜服务器强几百几千个量级了。
内存算力不够服务器扩容?不存在的。
最初
生成个 VUE 我的项目,改改链接调调页面,而后上传到存储桶上,一键关上 CDN ~(~▽~)~* 完满!
察觉到了到了科技的提高,时代的倒退,Serverless 的弱小。
One More Thing
立刻体验腾讯云 Serverless Demo,支付 Serverless 新用户礼包 ???? serverless/start
欢送拜访:Serverless 中文网!