欢迎访问我的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的关键技术:Watchdog,不了解它后面就没法继续了;
  • 标题为大话watchdog说明本文以理论为主,这也是作者的弱项,但我会努力把关键点说得简洁明白,如果您发现问题请务必及时指出,谢谢!
  • 整篇文章由以下段落构成:
  1. 从faas-netes谈起
  2. OpenFaaS的资源
  3. watchdog分析
  4. 小结
  5. java程序员的担忧

接下来一同开启这段旅程吧,OpenFaaS开发之路上最重要的一站!

从faas-netes谈起

  1. 先看Kubernetes下OpenFaaS的整体架构,如下图,外部请求由Gateway转发到faas-netes组件:



2. 再来看官方描述,如下图红框,在K8S环境,faas-netes就是服务提供者,它提供的服务支持REST API、客户端、WEB等多种对接方式,另外,还可以用kubectl命令对其进行管理,实现K8S的operator模式(关于K8S的operator,可以先学习Controller,再想象着高度定制CDR和Controller就可以了):

  1. 虽然faas-netes很强大,但是在本文咱们只要关注一点:faas-netes提供了函数服务,也就是说,咱们前面写过的python、java的Hello world函数,都和faas-netes有关;
  2. 说了一大堆,主角watchdog还不出来?再等等,因为此刻大家都有同样的疑问:我不就是写了个python脚本吗,里面只有个Hello world方法,怎么就成了faas-netes对外提供的函数了呢?
  3. 对上面的疑问,官方内部架构图应该是最合理的答案,如下图,API Gateway的请求会到达faas-provider的8080端口,如果是调用已经发布的函数,就在左上角的红框内处理,如果是对资源的增删改查,就交给右下角的绿框处理:

OpenFaaS的资源

刚才提到了上图右下角的绿框,其责任是处理资源,这不是本文的重点,但作者好歹算是Kubernetes爱好者,觉得有必要科(xuan)普(yao)一下资源相关的知识点:

  1. 在K8S中,Pod、Deployment、Service都是资源,也有对应的Controller根据etcd中保存的期望状态来调节和控制这些资源;
  2. 对K8S环境的OpenFaaS来说,它也有自己定义的资源类型(第一篇《安装》里面提到过yaml文件夹,那里面有个crd.yml文件,记录了OpenFaaS的资源定义);
  3. OpenFaaS怎么控制自己的资源呢?faas-netes提供CRUD接口给外面调用,而这些接口的内部实现,就是上面图中你们看到的绿框了,显然,经典的K8S Controller模式不能满足OpenFaaS对资源控制的需求,于是就采用了目前流行的Operator模式:更复杂的资源定义、更复杂的资源控制逻辑
  4. 至于OpenFaaS的资源具体有哪些,那要详细去看crd.yml文件,以及OpenFaaS Operator的代码了,不过上图还是给我们指明了方向:Secret、Deployment、Service,想想也是如此,咱们把业务功能发布到OpenFaaS,最关注的不就是安全(Secret)、部署配置(Deployment)、对外暴露(Service)这些东西嘛;
  • 经过欣宸的一番梳(chui)理(niu),现在对faas-netes的了解是否更进一步了呢?函数的发布、后期的资源控制和调节,都是faas-netes的Operator在负责,接下来是不是该回到正题了:函数调用
  • 主角watchdog已经哭晕了吧...

watchdog分析

  • 还是前面那幅图,咱们聚焦右上角那部分,我把它截出来如下图所示:

  • 如果咱们用nodejs模板开发函数,写了个index.js文件,那么响应外部请求时会走到下图红框位置,进入Watchdog的8080端口,此时Watchdog会新建node进程,该进程执行index.js文件:

  • 上面说得不够清楚么?那就再详细一些,咱们开发函数时会做成docker镜像,这个镜像里有些啥?再来一副官方图如下,真相大白:镜像里有个Watchdog,监听8080端口,收到请求后fork一个进程,通过stdin把请求参数传给这个进程,进程调用咱们自己写的函数方法,并且把参数传给此方法,等方法执行完毕后,返回值通过stdout给到Watchdog

  • 现在,相信您在写完一个函数后,对于外部请求如何调用到您写的那段代码应该了然于胸,但是,依然有个小小的盲点:我知道了Watchdog能干啥,但是Watchdog具体是个啥?咋就进了docker镜像呢?
  • 上述问题,在模板的Dockerfile文件中可以找到答案(Dockerfile是制作docker镜像的脚本文件),咱们打开node模板的Dockerfile看看;
  • 如下,一开始就从基础镜像openfaas/classic-watchdog:0.18.18里把文件fwatchdog复制过来了:
FROM --platform=${TARGETPLATFORM:-linux/amd64} openfaas/classic-watchdog:0.18.18 as watchdog
FROM --platform=${TARGETPLATFORM:-linux/amd64} node:12.13.0-alpine as ship COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog
  • 这个Dockerfile的结尾如下,也就是说该镜像的容器一启动就会执行fwatchdog:
CMD ["fwatchdog"]
  • 至此,您对Watchdog是否有了足够的了解,如果前面的信息量太大,咱们来做个小结;

小结

  1. 开发函数时,当函数文件编写完成后,就开始制作docker镜像;
  2. 制作的镜像中,包含有fwatchdog文件,以及咱们编写的函数,如果是python、nodejs等脚本语言,就会将脚本和nodejs或者python都复制到镜像中,如果是java类型的,还会涉及到编译构建;
  3. 部署好函数后,Kubernetes环境会根据此镜像创建pod,而pod启动后,就会运行fwatchdog文件,也就是启动了watchdog进程;
  4. 外部访问函数时,请求先到API Gateway,再到上一步创建的pod的8080端口;
  5. 这个pod里面,是watchdog在监听8080端口,收到请求后,创建一个node进程,把请求参数通过stdin传给node进程;
  6. node进程会执行咱们开发函数时编写的函数,并且将收到的参数作为函数的入参;
  7. 咱们编写的函数执行完毕后,node进程将返回值写入stdout,这时候watchdog通过stdout就会收到函数的返回值;
  8. watchdog将收到的返回值返回给API Gateway,最终返回给用户;
  • 这回终于说清楚了吧,如果您还意犹未尽想继续深入,请移步watchdog的源码吧,地址是:https://github.com/openfaas/classic-watchdog ,这是golang编写的,作者欣宸因为是Java背景,就不敢多说了,怕被打;

java程序员的担忧

  1. 如果您是一位java程序员,看完以上内容是否和作者一样涌起一丝担忧?
  2. 咱们先看看tomcat的架构,如下图:

  3. 看完上图重点就来了,对比如下:

    tomcat:监听8080,收到请求后,从线程池中指定线程处理;

    watctdog:监听8080,收到请求后,启动一个进程去处理;
  4. 如果您是java程序员,应该能感受到这种担忧:启动进程意味着创建JVM实例,再创建线程,这些相对于业务逻辑都更消耗系统资源(CPU、内存),如果通过大量fork进程去处理高并发的话,其代价可想而知,另外连接池、JIT、GC等各种优化手段更无从谈起了;
  5. 所以,真相是什么呢?在OpenFaaS上开发java函数,会不会走watchdog + fork进程那一套?咱们下一篇细说吧,本文没有贴代码,纯手动打字,真的太累了...
  6. 先剧透:OpenFaaS很优秀,上述问题已经解决,就看Alex Ellis大神的具体手段了;

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

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

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

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

https://github.com/zq2599/blog_demos

OpenFaaS实战之五:大话watchdog的更多相关文章

  1. OpenFaaS实战之一:部署

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

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

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

  3. OpenFaaS实战之三:Java函数

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

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

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

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

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

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

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

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

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

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

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

  9. [Java聊天室server]实战之五 读写循环(服务端)

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...

随机推荐

  1. 【dp】10-15题解 snake vs block

    snake vs block 题目描述 Tgopknight最近迷上了一款叫做Snake vs Block的游戏,他总觉得他自己玩出的不是最优解,但是他忙于享受游戏的乐趣,只好请你帮忙找出最优解. S ...

  2. Lc_704二分查找

    package com.example.leetcode2; import java.util.*; /** * @description: 704. 二分查找 * 给定一个 n 个元素有序的(升序) ...

  3. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

  4. CentOS7 安装搭建docker环境

    一.Docker简介 Docker 版本 :版本分为:社区版CE  企业版EE 社区版分为stable和edge俩种发行方式: stable版本:是季度版发行(三月一更新) edge版本:是月度版发行 ...

  5. 低代码Paas开发平台可以本地实施吗

    低代码Paas开发平台可以本地实施吗?答案是肯定的.虽然低代码开发通常是以云端形式面向用户,也就是我们经常看到到aPaaS,而它也更加倾向于SaaS.但实际上,低代码开发平台是可以支持本地部署的,例如 ...

  6. CentOS-Docker搭建远程监控服务器指标

    注:远程监控服务器指标,可查看.CPU.内存.网络信息等,搭建依赖Docker环境,可参考:yum安装Docker环境 服务端:Grafana(可视化展示) + Prometheus(数据源,配置客户 ...

  7. Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?

    Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题? Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解 ...

  8. Elasticsearch-04-master选举

    3.2 master选举机制 3.2.1 选举算法 1)bully算法 核心思想 假定所有的节点都具有一个可以比较的ID,通过比较这个ID来选举master 流程说明 节点向所有比自己ID大的节点发送 ...

  9. Scrapy框架安装与使用(基于windows系统)

    "人生苦短,我用python".最近了解到一个很好的Spider框架--Scrapy,自己就按着官方文档装了一下,出了些问题,在这里记录一下,免得忘记. Scrapy的安装是基于T ...

  10. RPC远程协议之原理分析

    在近几年工作中发现,功能服务化或微服务化越来越流行,逐渐成为实现中大型分布式系统架构的主要方式,而在分布式系统中的不同节点应用间的通信中,RPC远程协议扮演关键作用.实际上,在日常工作中,我们也多多少 ...