这个春节假期由于新冠弄得一直在家憋着,闲得无事把spinnaker代码翻出来把每个微服务重新review一遍,做了一些笔记,今天拿来分享一下,后续如果有spinnaker开发或者bug修复可以直接有的放矢。计划先把核心的几个微服务分几期慢慢介绍下:orca、clouddriver、deck,今天先介绍orca。

Orca名词解释

Orchestration
       与pipeline平行,我个人理解是orca这个微服务主要是为了支持pipeline工作流的,为了对接临时性的任务包扩展出了ORCHESTRATION
     Execution
       一次执行。分为两种类型:PIPELINE和ORCHESTRATION,核心属性数一个stage的集合
     Stage
       orca最复杂的类型,关联一个execution和多个task,还维护有parentStage、downStreamStage、output等重要信息
     StageContext
       驱动这个阶段的环境,提供组件步骤所需的输入
     Task
       Stage的组成部分,orca中最小的操作单元     
    ExecutionRunner  Execution的执行者
    ExecutionRepository Execution的存储者,我们的是redis,也承载着检索查询
    ExecutionLauncher Execution的启动者,接收json封装成Execution,进行存储和启动
      1 Json封装Execution也会分为PIPELINE和ORCHESTRATION两种,本质没区别
      2 最终启动执行:

     public Execution start(Execution execution) throws Exception {executionRunner.start(execution);return execution;}

orca-web子项目(入口)

controller
    OperationsController: 与Execution相关的controller
      /orchestrate*
        最终startPipeline,以PIPELINE形式启动execution
      /plan*
        不会真正执行,经过一系列校验后通过ExecutionRepository存储executor
      /ops*
        最终startTask,以ORCHESTRATION形式启动executor
    TaskController: 
      /pipelines*
        对于pipeline的停、重、查,最终映射的对象类型还是execution
      /task*
        对于task的停、重、查,最终映射的对象类型还是execution
    orca-web总结:OperationsController和TaskController看似有重叠的部分都会涉及到execution,但是侧重点不同。OperationsController侧重于创建和启动,TaskController侧重于后续的暂停、撤销和查询。

orca-core子项目(抽象层)

根目录:
    定义一系列的task:retryableTask、cancelableTask等
  annotations 自定义sync,用于标注同步,可以作为自定义标注的学习参考
  clouddriver.utils 根据stage获取各种clouddriver的信息
  commands 意义不大,不需要看
  config:orca配置
  exceptions:除开定义了异常,还定义了处理异常的Handler,借鉴下

/** Copyright 2014 Netflix, Inc.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**    http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.netflix.spinnaker.orca.exceptions;import java.util.Collections;
import java.util.Map;
import com.google.common.base.Throwables;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import static java.lang.String.format;
import static org.springframework.core.Ordered.LOWEST_PRECEDENCE;@Order(LOWEST_PRECEDENCE)
public class DefaultExceptionHandler implements ExceptionHandler {private final Logger log = LoggerFactory.getLogger(getClass());@Override public boolean handles(Exception e) {return true;}@Overridepublic ExceptionHandler.Response handle(String taskName, Exception e) {Map<String, Object> exceptionDetails = ExceptionHandler.responseDetails("Unexpected Task Failure", Collections.singletonList(e.getMessage()));exceptionDetails.put("stackTrace", Throwables.getStackTraceAsString(e));log.warn(format("Error occurred during task %s", taskName), e);return new ExceptionHandler.Response(e.getClass().getSimpleName(), taskName, exceptionDetails, false);
}
}

events:
    定义了execution、stage、task的各种事件,
    也定了以上事件的监听基类,本质上没有自己做处理,都是丢给delegate在处理,代理模式

  private void onTaskStarted(TaskStarted event) {Execution execution = retrieve(event);List<Stage> stages = execution.getStages();stages.stream().filter(it -> it.getId().equals(event.getStageId())).findFirst().ifPresent(stage ->delegate.beforeTask(persister,stage,stage.getTasks().stream().filter(it -> it.getId().equals(event.getTaskId())).findFirst().get()));}

listeners:
    定义了ExecutionListener和StageListener两个接口,也就是events中的delegate,定义了一些阶段和要重写的方法。像echo通知等就是这种实现机制。

/** Copyright 2016 Netflix, Inc.** Licensed under the Apache License, Version 2.0 (the "License")* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**    http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.netflix.spinnaker.orca.listeners;import com.netflix.spinnaker.orca.ExecutionStatus;
import com.netflix.spinnaker.orca.pipeline.model.Stage;
import com.netflix.spinnaker.orca.pipeline.model.Task;public interface StageListener {default void beforeTask(Persister persister,Stage stage,Task task) {// do nothing}default void beforeStage(Persister persister,Stage stage) {// do nothing}default void afterTask(Persister persister,Stage stage,Task task,ExecutionStatus executionStatus,boolean wasSuccessful) {// do nothing}default void afterStage(Persister persister,Stage stage) {// do nothing}
}

locks
    看了下是为了多节点部署而设计的,目前阶段可以不关心
  pipeline
    最核心的一个类StageDefinitionBuilder,所有的stage都要继承它
    AcquireLockStage、CheckPreconditionsStage、EvaluateVariablesStage、ReleaseLockStage、WaitStage

orca-clouddriver子项目(核心实现)

先搞明白3个服务:oort、mort和kato,这三个都是指向了clouddriver的restful
      oort是大头:对接cluster、image、instance、loadbalance等云平台资源
      mort是小头:对接vpc、安全组、账号鉴权
      kkato是辅助:对接其它辅助的资源
    pipeline:
      stage对于task的组装,注意其中的provider包是留给厂商自己私有化的,所以关于orca云厂商差异化的部分也都集中在这里。
    tasks:
      具体的task实现,也是未来集中关心的地方,provider中各个厂商都有自己的私有化

Spinnaker第七节—Orca代码详解相关推荐

  1. yolov3代码详解(七)

    Pytorch | yolov3代码详解七 test.py test.py from __future__ import divisionfrom models import * from utils ...

  2. 深度篇——目标检测史(七) 细说 YOLO-V3目标检测 之 代码详解

    返回主目录 返回 目标检测史 目录 上一章:深度篇--目标检测史(六) 细说 YOLO-V3目标检测 下一章:深度篇--目标检测史(八) 细说 CornerNet-Lite 目标检测 论文地址:< ...

  3. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  4. 代码详解|tensorflow实现 聊天AI--PigPig养成记(1)

    Chapter1.代码详解 完整代码github链接,Untitled.ipynb文件内. [里面的测试是还没训练完的时候测试的,今晚会更新训练完成后的测试结果] 修复了网上一些代码的bug,解决了由 ...

  5. DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

    FROM: http://blog.csdn.net/u012162613/article/details/43225445 DeepLearning tutorial(4)CNN卷积神经网络原理简介 ...

  6. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  7. python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解

    导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...

  8. sip消息类型和消息代码详解-转

    在学习asterisk的时候,经常遇到一些远程服务器传回的代码,这些代码都有很重要的信息,让我们了解到对方的sip是如何响应我们这边的sip消息的,于是网上找到了这些sip消息类型和消息代码,自己收藏 ...

  9. 目标检测Tensorflow:Yolo v3代码详解 (2)

    目标检测Tensorflow:Yolo v3代码详解 (2) 三.解析Dataset()数据预处理部分 四. 模型训练 yolo_train.py 五. 模型冻结 model_freeze.py 六. ...

  10. 主成分分析(PCA)方法步骤以及代码详解

    主成分分析(PCA)方法步骤以及代码详解 前言 上一节我们了解到在构建神经网络模型,除了掌握如何搭建神经网络架构,了解参数具体含义,规避风险等方法.第一步是要对采用数据集的详细了解,无需接触任何神经网 ...

最新文章

  1. 全球及中国商用杠铃架行业营销策略及投资建议分析报告2021-2027年版
  2. 【转载】看板方式简介
  3. 互联网1分钟 | 0221 丁磊: 2019年在线教育会是网易专注的业务之一;谷歌混合云计算平台开始测试...
  4. (第五篇)Linux操作系统基本结构介绍
  5. webpack VS Node.js - 二者对 require 功能的实现区别
  6. 用udp协议通讯时怎样得知目标机是否获得了数据包?_和相亲对象聊天,你属于UDP还是CDP?...
  7. 清北学堂 清北-Day1-R1-Count
  8. 巴菲特如何滚雪球的?
  9. jdk1.8_API中文帮助文档
  10. python的invalid syntax是什么意思_请问在python 中 出现 invalid syntax 是什么意思 ?
  11. win8、server 2012 清除winsxs文件夹
  12. 23岁需要做到的事情
  13. Auto.js Pro安卓免ROOT引流脚本开发系列教程25网易公开课(3)-取用户性别
  14. android自定义抽奖,Android简单实现圆盘抽奖界面
  15. 计算机java工程师证书有哪些,java工程师证书怎么考?考工程师证书需要学什么内容?...
  16. CSS处理图片渲染时拉伸和挤压变形
  17. 关于今天烧坏树莓派板子一事的所思所想
  18. 阿里云建立Web网站基本步骤
  19. 九宫格拼图游戏设计,及代码时序问题解决
  20. 关于小蚂蚁数据(SmallAnt Data)

热门文章

  1. Ruijie(RGOS 11.X)忘记登录密码console口恢复密码
  2. idea使用技巧总结,超实用(2年mac idea使用经验)
  3. 【新手教程】51Sim-One Cloud 2.0 创建你的第一个案例
  4. 用LED驱动框架注册led设备的示例代码
  5. 树莓派linux led字符设备驱动(互斥)
  6. fatal error LNK1104:无法打开***.exe
  7. 企业微信开发OA审批
  8. 图文并茂简介如何查询文章是否被SCI收录以及获取SCI索引号
  9. pycharm文件名颜色含义
  10. 电脑重置,win10怎么重置此电脑 重置电脑的方法和后果