开放源代码平台Flynn的架构与实现原理

简介: 【6月更文挑战第30天】应用程序的生命周期涉及从开发到运行的复杂过程,包括源代码、构建、部署和运行阶段。

现在的应用程序从源代码到运行阶段太复杂,没有标准的、通用的方式。整个过程及产出分为以下几个阶段。

  • 开发阶段:源代码。
  • 构建阶段:发布包/可执行程序。
  • 部署阶段:可运行的镜像(发布包+配置)。
  • 运行阶段:进程、集群、日志、监控信息、网络。


如果需要管理或者构建一个完整的服务栈,容器扮演的仅仅是一个基本工作单元的角色。在服务栈的最下层,需要有一种资源抽象来为工作单元展示一个统一的资源视图。这样容器就不必关心服务器集群资源情况和网络拓扑,即从容器视角看到的仅仅是“一台”服务器而已。还应该能够根据用户提交的容器描述文件来进行应用容器的编排和调度,为用户创建出符合预期描述的一个或多个容器,交给调度引擎放置到一台或多台物理服务器上运行。


如何为容器中正在运行的服务提供负载均衡和反向代理,如何填补从用户代码制品到容器这一“鸿沟”,如何将底层的编排和调度功能API化等,这些功能看似并不“核心”,却是实现“面向应用”云平台的必经之路。


Flynn,一个具有Layer 0和Layer 1两层架构的类PaaS项目,对宿主机集群实现一个统一的抽象,将容器化的任务进程合理调度并运行在集群上,然后对这些任务进行容器层面的生命周期管理

1、Flynn的主要功能

  • 分布式配置和协调

Flynn选择了etcd,但并没有直接依赖它,可以方便地通过实现Flynn定义的抽象接口将分布式协同组件更换成其他的方案。

  • 任务调度

Flynn原生提供了两种调度器,一种负责调度长运行任务(Service Scheduler),另一种负责调度一次性任务(Ephemeral Scheduler)。

  • 服务发现

在Flynn中,服务发现的主要任务是观察被监控节点(包括服务实例和宿主机节点)的上线和下线事件,从而在callback回调中完成每个事件对应的处理逻辑(如更新负载均衡的serve列表)。

  • 宿主机抽象

所谓宿主机抽象,是指上层系统(Layer 1)以何种方式与宿主机交互。宿主机抽象可以屏蔽不同宿主机系统和硬件带来的不一致。一般来讲,抽象实现的方式是在宿主机上运行一个Agent进程来响应上层的RPC请求,向上层的调度组件报告这台宿主机的资源情况,以及向服务发现组件注册宿主机的存活状态等。


2、Flynn的上层功能

Flynn构建在Layer 0之上的一套组件统称为Layer 1,它能够基于Layer 0提供的资源,抽象实现容器云所需的上层功能。

  • API控制器

Flynn也运行着一个API后端,以响应用户的HTTP管理请求。

  • Git接收器

Flynn使用Git来发布用户代码,Git接收器作为一个获取远程配置在用户方,所以用户推进的代码会直接交给这个接收器来制作代码制品和发布包。

  • Buildpacks

用户只需要上传可执行文件包(如WAR包),Buildpack就能够将这些文件按照一定的格式组织成可以运行的实体(如Tomcat+WAR组成的压缩包)。通过定义不同的Buildpack,PaaS就能实现支持不同的编程语言、运行环境、Web容器的组合。

  • 路由组件

容器服务栈要想正常工作,一个为集群服务的负载均衡路由组件是必不可少的。Flynn的路由组件支持HTTP协议和TCP协议,它能够支持大部分用户服务的访问需求。Flynn的管理类请求也是由路由组件来转交给API控制器的。通过与服务发现组件etcd协作,路由组件可以及时地更新被代理服务的IP和端口。


3、Flynn体系架构与实现原理

用户代码是如何上传到Flynn并执行运作的呢?主要有以下两种方式。

1)用户通过Git指令直接提交代码,这时Flynn需要做的工作至少包括以下几项。

  • 接收用户上传的代码。
  • 如果需要的话,按照一定的标准编译代码,组织代码目录。
  • 按照一定的标准将编译后的可执行文件保存到预设的目录中。


如果需要的话,按照一定的标准将可执行文件目录和Web服务器目录组装起来,生成启停脚本和必要的配置信息;将上述包含了可执行文件、Web服务器、控制脚本和配置文件的目录打包保存起来;在需要运行代码时,只需在一个指定的base容器中解压上述包,然后执行启动脚本即可,从可运行实体转换为应用实例。


当服务发布完成后,作为一个类PaaS项目,Flynn还需要实现这个服务或应用的整个生命周期管理,包括应用启动和停止、状态监控和测量。


第一,整个服务的生命周期管理的实现很简单,只需要针对微光生成的启动命令和运行起来的PID进行操作即可。


第二,服务和应用的状态监控。Flynn Host上的Container Manager进程负责实施健康检查,并检测本身运行着的容器数目,检测结果会更新Flynn数据库中的Formations表。另一端的Flynn Controller保持监听该表的数据变化,一旦发现预期的实例数和实际的实例数不一致,Controller就会根据差异值重新在某台Flynn Host下载并运行对应的Slug(或者删除多余的实例)。


第三,服务的水平扩展。如果需要增加实例,Flynn由用户指定某个Flynn Host来启动新的实例容器。如果用户不指定Host,那么Flynn调度器会选择一个当前运行中的实例数目最小的Host来运行。如果用户需要减少实例,Flynn会直接选择这个服务或应用的最新实例,然后把它们删除。


2)直接上传用户Docker镜像并运行起来。

当需要运行某个应用时,Flynn会从Blobstore中下载对应的Slug来运行。Flynn如果想要用户上传一个Docker镜像来运行,就要想办法把镜像制作成一个伪Slug。对于Docker镜像来说,发现和编写两步是不需要的,所以Flynn处理Docker镜像的过程直接来到了释放这一步骤。最后,就可以使用scale指令启动Docker镜像。

相关文章
|
6天前
|
监控 Java API
淘客返利平台的微服务架构实现
淘客返利平台的微服务架构实现
|
2月前
|
监控 负载均衡 Java
【阿里云云原生专栏】微服务架构在阿里云云原生平台上的应用实例与优化策略
【5月更文挑战第20天】本文介绍了在阿里云云原生平台实现微服务架构的步骤,包括基于Spring Cloud的Docker化部署、使用ACK部署微服务,以及优化策略:服务发现与负载均衡(借助Istio)和监控日志管理。通过这种方式,企业能提升应用的可扩展性、可维护性和敏捷性。
219 5
|
2月前
|
存储 运维 监控
|
2月前
|
前端开发 NoSQL 数据库
切图仔做全栈:React&Nest.js社区平台(一)——基础架构与邮箱注册、JWT登录实现
切图仔做全栈:React&Nest.js社区平台(一)——基础架构与邮箱注册、JWT登录实现
|
2月前
|
缓存 小程序
Java+saas模式 智慧校园系统源码MySQL5.7+ elmentui前后端分离架构 让校园管理更高效的数字化平台系统源码
智慧校园是在数字通增强版基础上,研发的一套面向教育行业的数字化校园软件,其显著特点是集学校网站、协同办公、即时通讯、网络空间、移动办公于一体。在满足教职工日常办公需要的同时,拥有诸多教育行业功能,并提供便捷易用的“家校通”平台以满足老师、学生、家长的日常交流。数字通智慧校园教育版中的协同办公、即时通讯、移动办公等功能模块随通用版一同改进,将网络办公最新技术应用到教育行业。
62 1
|
2月前
|
存储 负载均衡 Java
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
|
2月前
|
SQL NoSQL 前端开发
基于BS架构的饰品购物平台设计与实现(程序+文档+数据库)
基于BS架构的饰品购物平台设计与实现(程序+文档+数据库)
|
2月前
|
架构师 Java API
阿里P7架构师带你深入剖析synchronized的实现原理
显示锁ReentrantLock的内部同步依赖于AQS(AbstractQueuedSynchronizer),因此,分析ReentrantLock必然涉及AQS。
24 1
|
2月前
|
存储 缓存 前端开发
基于B/S架构的实验室管理系统(云LIS平台源代码)
云LIS系统集成了样本管理、检测项目管理、质控管理、报告管理、数据分析、两癌筛查等多个方面的功能,为实验室提供了一站式的信息化解决方案。系统采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等技术,支持LIS独立部署、Docker部署等多种方式,方便用户根据自身需求进行定制和扩展。
基于B/S架构的实验室管理系统(云LIS平台源代码)
|
13小时前
|
负载均衡 Java API
Java微服务架构中的API网关设计与实现
Java微服务架构中的API网关设计与实现