三分钟迁移Spring boot工程到Serverless
前言
Spring Boot已成为当今最流行的Java后端开发框架,典型的应用方式是在云上购买一台虚拟机,每天24小时在上面运行Java程序,在这种情况下,用户必须维护自己的虚拟机环境,而且按照包月包年等方式进行付费。
华为云FunctionGraph(函数工作流服务)有着零运维、低成本计算的特点,FunctionGraph按需运行代码,无需配置和管理主机,您仅需为代码执行的每100ms和次数付费,如果代码没有运行的话,不会产生任何费用,而且每个月还有较多的免费额度。
FunctionGraph有明显的成本和维护优势,但是怎样才能把标准的Spring Boot应用程序当做函数在FunctionGraph上运行起来呢?现在以我本地的一个SpringBoot工程(链接https://functionstage-examples.obs.cn-north-1.myhwclouds.com/ServerlessSpringBootDemo.zip)为例展示快速迁移到华为云FunctionGraph的流程。
准备工作
下载ServerlessSpringBoot2-1.0.0.jar(链接https://functionstage-examples.obs.cn-north-1.myhwclouds.com/ServerlessSpringBoot2-1.0.0.jar)。
迁移流程
01.制作函数zip包
按照上面的动图添加fgs.properties配置文件,增加两个配置项fgs.component-scan和fgs.mapper-scan,然后导包。
所得的ServerlessSpringBootDemo.zip就是最终的函数代码包。
02.创建函数
在华为云入口找到FunctionGraph服务,进去后选择创建函数,函数名称建议设置为Controller中的根路径,例如本例的webtest,选择语言为Java8,另外设置函数执行入口为com.huawei.fgs.ext.handler.Main.handler,选择zip包方式上传代码(或者可以将代码先传入OBS桶,使用OBS上传方式创建),创建成功。
03.创建APIG触发器
函数创建完成后修改内存为1024,修改超时时间为30(首次启动时间较长)并保存。接下来切换到触发器选项卡,点击创建触发器,选择APIG,将安全认证改成NONE,后端超时设置为30000,和函数超时保持一致,点击确定完成创建。
检验结果
直接在浏览器中访问APIG生成的URL,因为demo中的Controller中并没有匹配/webtest路径的RequestMapping,因此一开始提示找不到路径,稍加修改后可以看到效果。
注意事项
1、使用SpringBoot的AOP特性时,请不要将切面定义到Controller层,否则会导致无法使用;
2、目前Controller都会视作RestController,所有的接口均会以ResponseBody形式返回,暂时不支持返回html页面;
3、在application.properties中去掉server.port配置,加入spring.main.web-environment=false配置项可以小幅提升首次启动速度;
4、如果代码需要经常改动,请将所有的依赖包打包成一个zip,上传到OBS,创建函数时填入依赖代码包的地址,后续更新代码时,只需要上传一个小的jar包即可;
5、如果业务代码中使用了filter,需要对代码进行修改,具体方式后续会提供(本demo中有简单使用例子,依赖FunctionGraph的Java SDK(链接https://functionstage-sdk.obs.myhwclouds.com/java-sdk/fss-java-sdk-1.1.0.zip)中的Runtime-1.1.0.jar和ServerlessSpringBoot2-1.0.0.jar);
6、如果需要使用本demo的代码,请先把application.properties中的mysql信息改为自己的公网访问配置:
另外在数据库中创建users表和books表。
总结
综上所述,整个迁移过程非常简单,用户无需改造自己的业务代码,只需在资源目录下新增fgs.properties文件即可,导包过程和常规情况稍有不同,按照上面的步骤也可以在数秒内完成,最后创建好函数和触发器之后,整个流程就完成了。关于API网关的详情,可以点击这里体验哦~
三分钟迁移Spring boot工程到Serverless的更多相关文章
- Spring Boot工程发布到Docker
先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布 ...
- Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程
使用Intellij中的Spring Initializr来快速构建Spring Boot工程 New---Project 可以看到图所示的创建功能窗口.其中Initial Service Url指向 ...
- 基于jar的Spring Boot工程
一.Spring Boot简介 Spring Boot是由Pivotal[ˈpɪvətl]团队(一家做大数据的公司)提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架 ...
- Ubuntu下使用VS Code创建Spring Boot工程
目的 我们将在Ubuntu桌面系统下,使用VS Code(Visual Studio Code)编辑器从零开始创建一个Spring Boot工程,并实现一个简单的RESTful风格接口.使用这套流程的 ...
- Spring Boot2 系列教程(一) | 如何使用 IDEA 构建 Spring Boot 工程
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. Search 前言 新年立了个 flag,好好运营这个公众号.具体来说,就是每周要写两篇文章在这个号发表.刚立的 fla ...
- 基于war的Spring Boot工程
一.简介 前面创建的Spring Boot工程最终被打为了Jar包,是以可执行文件的形式出现的,其使用了Spring Boot内嵌的Tomcat作为Web服务器来运行web应用的.新版Dubbo的监控 ...
- [转]通过Spring Boot三分钟创建Spring Web项目
来源:https://www.tianmaying.com/tutorial/project-based-on-spring-boot Spring Boot简介 接下来我们所有的Spring代码实例 ...
- Spring Boot学习(二)搭建一个简易的Spring Boot工程
第一步:新建项目 新建一个SpringBoot工程 修改项目信息 勾选项目依赖和工具 选择好项目的位置,点击[Finish] 第二步:项目结构分析 新建好项目之后的结构如下图所示,少了很多配置文件: ...
- 如何迁移 Spring Boot 到函数计算
作者 | 田小单 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上 ...
随机推荐
- Spring MVC全局异常后返回JSON异常数据
问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...
- 第3节 hive高级用法:14、hive的数据压缩
六.hive的数据压缩 在实际工作当中,hive当中处理的数据,一般都需要经过压缩,前期我们在学习hadoop的时候,已经配置过hadoop的压缩,我们这里的hive也是一样的可以使用压缩来节省我们的 ...
- mysql中删除已有字段的唯一性约束?
username varchar() NOT NULL unique 如何把unique约束删除? 解决方法:在你建好的表...右击 ——索引/索引类型——把username唯一键去掉
- Java中this、static关键字的内存图解
Java中的关键字有很多,abstract default goto* null switch boolean do if package nchronzed break dou ...
- Kafka Broker配置
Kafka发行包里自带的配置样本可以用来安装单机服务,但并不能满足大多数安装场景的要求.kafka有很多配置选项,Kafka有很多配置选项,涉及安装和调优的方方面面.不过大多数调优选项可以使用默认配置 ...
- 使用枚举(emum)代替常量类
原文: 作者:逍遥不羁 来源:CSDN 原文:https://blog.csdn.net/javaloveiphone/article/details/52371706 版权声明:本文为博主原创文章, ...
- 树莓派 -- oled
硬件 SPI0,CE0 SPI Master Driver 设备树 arch\arm\boot\dts\bcm2710-rpi-3-b.dts &gpio { spi0_pins: spi0_ ...
- buf.indexOf()
buf.indexOf(value[, byteOffset][, encoding]) value {String} | {Buffer} | {Number} byteOffset {Number ...
- LeetCode(63)Unique Paths II
题目 Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. Ho ...
- 集训第六周 古典概型 期望 C题
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=30728 一个立体方块,每个单位方块都是关闭状态,每次任两个点,以这两点为对角 ...