这里分类和汇总了欣宸的全部原创(含配套源码):[https://github.com/zq2599/blog_demos](()
[部署](()
[函数入门](()
[Java函数](()
[模板操作(template)](()
[大话watchdog](()
[of-watchdog(为性能而生)](()
[java11模板解析](()
[自制模板(maven+jdk8)](()
[终篇,自制模板(springboot+maven+jdk8)](()
作为《OpenFaaS实战》系列的终篇,在前八篇文章中,理论和实战咱们已经做得够多,最后就做个有实用价值的模板为整个系列划上句号吧;
[《OpenFaaS实战之八:自制模板(maven+jdk8)》](()中做了个java模板:JDK版本是8,编译构建工具是maven,功能是通过编写Handler.java提供web服务,这个模板并不实用,在实际的开发中java程序员喜欢用springboot框架,所以,今天咱们的任务是做一个自定义模板,jdk8、maven、springboot一样都不少;
具体的实战内容如下图,先完成左侧蓝色部分,把模板做好,再执行右侧绿色部分,开发一个函数验证模板符合预期:
制作模板时最重要的就是提供完整的模板代码,接下来就来制作吧;
我这边用的是IDEA,建一个springboot项目,名为jdk8mavenspringboot,用的是JDK8:
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”> 4.0.0 org.springframework.boot spring-boot-starter-parent 2.4.3 com.bolingcavalry jdk8mavenspringboot 0.0.1-SNAPSHOT jdk8mavenspringboot Demo project for Spring Boot org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin true 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(); } } server.port=8082 FROM maven:3.6.3-openjdk-8 as builder WORKDIR /home/app COPY . /home/app/ RUN cd function && mvn clean package -U -DskipTests --settings ./m2/settings.xml RUN cp /home/app/function/target/*.jar ./application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM openfaas/of-watchdog:0.7.6 as watchdog FROM openjdk:8-jre-slim as ship RUN addgroup --system app \ && adduser --system --ingroup app app 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/ ENV upstream_url=“http://127.0.0.1:8082” ENV mode=“http” ENV fprocess=“java org.springframework.boot.loader.JarLauncher” EXPOSE 8080 HEALTHCHECK --interval=5s CMD [ -e /tmp/.lock ] || exit 1 CMD [“fwatchdog”] 新建一个文件夹,名为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 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 [root@hedy 07]# faas new --list Languages available as templates: dockerfile java11extend simplejava8 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
[](()开发Dockerfile
用maven镜像作为基础镜像,用于编译构建java项目
将整个项目都复制到/home/app目录下
进入pom.xml所在目录执行构建命令,指定m2/settings.xml文件作为配置文件,
请在settings.xml中配置好私服,否则构建速度极慢
前面用maven编译构建完毕后,这里将构建结果复制到指定位置用于提取文件
通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
of-watchdog里面有二进制文件watchdog,制作镜像时要用到
openjdk镜像是容器的运行环境
为了安全起见,在生产环境运行容器时不要用指root帐号和群组
从of-watchdog镜像中复制二进制文件fwatchdog,这是容器的启动进程
赋予可执行权限
前面提取命令执行成功后取得的文件,用于镜像中启动应用所需
指定容器的运行帐号
指定容器的工作目录
fwatchdog收到web请求后的转发地址,java进程监听的就是这个端口
运行模式是http
拉起业务进程的命令,这里就是启动java进程
容器对外暴露的端口,也就是fwatchdog进程监听的端口
健康检查
容器启动命令,这里是执行二进制文件fwatchdog
[](()模板配置
[](()验证模板