Springboot之基于腾讯云Serverless的订单应用

时间:2021-07-15 | 标签: | 作者:Q8 | 来源:Freeeeeedom网络

小提示:您能找到这篇{Springboot之基于腾讯云Serverless的订单应用}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的Springboot之基于腾讯云Serverless的订单应用内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您!

< ">前言

< ">这是一个JAVA开发的订单后台应用(没错!就是那个让无数大学生痛不欲生的订单后台系统),结合Serverless这一无服务器思想,尝试通过云函数+API网关+云数据库的组合来部署Springboot的成功之作。

< ">该应用提供了完整的用户登录验证、接口数据验证、订单流(CRUD)等强大的功能,而且在本地开发调试时也能模拟API网关调用云函数(本地Java开发云端部署不是问题),还兼容了云消息队列CMQ的调用,以便后续开发引入云中间件。

< ">同时,这种部署方式也能让其他的Springboot很快地转换为云函数部署。

< ">为响应国家「十四五计划」的环保计划,特地的研究了一下传说中的Serverless方案(省服务器),于是便有了这次尝试。

语言和框架

< ">JAVA天下第一,当然c/c++/c#/node/python/go/php/vb这些也不错

< ">JAVA的单体应用还能选什么呢?只能是Springboot啊

部署准备

< ">1.注册个腾讯云账号

< ">2.开通以下产品权限(云函数、API网关、对象存储)

< ">3.财力允许的话还可以购买数据库服务(因为年少轻狂打折时我购买了这俩很长很长时间)

< ">mysql数据库

< ">redis数据库

部署方案

< ">订单应用来说的话,必然是提供restful的接口,所以在统一VPC内采用了云函数+API网关的模式提供接口,于是就有了以下方案:

< ">1.应用主体部署在云函数



< ">2.使用API网关作为函数入口

< ">3.页面则是使用了对象存储部署

< ">4.数据库方面则使用了同一vpc下的云数据库(财力有限只尝试了mysql、redis,理论上其他应该都可行)

尝试部署

< ">要让JAVA工程部署到云函数上,首先了解什么是云函数(以下摘自微信开放文档)

云函数即在云端(服务器端)运行的函数。在物理设计上,一个云函数可由多个文件组成,占用一定量的CPU内存等计算资源;各云函数完全独立;可分别部署在不同的地区。开发者无需购买、搭建服务器,只需编写函数代码并部署到云端即可在小程序端调用,同时云函数之间也可互相调用。

< ">云函数其实就是将业务拆分成函数粒度部署在云上,那么就写了个简单的demo部署到云函数上,并且配上了API网关尝试调用。

< background-color: rgb(242, 242, 242);"> /**

 * 纯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危机公关smart攻略.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这个方法(调用者&gt;调用API网关&gt;云函数--&gt;pure推广商场的软文),但经测试发现static的数据源初始化并不会被重复加载,这也奠定了springboot可部署基础。

< ">其中通过log打印API网关带来的参数,直接将其复制为json,然后通过main函数模拟调用,这样就实现了本地模拟serverless部署后的调用。

log.info("param:{}",gson.toJson(insertParam);

< ">有了这些基础,那么只需要有一个入口类模拟springboot启动的加载,然后再映射一下API网关过来入口参数,即可实现springboot在云函数上部署(其实就是上面SCF类的超级plus版本)。

< ">**API网关配置**

< ">这里的路径参数对应springboot里的mapping路径

< ">< color: rgb(0, 176, 240);">本地调试

< ">有了上面那些demo后,可得知我们模拟云端部署运行已经不是问题。那么怎么在本地调试呢?答案很简单,直接启动springboot然后调正常就完事了。

< ">没错,就是直接用原生的springboot玩法即可。把springboot部署到云函数其实就是外挂了一个springboot的启动类(设计模式上叫适配器模式?(+_+)?

功能

< ">完整的springboot,能用springboot做的都能实现,我只是编写了一些小功能验证这个应用。

< ">[x]与本地服务器数据库连接

< ">[x]云数据库连接

< ">[x]vpc数据库连接

< ">[x]外部接口调用(发短信验证码)

< ">[x]实现简单的订单流(crud)

< ">[x]实现简单的登录能力

< ">[x]实现简单的数据验证能力

< ">整个项目功能简单但代码却不少。

安全

< ">首先"serverless"、"腾讯"、"云服务"这几个词就足以代表安全了,但为了功能完整性我还是尝试加了点东西。

< ">在这个系统中,我选择了header中加签名的方式验证数据,原因是啥,操作简单,有效呗。加密手段和方案暂且不说,就从流程上来看,是很方便的:

< ">1.从API网关调用参数中获取到header,body

< ">2.验证数据有效性

< ">3.请求转入业务模块

< ">4.验证数据有效性

< ">5.参数进入功能模块



< ">6.验证数据有效性

< ">7.………………

< ">其实只有123步骤是最有效的,后面的45678如果你想的话……更不用说API网关本身提供的鉴权功能了。

性能

< ">内存的话对于订单系统来说单次请求加上JVM也才300mb,而云函数单个函数执行内存能拉到3GB,哪怕有点量的分布式计算应该问题也不大。

< ">并发的话云函数上的预置并发上限200个,订单系统嘛,QPS1000?10000?100000?ezpz了,再怎么也比自家机柜服务器强几百几千个量级了。

< ">内存算力不够服务器扩容?不存在的。

最后

< ">生成个VUE项目,改改链接调调页面,然后上传到存储桶上,一键打开CDN

< ">~( ̄▽ ̄)~*完美!察觉到了到了科技的进步,时代的发展,Serverless的强大。

Springboot之基于腾讯云Serverless的订单应用

上一篇:不改一行代码!快速部署流行框架到腾讯云Serv
下一篇:Google购物广告Feed全方位解读及优化-出海必看


版权声明:以上主题为“Springboot之基于腾讯云Serverless的订单应用"的内容可能是本站网友自行发布,或者来至于网络。如有侵权欢迎联系我们客服QQ处理,谢谢。
相关内容
推荐内容
扫码咨询
    Springboot之基于腾讯云Serverless的订单应用
    打开微信扫码或长按识别二维码

小提示:您应该对本页介绍的“Springboot之基于腾讯云Serverless的订单应用”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通Springboot之基于腾讯云Serverless的订单应用的相关事宜。

关键词:Springboot之基于腾讯云Ser

关于 | 业务 | 案例 | 免责 | 隐私
客服邮箱:sales@1330.com.cn
电话:400-021-1330 | 客服QQ:865612759
沪ICP备12034177号 | 沪公网安备31010702002418号