欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

OpenFaaS实战系列文章链接

  1. 部署
  2. 函数入门
  3. Java函数
  4. 模板操作(template)
  5. 大话watchdog
  6. of-watchdog(为性能而生)
  7. java11模板解析
  8. OpenFaaS实战之八:自制模板(maven+jdk8)
  9. OpenFaaS实战之九:终篇,自制模板(springboot+maven+jdk8)

本篇概览

  • 作为《OpenFaaS实战》系列的终篇,在前八篇文章中,理论和实战咱们已经做得够多,最后就做个有实用价值的模板为整个系列划上句号吧;
  • 《OpenFaaS实战之八:自制模板(maven+jdk8)》中做了个java模板:JDK版本是8,编译构建工具是maven,功能是通过编写Handler.java提供web服务,这个模板并不实用,在实际的开发中java程序员喜欢用springboot框架,所以,今天咱们的任务是做一个自定义模板,jdk8、maven、springboot一样都不少;
  • 具体的实战内容如下图,先完成左侧蓝色部分,把模板做好,再执行右侧绿色部分,开发一个函数验证模板符合预期:

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

创建java项目

  • 制作模板时最重要的就是提供完整的模板代码,接下来就来制作吧;
  • 我这边用的是IDEA,建一个springboot项目,名为jdk8mavenspringboot,用的是JDK8:

  • 项目基本设置如下图:

  • 项目的pom.xml内容如下,要注意的是spring-boot-maven-plugin插件增加了一个配置参数configuration.layers.enabled,这是制作镜像时用到的,做出的jar文件可以从中提取出镜像所需内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bolingcavalry</groupId>
<artifactId>jdk8mavenspringboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jdk8mavenspringboot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
</plugins>
</build>
</project>
  • 新增一个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私服一定要优先考虑:

  • 修改配置文件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"]

模板配置

  • 现在材料已经准备完毕了,再整理一下准备提交到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客户端的电脑,找个干净目录执行以下命令,将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
  • 执行以下命令部署函数到OpenFaaS:
faas-cli deploy -f faas-simplespringbootdemo.yml
  • 控制台响应如下,可见部署已经开始,并且给出了endpoint:
[root@hedy 07]# faas-cli deploy -f faas-simplespringbootdemo.yml
Deploying: faas-simplespringbootdemo.
WARNING! You are not using an encrypted connection to the gateway, consider using HTTPS. Deployed. 202 Accepted.
URL: http://192.168.50.75:31112/function/faas-simplespringbootdemo.openfaas-fn
  • 在控制台用curl命令测试:
[root@hedy 07]# curl http://192.168.50.75:31112/function/faas-simplespringbootdemo.openfaas-fn/hello
Hello world 123456789, Sun Mar 07 13:17:06 UTC 2021
  • 至此,验证模板完成,符合预期

清理

  • 删除函数的命令如下,依旧是faas-simplespringbootdemo.yml所在目录:
faas-cli remove -f faas-simplespringbootdemo.yml
  • 至此,自制的springboot+maven+jdk8的模板,从开发到验证咱们已经全部走了一遍,咱们的OpenFaaS实战系列也圆满收官,希望此系列能给您的Serverless之路带来一些参考,那将是我的荣幸;

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...

https://github.com/zq2599/blog_demos

OpenFaaS实战之九:终篇,自制模板(springboot+maven+jdk8)的更多相关文章

  1. Dapr + .NET Core实战(十-终篇)K8S运行Dapr

    工作原理 为了实现在k8s上安装Dapr,Dapr需要部署dapr-sidecar-injector.dapr-operator.dapr-placement和dapr-sentry服务. dapr- ...

  2. OpenFaaS实战之八:自制模板(maven+jdk8)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. OpenFaaS实战之四:模板操作(template)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. OpenFaaS实战之七:java11模板解析

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. OpenFaaS实战之一:部署

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. OpenFaaS实战之二:函数入门

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. OpenFaaS实战之三:Java函数

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. OpenFaaS实战之五:大话watchdog

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. OpenFaaS实战之六:of-watchdog(为性能而生)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. js笔记18

    1.面向对象 (1)单例模式 (2)工厂模式 (3)构造函数 a.类  js天生自带的类 基类   object 子类   Function  Array Number  Math  Boolean ...

  2. AcWing 105. 七夕祭

    七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11 ...

  3. MySQL不支持DELETE使用表别名?

    最近做的需求经常和数据库在打交道, 因为系统页面上某些展示的字段并不是在前端写死的, 而是配置在数据库中, 这样的话便于维护和扩展. 于是遇到了一个MySQL中比较细节性的问题. 日常开发中不少程序员 ...

  4. MyBatis:MyBatis-Plus条件构造器EntityWrapper

    EntityWrapper 简介 1. MybatisPlus 通过 EntityWrapper(简称 EW,MybatisPlus 封装的一个查询条件构造器)或者 Condition(与 EW 类似 ...

  5. PHP获取文件扩展名的常用方法小结【五种方式】

    方法1:   function getExt1($filename) {    $arr = explode('.',$filename);    return array_pop($arr);; } ...

  6. Louvain 论文笔记

    Louvain Introduce Louvain算法是社区发现领域中经典的基于模块度最优化的方法,且是目前市场上最常用的社区发现算法.社区发现旨在发现图结构中存在的类簇(而非传统的向量空间). Al ...

  7. webview和H5交互

    由于H5的灵活多变,动态可配的特点,也为了避免冗长 的审核周期,H5页面在app上的重要性正日益突显. iOS应用于H5交互的控件主要是UIWebView及WKWebView WKWebView是14 ...

  8. C# 8.0和.NET Core 3.0高级编程 分享笔记一:C#8.0与NET Core 3.0入门

    在学习C#相关知识的过程中,我们使用Visual Studio Code来入门整个C#. 一.安装Visual Studio Core环境 通过https://code.visualstudio.co ...

  9. python 07篇 内置函数和匿名函数

    一.内置函数 # 下面这些要掌握 # len type id print input open # round min max filter map zip exec eval print(all([ ...

  10. Linux常用基础命令(二)

    Linux常用基础命令 一.-ls--列表显示目录内容 二.-alias--设置别名 三.-du--统计目录及文件空间占用情况 四.-mkdir--创建新目录 五.-touch--创建空文件 六.-l ...