OpenFaaS实战之三:Java函数

本文介绍了使用Java11模板创建并部署Faas函数的过程,涉及Gradle构建、依赖管理、处理请求参数和返回自定义JSON,以及生成MyBatis知识脑图的学习资源分享。
摘要由CSDN通过智能技术生成

2020/11/20 15:47:56 Fetched 12 template(s) : [csharp dockerfile go java11 java11-vert-x node node12 php7 python python3 python3-debian ruby] from https://github.com/openfaas/templates.git

Folder: faas-currenttime created.


/ _ \ _ __ ___ _ __ | __| _ __ _/ ___|

| | | | '_ \ / _ \ '_ | |_ / |/ _ __ \

| || | |) | / | | | | (| | (| |) |

_/| ./ ___|| ||| _,|_,|___/

|_|

Function created in folder: faas-currenttime

Stack file written: faas-currenttime.yml

Notes:

You have created a function using the java11 template which uses an LTS

version of the OpenJDK.

  1. 当前目录已经新增了文件faas-currenttime.yml和文件夹faas-currenttime

  2. 文件夹faas-currenttime的内容如下,可见是个gradle工程:

faas-currenttime

├── build.gradle

├── gradle

│ └── wrapper

│ ├── gradle-wrapper.jar

│ └── gradle-wrapper.properties

├── gradlew

├── gradlew.bat

├── settings.gradle

└── src

├── main

│ └── java

│ └── com

│ └── openfaas

│ └── function

│ └── Handler.java

└── test

└── java

└── HandlerTest.java

  1. 打开build.gradle文件,添加下图红框中的内容,即jackson和common库的依赖:

在这里插入图片描述

  1. 进入文件夹faas-currenttime/src/main/java/com/openfaas/function/,可见已创建了默认的业务功能类Handler.java,打开看看OpenFaaS给的默认代码啥样的,如下所示:

package com.openfaas.function;

import com.openfaas.model.IHandler;

import com.openfaas.model.IResponse;

import com.openfaas.model.IRequest;

import com.openfaas.model.Response;

public class Handler extends com.openfaas.model.AbstractHandler {

public IResponse Handle(IRequest req) {

Response res = new Response();

res.setBody(“Hello, world!”);

return res;

}

}

  1. 把Handler.java的内容用以下代码替换掉,替换后的函数,其功能是取得请求参数,再把当前JVM的进程ID、IP地址、当前时间都拼接到一个字符串中返回,需要重点关注的有两点:将请求参数反序列化成Map实例,以及将Map序列化成JSON字符串返回:

package com.openfaas.function;

import com.fasterxml.jackson.core.type.TypeReference;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.openfaas.model.IRequest;

import com.openfaas.model.IResponse;

import com.openfaas.model.Response;

import org.apache.commons.lang3.StringUtils;

import java.lang.management.ManagementFactory;

import java.net.Inet4Address;

import java.net.InetAddress;

import java.net.NetworkInterface;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Map;

public class Handler extends com.openfaas.model.AbstractHandler {

private static final String PARAM_USER_NAME = “name”;

private static final String RESPONSE_TEMPLETE = “Hello %s, response from [%s], PID [%s], %s”;

private ObjectMapper mapper = new ObjectMapper();

/**

  • 获取本机IP地址

  • @return

*/

public static String getIpAddress() {

try {

Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces();

InetAddress ip = null;

while (allNetInterfaces.hasMoreElements()) {

NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();

if (netInterface.isLoopback() || netInterface.isVirtual() || !netInterface.isUp()) {

continue;

} else {

Enumeration addresses = netInterface.getInetAddresses();

while (addresses.hasMoreElements()) {

ip = addresses.nextElement();

if (ip != null && ip instanceof Inet4Address) {

return ip.getHostAddress();

}

}

}

}

} catch (Exception e) {

System.err.println(“IP地址获取失败” + e.toString());

}

return “”;

}

/**

  • 返回当前进程ID

  • @return

*/

private static String getPID() {

return ManagementFactory

.getRuntimeMXBean()

.getName()

.split(“@”)[0];

}

private String getUserName(IRequest req) {

// 如果从请求body中取不到userName,就用

String userName = null;

try {

Map<String, Object> mapFromStr = mapper.readValue(req.getBody(),

new TypeReference<Map<String, Object>>() {});

if(null!=mapFromStr && mapFromStr.containsKey(PARAM_USER_NAME)) {

userName = String.valueOf(mapFromStr.get(PARAM_USER_NAME));

}

} catch (Exception e) {

e.printStackTrace();

}

// 如果从请求body中取不到userName,就给个默认值

if(StringUtils.isBlank(userName)) {

userName = “anonymous”;

}

return userName;

}

public IResponse Handle(IRequest req) {

String userName = getUserName(req);

System.out.println(“1. —” + userName);

// 返回信息带上当前JVM所在机器的IP、进程号、时间

String message = String.format(RESPONSE_TEMPLETE,

userName,

getIpAddress(),

getPID(),

new SimpleDateFormat( “yyyy-MM-dd hh:mm:ss” ).format(new Date()));

System.out.println(“2. —” + message);

// 响应内容也是JSON格式,所以先存入map,然后再序列化

Map<String, Object> rlt = new HashMap<>();

rlt.put(“success”, true);

rlt.put(“message”, message);

String rltStr = null;

try {

rltStr = mapper.writeValueAsString(rlt);

} catch (Exception e) {

e.printStackTrace();

}

Response res = new Response();

res.setContentType(“application/json;charset=utf-8”);

res.setBody(rltStr);

return res;

}

}

  • 至此编码完成,接下来是制作镜像和部署;

部署

  1. 在faas-currenttime.yml所在目录执行以下命令,即可开始制作镜像,制作过程中会有gradle的编译过程,如果编译失败会中断镜像制作:

faas-cli build -f ./faas-currenttime.yml

  1. 镜像制作成功时,控制台输出类似如下信息:

Step 27/30 : ENV fprocess=“java -XX:+UseContainerSupport com.openfaas.entrypoint.App”

—> Running in 0f50636cc747

Removing intermediate container 0f50636cc747

—> 54a5c9a193c8

Step 28/30 : EXPOSE 8080

—> Running in 3252f165af15

Removing intermediate container 3252f165af15

—> c05afc826ec5

Step 29/30 : HEALTHCHECK --interval=5s CMD [ -e /tmp/.lock ] || exit 1

—> Running in 4106410be0a2

Removing intermediate container 4106410be0a2

—> 6d95b73b5f33

Step 30/30 : CMD [“fwatchdog”]

—> Running in 1606dbcd7003

Removing intermediate container 1606dbcd7003

—> 99a519ab82fd

Successfully built 99a519ab82fd

Successfully tagged bolingcavalry/faas-currenttime:latest

Image: bolingcavalry/faas-currenttime:latest built.

[0] < Building faas-currenttime done in 34.94s.

[0] Worker done.

Total build time: 34.94s

  1. 将镜像推送到镜像仓库,以便Kubernetes可以下载到此镜像,我这里用的是hub.docker.com,因为我的ID是bolingcavalry,所执行以下命令即可推送成功:

docker push bolingcavalry/faas-currenttime:latest

  1. 执行以下命令部署函数到OpenFaaS:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

image

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
/>

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

[外链图片转存中…(img-h5814Ivw-1713345870940)]

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值