OpenFaaS实战之九:终篇,自制模板(springboot+maven

这里分类和汇总了欣宸的全部原创(含配套源码):[https://github.com/zq2599/blog_demos](()

[](()OpenFaaS实战系列文章链接

  1. [部署](()

  2. [函数入门](()

  3. [Java函数](()

  4. [模板操作(template)](()

  5. [大话watchdog](()

  6. [of-watchdog(为性能而生)](()

  7. [java11模板解析](()

  8. [自制模板(maven+jdk8)](()

  9. [终篇,自制模板(springboot+maven+jdk8)](()

[](()本篇概览

  • 作为《OpenFaaS实战》系列的终篇,在前八篇文章中,理论和实战咱们已经做得够多,最后就做个有实用价值的模板为整个系列划上句号吧;

  • [《OpenFaaS实战之八:自制模板(maven+jdk8)》](()中做了个java模板:JDK版本是8,编译构建工具是maven,功能是通过编写Handler.java提供web服务,这个模板并不实用,在实际的开发中java程序员喜欢用springboot框架,所以,今天咱们的任务是做一个自定义模板,jdk8、maven、springboot一样都不少;

  • 具体的实战内容如下图,先完成左侧蓝色部分,把模板做好,再执行右侧绿色部分,开发一个函数验证模板符合预期:

OpenFaaS实战之九:终篇,自制模板(springboot+maven_第1张图片

  • 好吧,少一点套路,多一些真诚,不说闲话直接开始操作;

[](()创建java项目

  • 制作模板时最重要的就是提供完整的模板代码,接下来就来制作吧;

  • 我这边用的是IDEA,建一个springboot项目,名为jdk8mavenspringboot,用的是JDK8:

OpenFaaS实战之九:终篇,自制模板(springboot+maven_第2张图片

  • 项目基本设置如下图:

OpenFaaS实战之九:终篇,自制模板(springboot+maven_第3张图片

  • 项目的pom.xml内容如下,要注意的是spring-boot-maven-plugin插件增加了一个配置参数configuration.layers.enabled,这是制作镜像时用到的,做出的jar文件可以从中提取出镜像所需内容:

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

1.8

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

true

  • 新增一个controller,作为象征性的demo代码:

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私服一定要优先考虑:

OpenFaaS实战之九:终篇,自制模板(springboot+maven_第4张图片

  • 修改配置文件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模板使用了;
  1. 新建一个文件夹,名为simplespringboot;

  2. simplespringboot目录下新建文件template.yml,内容如下:

language: simplespringboot

welcome_message: |

You have created a function using the java8 and maven and springboot template

  1. 将前面的Dockerfile文件复制到simplespringboot目录下;

  2. 前面咱们创建的springboot工程,最外层的文件夹名为jdk8mavenspringboot,请将此文件夹改名为function,然后将整个文件夹都复制到simplespringboot目录下;

  3. 此刻的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

  1. 将这些内容全部上传到github上,我这里路径是https://github.com/zq2599/openfaas-templates/tree/master/template,这里面已经有四个模板了,本次新增的如下图红框:

OpenFaaS实战之九:终篇,自制模板(springboot+maven_第5张图片

  • 至此,模板制作完成,接下来验证此模板是否可用;

[](()验证模板

  • 接下来要做的,就是下图右侧的绿色部分:

OpenFaaS实战之九:终篇,自制模板(springboot+maven_第6张图片

  • 登录一台配好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

你可能感兴趣的:(程序员,经验分享,学习,开发语言)