本文承接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篇)相关推荐

  1. 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 ...

  2. java account函数的_用Java进行同时函数调用 - java

    在我的应用程序中,我以以下方式加载缓存. 加载用户缓存loadUserCache(); 加载帐户缓存loadAccountCache(); 加载客户缓存loadCustomerCache(); 上述每 ...

  3. java main函数_都知道Java程序的入口方法是main,那你知道为什么是main方法吗?

    我们都知道Java的入口方法是main函数,下面这段代码就是Java中非常经典的Hello World代码: 我们通过Java提供的工具进行编译执行: 通过上面的代码我们知道Java入口方法的几个要求 ...

  4. java convert函数_自己实现 java中 Convert.toDouble(String str)处理函数 | 学步园

    今天在superWaba上看到Convert.toDouble(String str),由于底层问题比较大的数就出错,现在自己写了一个 程序中info()是我加的打印,可以去掉 java中 Conve ...

  5. java同名函数_浅谈Java 继承接口同名函数问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...

  6. java主函数_《左手 Java 右手 Python 》之 Java 的安装与初识(1)

    (一)java 的安装与配置(windows) 1. jdk 安装 到oracle官网,下载 相应版本的Java SE 2. 验证安装 进入安装目录 3.配置环境变量 一共要配置 3 个环境变量 第 ...

  7. java static 函数_详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...

  8. 在win8下安装使用java及在win8下部署java环境变量-图文

    为了反编译APK,不得不安装一些Androidfby.apktool1.4.1.dex2jar-0.0.9.9等,甚至连DW也安装了,但是我的电脑是win8X64的,也就是64位的win8系统,这就有 ...

  9. java 聚合函数_如何使用Java流计算两个聚合函数?

    我有一个像这样的"请求"对象列表(id,金额,价格) List requests = Arrays.asList( new Request(id++, 20, 59.28), ne ...

最新文章

  1. Ubuntu安装MySQL1 - 失败
  2. 用平方映射理解tanh
  3. UBUNTU无法播放mp4格式电影的烦恼-是否可行待验证
  4. Samba将Linux集成到Windows网络
  5. Unity加载机制及内存管理
  6. 我的偶像:Garfield 上映
  7. bzoj 4025: 二分图(可撤销并查集+CDQ分治)
  8. 读书笔记 effective c++ Item 47 使用traits class表示类型信息
  9. 背景颜色、字体等的不透明区别 (opacity、transparent以及rgba的区别)
  10. Tomcat中temp文件夹出现项目副本问题的解决方法
  11. (一)MQTT+阿里云实现设备>云,云>设备之间的通信。
  12. [转]伸手摘星,未必如愿,但不会弄脏你的手……
  13. 兰道尔原理(Laudauer‘s Principle)
  14. clickhouse建表语句行数太多导致报错 Unmatched parentheses: (
  15. C#中ManualResetEvent用法
  16. 通过canvas给图片添加水印
  17. QTableView基本用法讲解,Qt表格控件的使用方法
  18. SqlService基础一篇搞定(建库建表、插入数据、修改和删除数据、基础查询、条件查询、模糊查询、聚合函数、分组查询、多表查询)
  19. MATLAB利用均值滤波的方法去除图像的噪声,将滤除噪声前后的图像输出。
  20. Linux 回收内存

热门文章

  1. Android 中的卡顿丢帧原因概述 - 应用篇
  2. 微信小程序——动态绑定多个class
  3. 【十日谈】编程上的追求卓越和圈子论
  4. 解决 xxx is not running, but lock file (/var/lock/subsys/xxx) exists
  5. 曼谷 Web3 游记:数字游民天堂,世俗与割裂的“罪恶都市”
  6. python 基础(十六)面向对象----类与对象
  7. 三菱PLC 串口控制 发送指令控制plc端口、计数器、寄存器
  8. 一生不过如此~~越往后看越觉得未来的10年何其珍贵
  9. 高手速成 | 过滤器、监听器的创建与配置
  10. Java - 微信支付