java less函数_AWS Serverless部署java api(LAMBDA篇)
本文承接RDS for MySQL,前面我们已经部署好了数据库服务,并测试了连通性,这里则开始部署我们的代码,并连通rds服务.
可以以官方demo为例,或者引入aws提供的aws-serverless-java-container-spring组件,进行部分改造即可。
这里介绍如何在我们的工程里添加lambda支持,我们的已有工程为Spring框架,首先在pom.xml中引入serverless依赖.
image
接着需要添加StreamLambdaHandler.class,SpringApiConfig.class.
image
两者功能在这里简单介绍一下,RequestStreamHandler是aws lambda 应用程序的入口,我们声明的StreamLambdaHandler继承了RequestStreamHandler,并加载了初始化时,需要扫描的方法类,这些类都在SpringApiConfig中注解引入。
RequestStreamHandler.class
public class StreamLambdaHandler implements RequestStreamHandler {
private static SpringLambdaContainerHandler handler;
static {
try {
handler = SpringLambdaContainerHandler.getAwsProxyHandler(SpringApiConfig.class);
} catch (ContainerInitializationException e) {
// if we fail here. We re-throw the exception to force another cold start
e.printStackTrace();
throw new RuntimeException("Could not initialize Spring framework", e);
}
}
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
throws IOException {
handler.proxyStream(inputStream, outputStream, context);
}
}
在SpringApiConfig中,一次性引入多个需要调用的方法类,否则发布程序后,lambda将无法读取到相应的类。
SpringApiConfig.class:
@Configuration
// We use direct @Import instead of @ComponentScan to speed up cold starts
// @ComponentScan("my.service.controller")
@Import({ PingController.class, TestController.class, DataSyncController.class})
public class SpringApiConfig {
/*
* Create required HandlerMapping, to avoid several default HandlerMapping instances being created
*/
@Bean
public HandlerMapping handlerMapping() {
return new RequestMappingHandlerMapping();
}
/*
* Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created
*/
@Bean
public HandlerAdapter handlerAdapter() {
return new RequestMappingHandlerAdapter();
}
/*
* optimization - avoids creating default exception resolvers; not required as the serverless container handles
* all exceptions
*
* By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including
* an expensive ObjectMapper instance.
*
* To enable custom @ControllerAdvice classes remove this bean.
*/
@Bean
public HandlerExceptionResolver handlerExceptionResolver() {
return new HandlerExceptionResolver() {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
return null;
}
};
}
}
配置完以后,开始配置我们真正的逻辑代码,上两个例子,程序员的好朋友hello word,与简单的jdbc链接查询。
PingController.class:
@Controller
@EnableWebMvc
public class PingController {
@Autowired
TestService testService;
@RequestMapping(path = "/ping", method = RequestMethod.GET)
public Map ping() {
System.out.println("controoler ping ");
Map pong = new HashMap<>();
pong.put("pong", "Hello, World!");
return pong;
}
@RequestMapping(path = "/getMySql", method = RequestMethod.GET)
public Map getMySql() {
Map results = new HashMap<>();
ResultSet resultSet = null;
try {
MysqlConnnect mysqlConnnect = new MysqlConnnect();
Connection con = mysqlConnnect.getRemoteConnection();
System.out.println("Remote connection successful.");
String sql = "SELECT * FROM test t where t.desc like ?";
PreparedStatement preparedStatement = con.prepareStatement(sql);
preparedStatement.setString(1, "%1%");
resultSet = preparedStatement.executeQuery();
List resultList = new ArrayList();
while (resultSet.next()) {
Map map = new ConcurrentHashMap();
map.put("id",resultSet.getInt("id"));
map.put("name",resultSet.getString("name"));
map.put("desc",resultSet.getString("desc"));
resultList.add(map);
}
// 释放资源
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (con != null) {
con.close();
}
results.put("msgCode",200);
results.put("msg","");
results.put("data",resultList);
}catch (Exception e){
System.out.println("SQLException:" + e.toString());
results.put("msgCode",500);
results.put("msg",e.toString());
results.put("data","");
}finally{
return results;
}
}
}
MysqlConnnect.class:
public class MysqlConnnect {
// static Logger logger = LogManager.getLogger(MysqlConnnect.class.getName());
@Autowired
private RdsMysqlInfo rdsMysqlInfo;
public Connection getRemoteConnection() {
System.out.println("getRemoteConnection:");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String jdbcUrl = "jdbc:mysql://hostname:port/dbname?user=&password=";//数据库关键信息自己补充
System.out.println("jdbcUrl" + jdbcUrl);
System.out.println("Getting remote connection with connection string from environment variables.");
Connection con = DriverManager.getConnection(jdbcUrl);
System.out.println("Remote connection successful.");
return con;
} catch (ClassNotFoundException e) {
// logger.warn(e.toString());
System.out.println("ClassNotFoundException:" + e.toString());
} catch (SQLException e) {
// logger.warn(e.toString());
System.out.println("SQLException:" + e.toString());
}
return null;
}
}
编写完之后,执行打包命令 mvn compile package ,这里我们的包叫core,正常情况下,我们发布到其他服务例如tomcat,weblogic之类的都需要使用war包,但lambda上我们需要使用classes.jar,另外将需要使用的jdbc jar包打入classes.jar中。
尽管lambda有layers层功能可以加载到所依赖的所有jar包,但实际上对jdbc这个jar的引用并没有起作用╮(╯▽╰)╭
image
image
以上代码层已经准备完全。开始在lambda上面创建我们的function。
进入Lambda服务,选择创建函数,运行语言环境为java 8,角色选择现有角色,这个角色是我在IAM中已经创建好了,包含了lambda创建,apigateway创建,role创建等等一系列的权限,假如没有相应的权限,后面会有相应的提示,到时候加上即可。
image
在新的控制面板中,选择新创建的函数,在下方的函数代码中,上传我们的core-classes.jar,运行语言为java 8,处理程序填写规则为package.{ClassName}::{FunctionName},我这里package是service.controllers className是PingController 方法名是getMySql,这个很好理解吧,填完之后选择右上角保存。
image
由于新创建的lambda服务还没加入到与数据库的同一安全组内,所以此时是无法访问数据库服务的,在此我们把它加进去:
选择与rds for mysql同一vpc,并至少选择两项子网组,子网组跟地域有一定的关系,aws会默认生成,选择两项即可,安全组选择同一安全组。
image
接下来我们需要测试我们上传的api是否有效,选择配置测试事件,可以自定义传入的报文内容,配置完之后保存,回到主面板页面执行测试。
image
修改处理程序里的functionname为ping,保存,测试ping方法,hello world 它leile.
image
修改处理程序里的functionname为getMySql,保存,测试,毫无悬念。至此lambda发布java api配置完成,后面将阐述如何将api通过api-gateway发布至公网。
image
java less函数_AWS Serverless部署java api(LAMBDA篇)相关推荐
- aws java mysql_AWS Serverless部署java api(RDS for MySQL篇)
AWS Serverless部署java api(RDS for MySQL篇) l Amazon API GATEWAY l Amazon LAMBDA l Amazon RDS for MySQL ...
- java account函数的_用Java进行同时函数调用 - java
在我的应用程序中,我以以下方式加载缓存. 加载用户缓存loadUserCache(); 加载帐户缓存loadAccountCache(); 加载客户缓存loadCustomerCache(); 上述每 ...
- java main函数_都知道Java程序的入口方法是main,那你知道为什么是main方法吗?
我们都知道Java的入口方法是main函数,下面这段代码就是Java中非常经典的Hello World代码: 我们通过Java提供的工具进行编译执行: 通过上面的代码我们知道Java入口方法的几个要求 ...
- java convert函数_自己实现 java中 Convert.toDouble(String str)处理函数 | 学步园
今天在superWaba上看到Convert.toDouble(String str),由于底层问题比较大的数就出错,现在自己写了一个 程序中info()是我加的打印,可以去掉 java中 Conve ...
- java同名函数_浅谈Java 继承接口同名函数问题
在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...
- java主函数_《左手 Java 右手 Python 》之 Java 的安装与初识(1)
(一)java 的安装与配置(windows) 1. jdk 安装 到oracle官网,下载 相应版本的Java SE 2. 验证安装 进入安装目录 3.配置环境变量 一共要配置 3 个环境变量 第 ...
- java static 函数_详解java中的static关键字
Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...
- 在win8下安装使用java及在win8下部署java环境变量-图文
为了反编译APK,不得不安装一些Androidfby.apktool1.4.1.dex2jar-0.0.9.9等,甚至连DW也安装了,但是我的电脑是win8X64的,也就是64位的win8系统,这就有 ...
- java 聚合函数_如何使用Java流计算两个聚合函数?
我有一个像这样的"请求"对象列表(id,金额,价格) List requests = Arrays.asList( new Request(id++, 20, 59.28), ne ...
最新文章
- Ubuntu安装MySQL1 - 失败
- 用平方映射理解tanh
- UBUNTU无法播放mp4格式电影的烦恼-是否可行待验证
- Samba将Linux集成到Windows网络
- Unity加载机制及内存管理
- 我的偶像:Garfield 上映
- bzoj 4025: 二分图(可撤销并查集+CDQ分治)
- 读书笔记 effective c++ Item 47 使用traits class表示类型信息
- 背景颜色、字体等的不透明区别 (opacity、transparent以及rgba的区别)
- Tomcat中temp文件夹出现项目副本问题的解决方法
- (一)MQTT+阿里云实现设备>云,云>设备之间的通信。
- [转]伸手摘星,未必如愿,但不会弄脏你的手……
- 兰道尔原理(Laudauer‘s Principle)
- clickhouse建表语句行数太多导致报错 Unmatched parentheses: (
- C#中ManualResetEvent用法
- 通过canvas给图片添加水印
- QTableView基本用法讲解,Qt表格控件的使用方法
- SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)
- MATLAB利用均值滤波的方法去除图像的噪声,将滤除噪声前后的图像输出。
- Linux 回收内存
热门文章
- Android 中的卡顿丢帧原因概述 - 应用篇
- 微信小程序——动态绑定多个class
- 【十日谈】编程上的追求卓越和圈子论
- 解决 xxx is not running, but lock file (/var/lock/subsys/xxx) exists
- 曼谷 Web3 游记:数字游民天堂,世俗与割裂的“罪恶都市”
- python 基础(十六)面向对象----类与对象
- 三菱PLC 串口控制 发送指令控制plc端口、计数器、寄存器
- 一生不过如此~~越往后看越觉得未来的10年何其珍贵
- 高手速成 | 过滤器、监听器的创建与配置
- Java - 微信支付