zoukankan      html  css  js  c++  java
  • OpenFaaS实战之九:终篇,自制模板(springboot+maven+jdk8)

    欢迎访问我的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

  • 相关阅读:
    Ext JS 6开发实例(三) :主界面设计
    Ext JS 6开发实例(二) :使用CMD创建应用程序
    文件夹或者文件比对工具 Beyond Compare
    LIS问题(DP解法)---poj1631(模板)
    hdoj Max Sum Plus Plus(DP)
    A* 算法详解
    hdoj1043 Eight(逆向BFS+打表+康拓展开)
    hdoj2612 Find a way (bfs)
    luoguP3366 [模板] 最小生成树
    luoguP1196(带权并查集)
  • 原文地址:https://www.cnblogs.com/bolingcavalry/p/15126602.html
Copyright © 2011-2022 走看看