package com.bolingcavalry.jdk8mavenspringboot.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
public class Hello {
@RequestMapping(value = “/hello”, method = RequestMethod.GET)
public String hello() {
return "Hello world, " + new Date();
}
}
- pom.xml所在目录下,新建文件夹m2,里面增加maven的配置文件settings.xml,该文件是在FaaS开发过程中,制作镜像时用到的(制作镜像时会编译构建java项目),强烈建议在里面配置好您的maven私服,或者阿里云镜像,这样制作镜像时会快很多,我这里已经配置了阿里云镜像,依然耗时两分多钟(如下图),所以如果您有nexus3私服一定要优先考虑:
- 修改配置文件src/main/resources/application.properties,增加一行端口配置,这是fwatchdog转发到的端口:
server.port=8082
- 至此,编码工作已完成,可见这就是个普通springboot工程,接下来要考虑的是如何制作Docker镜像,即Dockerfile的编写;
开发Dockerfile
- 前面的实战中咱们已经体验过,开发FaaS的时候会将代码编译构建制作成镜像,因此对应的Dockerfile也要准备好,下面是完整的Dockerfile内容:
用maven镜像作为基础镜像,用于编译构建java项目
FROM maven:3.6.3-openjdk-8 as builder
WORKDIR /home/app
将整个项目都复制到/home/app目录下
COPY . /home/app/
进入pom.xml所在目录执行构建命令,指定m2/settings.xml文件作为配置文件,
请在settings.xml中配置好私服,否则构建速度极慢
RUN cd function && mvn clean package -U -DskipTests --settings ./m2/settings.xml
前面用maven编译构建完毕后,这里将构建结果复制到指定位置用于提取文件
RUN cp /home/app/function/target/*.jar ./application.jar
通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract
of-watchdog里面有二进制文件watchdog,制作镜像时要用到
FROM openfaas/of-watchdog:0.7.6 as watchdog
openjdk镜像是容器的运行环境
FROM openjdk:8-jre-slim as ship
为了安全起见,在生产环境运行容器时不要用指root帐号和群组
RUN addgroup --system app \
&& adduser --system --ingroup app app
从of-watchdog镜像中复制二进制文件fwatchdog,这是容器的启动进程
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
赋予可执行权限
RUN chmod +x /usr/bin/fwatchdog
WORKDIR /home/app
前面提取命令执行成功后取得的文件,用于镜像中启动应用所需
COPY --from=builder /home/app/dependencies/ ./
COPY --from=builder /home/app/spring-boot-loader/ ./
COPY --from=builder /home/app/snapshot-dependencies/ ./
COPY --from=builder /home/app/application/ ./
指定容器的运行帐号
user app
指定容器的工作目录
WORKDIR /home/app/
fwatchdog收到web请求后的转发地址,java进程监听的就是这个端口
ENV upstream_url=“http://127.0.0.1:8082”
运行模式是http
ENV mode=“http”
拉起业务进程的命令,这里就是启动java进程
ENV fprocess=“java org.springframework.boot.loader.JarLauncher”
容器对外暴露的端口,也就是fwatchdog进程监听的端口
EXPOSE 8080
健康检查
HEALTHCHECK --interval=5s CMD [ -e /tmp/.lock ] || exit 1
容器启动命令,这里是执行二进制文件fwatchdog
CMD [“fwatchdog”]
- 上述脚本中有提取和复制提取内容的操作,这是springboot官方从2.3版本为容器化提供的特性,详情可以参考《体验SpringBoot(2.3)应用制作Docker镜像(官方方案)》
模板配置
- 现在材料已经准备完毕了,再整理一下准备提交到github上,就可以作为OpenFaaS模板使用了;
-
新建一个文件夹,名为simplespringboot;
-
simplespringboot目录下新建文件template.yml,内容如下:
language: simplespringboot
welcome_message: |
You have created a function using the java8 and maven and springboot template
-
将前面的Dockerfile文件复制到simplespringboot目录下;
-
前面咱们创建的springboot工程,最外层的文件夹名为jdk8mavenspringboot,请将此文件夹改名为function,然后将整个文件夹都复制到simplespringboot目录下;
-
此刻的simplespringboot目录下应该是这些内容:
[root@hedy 003]# tree simplespringboot
simplespringboot
├── Dockerfile
├── function
│ ├── HELP.md
│ ├── jdk8mavenspringboot.iml
│ ├── m2
│ │ └── settings.xml
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── bolingcavalry
│ │ │ └── jdk8mavenspringboot
│ │ │ ├── controller
│ │ │ │ └── Hello.java
│ │ │ └── Jdk8mavenspringbootApplication.java
│ │ └── resources
│ │ ├── application.properties
│ │ ├── static
│ │ └── templates
│ └── test
│ └── java
│ └── com
│ └── bolingcavalry
│ └── jdk8mavenspringboot
│ └── Jdk8mavenspringbootApplicationTests.java
└── template.yml
17 directories, 12 files
- 将这些内容全部上传到github上,我这里路径是https://github.com/zq2599/openfaas-templates/tree/master/template,这里面已经有四个模板了,本次新增的如下图红框:
- 至此,模板制作完成,接下来验证此模板是否可用;
验证模板
- 接下来要做的,就是下图右侧的绿色部分:
- 登录一台配好OpenFaaS客户端的电脑,找个干净目录执行以下命令,将github上所有模板下载下来:
faas template pull https://github.com/zq2599/openfaas-templates
- 控制台响应如下,提示下载了四个模板,符合预期:
[root@hedy 07]# faas template pull https://github.com/zq2599/openfaas-templates
Fetch templates from repository: https://github.com/zq2599/openfaas-templates at
2021/03/07 20:30:24 Attempting to expand templates from https://github.com/zq2599/openfaas-templates
2021/03/07 20:30:29 Fetched 4 template(s) : [dockerfile java11extend simplejava8 simplespringboot] from https://github.com/zq2599/openfaas-templates
- 用faas new --list查看列表如下:
[root@hedy 07]# faas new --list
Languages available as templates:
-
dockerfile
-
java11extend
-
simplejava8
-
simplespringboot
- 看看template/simplespringboot目录下的内容,和前面上传的一模一样:
[root@hedy 07]# tree template/simplespringboot/
template/simplespringboot/
├── Dockerfile
├── function
│ ├── m2
│ │ └── settings.xml
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── bolingcavalry
│ │ │ └── jdk8mavenspringboot
│ │ │ ├── controller
│ │ │ │ └── Hello.java
│ │ │ └── Jdk8mavenspringbootApplication.java
│ │ └── resources
│ │ └── application.properties
│ └── test
│ └── java
│ └── com
│ └── bolingcavalry
│ └── jdk8mavenspringboot
│ └── Jdk8mavenspringbootApplicationTests.java
└── template.yml
15 directories, 10 files
- 有了模板就可以创建函数了,执行以下命令创建名为faas-simplespringbootdemo的函数:
faas-cli new faas-simplespringbootdemo --lang simplespringboot -p bolingcavalry
- 控制台提示如下,此时当前目录下新增文件夹faas-simplespringbootdemo,这就是新建函数的代码目录:
[root@hedy 07]# faas-cli new faas-simplespringbootdemo --lang simplespringboot -p bolingcavalry
Folder: faas-simplespringbootdemo created.
/ _ \ _ __ ___ _ __ | __| _ __ _/ ___|
| | | | '_ \ / _ \ '_ | |_ / |/ _
__ \
| || | |) | / | | | | (| | (| |) |
_/| ./ ___|| ||| _,|_,|___/
|_|
Function created in folder: faas-simplespringbootdemo
Stack file written: faas-simplespringbootdemo.yml
Notes:
You have created a function using the java8 and maven and springboot template
- 文件夹faas-simplespringbootdemo的内容如下,现在妥了,用IDEA等IDE工具以maven工程形式导入,然后根据业务需求修改这个工程即可:
[root@hedy 07]# tree faas-simplespringbootdemo
faas-simplespringbootdemo
├── m2
│ └── settings.xml
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── bolingcavalry
│ │ └── jdk8mavenspringboot
│ │ ├── controller
│ │ │ └── Hello.java
│ │ └── Jdk8mavenspringbootApplication.java
│ └── resources
│ └── application.properties
└── test
└── java
└── com
└── bolingcavalry
└── jdk8mavenspringboot
└── Jdk8mavenspringbootApplicationTests.java
14 directories, 8 files
- 现在可以开发业务了,这里为了测试,修改了Hello.java的接口返回内容,如下图红框:
- 开始编译构建吧,执行以下命令:
faas-cli build -f ./faas-simplespringbootdemo.yml
- 构建完成后将镜像推送到镜像仓库,以便Kubernetes可以下载到此镜像,我这里用的是hub.docker.com,因为我的ID是bolingcavalry,所执行以下命令即可推送成功(要先执行docker login命令登录):
docker push bolingcavalry/faas-simplespringbootdemo:latest