【需求】我是怎么带几个学生从零开始做一个研发中台的

接触中台的概念是在18年,互联网还在流行DevOps,微服务,资料异常多,但是却又是异常的敷衍,几乎没有一套完整的可落地的开源框架,大多就是一个权限系统、一套微服务脚手架,或者说一套似乎有完善落地的Docker或者K8s,但是能不能真正落地起来,到底怎么落地,不清楚,也不知道,符合不符合场景,查找到的资料都是说好,但是能不能落地,心里很是没底。

考虑左右,从零搭建了一套开源的研发中台,带着几个大学生,利用业余时间,用了大概1年多的时间,从过程的团队建设,试点尝试,过程分工,到形成一套中台项目管理流程,整个最终可以勉强实现下来,也是感慨万千,唏嘘不已。

整个研发中台架构 (http://cloud.linesno.com)

为什么要做这样的中台,还要从零开始

1、需要知识积累和沉淀,不断的反思,不断的吸收,不断成长

有一定工作的经验的开发肯定知道,企业开发中包含有大量的、重复的CURD(增删查改),以及重复性组件,还有不断的获取和重复使用的学习资料等等,这些重复性的东西,每次使用都有新的感悟和感受,如果没有积累,每次都可能从零开始,无法达到沉淀和积累,从而浪费大量的时间和精力在上面,如温水煮青蛙,久而不知,而自茧作缚。

而相对的另一个例子,滴水穿石,之所以可以穿石,就是因为不断在前面的积累基础上,加上不断的坚持,如果每次从零开始滴,也许也可以穿石,但是消耗的成本和时间,也是很巨大的。学习也是如此,加上不断的积累,在一项技能上不断的学习积累,日积月累,不管有没有达到”穿石“,但是一定有会不小的进步。

2、不想把时间浪费在无用的点上,更想专注,不用站在巨人的肩膀,自己就有肩膀

有一种慢慢的体会和感悟,叫“ 欲速则不达 ”, 每个事情都有消耗时间、精力、过程,而人本身就是一个有限的特种,怎么样可以在有限的时间里面,更好的完成和学习,需要的不是其它,而是【专注】。所谓的专注并不是要时时刻刻的去想,去学习,而是坚持长久的做这个事情。

类似的如常见的1万小时成专家说法。 中台搭建的目的之一,就是节省用时间,去掉重复无用的东西,在有限的时间里面,更好的专注在新的点上,不断的前进,不断的提升自我。

3、落地不是一个人的事情,是整个团队的事情,要学会带团队一起成长

一套中台,需要涵盖的内容很全面,每个模块,领域都需要有对应的人员,这个时候,不是一个人能完成,而是需要调用团队的力量去实现。 就像打球,即使说有一个人球技出神入化,但是他一样也需要传球的人,助攻的人。想要落地这个平台,就需要有团队参与,发挥团队优势,提升整个团队气氛,团队合作,合理分工等,这些都需要学习和实践。

最后获利的不是某一个人,也不是具体谁谁,而是团队的每一个成员,在这个过程中能发挥、创造、体现出他们自己的价值,团队成员的见识、协作、信心等的成长。不管这个过程是艰辛也好,埋怨也罢,你走你才知道,而不是听谁说你才知道,这就是你自己的经验,自己的价值。

带人的过程是要学会发挥自己的能力的同时,更要学会带团队一起成长。

4、需要一套完善的研发中台打磨,站在前面的基础上提升

在出来一套可见东西之后,可能比想像的还要“千疮百孔”,还要不堪,甚至连往回看的勇气都没有。但是正是这样的东西,摆出来,拿出来,虚心接受所有的问题和建议,然后在后期一步步消化,一步步打磨,而形成出来的,就是自己的产品,或者说,把自己打磨成一套精品。

技术总会在不断的发展,需要有一个产品,一个中台可以让你,或者我在更好的中台上面做预研,而出来的成果,也会比从零起个“Hello World”强得多,毕竟你已经在场景里面,已经在平台里面,安全,测试,规范,可用性,健壮性等等都有中台的验证和支撑。

开发接入研发中台的HelloWorld说明

没有实战基础的学生,是否能组成团队

1、为什么要选择学生团队,不找有工作经验或者社会经验的人

找学生,这也是B方案,前面的A方案,最初规划,团队组件的是找的是同学和有工作经验,还找了以前老师作为指导,沟通好,拉了10几个人成团,便开始。但是这个过程经过不到2个月就发现问题,异地沟通困难,团队鸡血也很快消磨,有转成观望态度,原因不免是 工作忙,时间精力不足,整体的技术预研也几乎停滞不前,原计划的分工,很快无法往下,研发任务开始体现出敷衍趋势,成立的微信群很快形成死群。开始信息发出的时候,还有几个人附和,到后面,可能连附和都没有。

很快,就有提出要退出研发计划,同时各种小群也开始建立,这些都意味着团队有危机的趋势,不管是信任和人心开始出现浮动,放置观察了1个多月,考虑同学,朋友,还有后面的各个因素,无奈放弃此方案,成员停止研发沟通联系,慢慢的转向分享文章,咨询经验等方式,进而消停。

由于之前在校时有一定的学生接触、组织经验,B方案实施也是很快落地,不到2个星期的时间,也成立了10几个人的群。学生没有实战经验,不管是沟通还有动手,都与实际工作人员有天跟地的区别,而能不能落地,却成为一个最担心的事情。不仅仅如此,学生成团的现象,抱团等情况,过于依赖于师生级别关系(比如较愿意听老师的话),这些都是问题,不过既然A方案放弃,就得全力保障B方案的实施,而且这步的操作过程,更需要严格,可控。

2、怎么进行团队的培养、磨合,最终成为可作战的兵团

学生团队开始份两个组别进行,互相互相隔离的分开,原考虑是分开培养,然后两边达到可控,可对比,以小组作为培养线。一开始活跃气氛远高过之前的团队,也是理解,毕竟学生很有学习的积极欲望。开始的时候,流程按 【培训_学习_考试_分级_练习_评审_重构】 这几个流程,按这几个流程下来,这个过程很快,几乎一个月内就可以完成。

当时整理的等级技能图

过于顺利的流程让我感觉,应该问题不大了,而且很快就可以进入提升学习阶段。考虑左右,虽然考虑可能有难度,由于之前的表现,还是比较有信心,毕竟流程,团队制度有建立雏形。决定开始接入新项目,进行实战练兵。

很显然,我的判断是错的,而且过于过早的接入实战,实战性的要求,沟通,压力等,让组长无法承受压力,而且之前做了一个最大的失误,考虑组长退了,副组长可以顶上,也就是常见的AB岗形式,结果却是组长退了,下面的学生人心异动,而且又是核心成员,很快引起其它成员信任危机,深度做安抚工作,而且减少对应的任务安排,但是最终还是造成内部沟通的不利,需要在任务上进行妥协,而这样的妥协却极度不利的中台的研发和后期的任务安排。这个近乎两个月的组团培养,组团受挫,这不得不让我思考之前的一些策略与方式。

明显,资源开始主要集中在第二组,这个时候,已经开始感觉到,组团的风险和管理上的缺失,不过幸运的是,前面两组留下了很多资料和资源,留下的这组人与上一组留下的成员,从素质上确实也比较高,很快完成了新的组团,而且意识较为统一,在沟通明显都成一气。

也发现,找人组团,不管是人员素质,意志力还有自控力等都有一定的要求,是否看个人有成长的追求等,能克服困难,能坚持。在进行多次任务安排和沟通之后,最终确定留下人员也就只有几个学生。 由原来的差不多30人, 差不多半年的时间里面,经历两轮的练兵和实战,后面一年的时间里面,也有进进出出的,但是最终来说,还是这几个人为核心。

3、怎么消掉学生气,形成接近社会的工作状态

学生团队与实战要是能对接得上,最大的问题是怎么样调整状态,即执行力,沟通能力,协助能力等,合理安排好自己的学习和工作时间,不影响学习,然后又能参与到项目建设中来,学会怎么样安排,怎么样协助,遇到困难的时候怎么面对,使达到任务目标。

而想到的,最好的练习方式,也是要接一个实战,所以,校内跑腿项目就建立了。

校园跑腿项目后台(测试界面)

校内跑腿是考虑到的一个比较接近于实际,涉及到各个方面的能力的项目。从开始的开始的项目立项,然后到团队执行,再到人员计划安排都走过一次,比如计划方案怎么写,中间沟通问题怎么考虑,遇到一些问题,怎么处理。如与社团合作的时候,达不到效果,然后就找会长一起沟通,然后面对问题,而不是说,逃避问题。开始常常是一个问题一遇到就想着可能会失败,“哎,可能就这样了”,这个时候就引导找到问题点,解决问题点。也有说以为安排就需要马上完成的,就告诉他们要有计划,然后哪天完成哪些,一步步执行,不要急于这一天等。

他们有思路,听取他们的意见,尊重他们的意见,有一些想法就多鼓励去做,在执行过程中,也配合他们一起处理,让他们有意识的知道,原来这个是错的,毕竟新人,带有一些学生气,有冲劲。如果执行过程有困难,就多鼓励,如果有错误,就引导并适当批评,有成果,就奖励等。

在两个多月的时间里面,跑腿人员大概有70多人,公众号关注人1000多人,然后订单2000多单,整理了从申请,接单,跑腿,扩展等流程。团队也开始慢慢会了讨论,沟通,使用一些常用的工具,体会互相理解,互相宽容,执行力和作事思维也慢慢了有了提升,了解到生产中实际项目,包括工程代码的研发过程过程,比如怎么对接微信,登陆,支付等(跑腿项目是自研的),至少达到这一步,也是多少有些欣慰的。

关于公众号,原本可以让他自运营的,毕竟流程制度都在,对跑腿人员也有利益,却因为公司的问题,暂时停止了项目,也是较为可惜。

平台研发过程中怎么安排学生团队,学生团队可以做什么

1、过程成员缺少很多东西,怎么安排任务

最主要的是怎么安排研发任务,然后又不能一下给太多任务,还要有一定的成就感,这个倒是为难到我。整体的研发平台涉及到的面太多,从文档,服务器,运行,执行集成,项目代码等都有一整套,这些都要落地,让他们实现任务的同时,能有自己的成果。

前面的整体架构,包括规划这层,在前面团队组建的时候,我这就把整个蓝图做了规划(组团的时间远超过之前的估计,原计划是3个月,最后想不到用了大半年),这也是特别麻烦的一点,无法让他们有参与感,考虑左右,就只能从最简单的开始。

规划的第一版本整体研发中台架构

开始从jenkins 的使用,然后到Git导入批量工程,怎么团队协助,合并代码,怎么帮别人运行中台,从最简单的操作开始,然后怎么本地部署,比如Zookeeper,redis使用场景,工程怎么打包,服务器怎么查看异常,怎么查看日志等,都从最简单的做起,一点点的完成带入感,慢慢体会到平台的过度。在有些了解之后,开始学会使用代码生成器,生成服务工程 ,生成一些组件,生成CURD,做一个学生管理系统。比如日志组件,通知组件,这些都可以让他们使用代码生成器一步完成初版,后期的我再在上面进行优化处理。

规划的第一版本整体学习计划

目标就是让有了解之后,有自己的想法,可以实现自己的想法,从而提升自己,增加自己的知识面,这也是引发出其它的问题,就是知识深入的问题。毕竟面的代价就是深度,而这个,当前做的最好的办法就是,鼓励认真学习大学老师的课程并说明重要性(我们大学都是以学习基础为主),然后计划的时间拉长,比如完成一个Git工程导入的任务可能要1周。

2、消极,缺乏自信,缺乏学习主动性,怎么办

平台研发过程中,最为难的事情就是接触新的事务,常常接触到的回应是 ”我不知道“ ,”我没接触过“ 等,或者说,一接触到新的东西,就莫名的害怕,还有一种比较常见的情况就是,任务往往都是最后一天才有去执行,其实这个问题倒不大,但是却有各种理由来表达 如 “学习任务太多” 或者说 “正在看” 。开始就发现问题,然后就往下问,却不是这么回事。主要还是缺少学习的主动性,然后在追问的时候,又知道这样不对,内心存在愧疚,然后又有点畏惧罢了,这也许是学生团队的可爱之处。

这种情况还是比较常见的,无可否认,即使在实际工作中,这种也是屡见不鲜的。没有接触过就先让他们百度,网上参考,找解决方案,多问人,不要怕问,也不要害怕说问多别人会生气,更不要怕百度拿别人的代码(这是与应试教育不同的地方之一了)。软件以实现功能为主,也鼓励创新,但是更多的是,解决问题为主,做事要有始有终,有成果。针对于另一种情况,却是批评为主,或者说有时候激动,就真要多说几句。并不是不允许最后一天执行,但是最主要的是不能敷衍,对就是对,错就是错,要敢于面对问题,敢于表达自己的问题,也不要怕被别人看见,怕被别人知道,学会面对,然这样才有发现问题,解决问题,避免自欺欺人。

过程以慢慢的培养主动性,自主学习能力,自我提升为主,同时,也要树立正确的三观,工作观,培养的做事的魄力。

3、团队过程最为合理的,感觉还是激起人善意和潜力

其实这个过程中,最害怕也是最难做的,就是怎么带团队的问题,结果不是怕不出成果,而是误导。带的过程,并不是说不敢给压力,更不是说不敢给努力,而是在有限的能力里面,让他们最大的发挥自己,然后创造他们自己的价值,发挥他们自己的价值。其实这个并不是自己的觉悟,而是在自己莫大的团队管理困扰之后,在读到一篇微信文件,介绍“彼得 德鲁克”的时候,一个自己的真实体会。

现实中,不仅仅是这几个学生,在公司内部也一样涉及到一些管理性的工作,带队工作,这个比起学生团队,更加残酷得多,也现实得多。团队成员并不是我们的上下级,而是大家的一种互助,一种共赢。自己在培养别人的同时,别人也在培养你,提高自己更高的标准,锤炼自己的人格,同时超过我们自己的局限,做出自己可能自己都没有想到的事情。提升他们,帮助他们,感恩他们,同时他们会感恩你,跟随你,展现自己的人格魅力,而其它的管理工具,还有书籍,更多的感觉是一种辅助。

带团队过程中,本身也要学会反省,检讨自己,必须要清楚自己在做什么。反之,正如一部电视剧里面说的,孝庄对康熙说的:“鳌拜可能不是自己要反的,而是你把它逼反的”(大意如此,原话不记得了)。而相反的,激起他内心的善意,学会感恩,这样,也许会更好的让他发展自己,即使不在这个团队,在另一个团队,公司也能有这样的心态,久而久之,也肯定会赢得别人的认可 ,创建自己应该有成就。

我们要做成怎么样的目标

1、要形成大平台作为后盾,小兵团进行作战的战略

平台建设从开始的团队组建、培养、到一起作战,项目从开始的架构设计,技术选型,第一行代码,到第一个访问链接,都包含着一层层的努力和坚持。这个过程大概过了1年多,从计划到出来第一版本,基本上能达到“大平台,小兵团“作战的目标。

中台的形象示例

当然,目前的版本还是千疮百孔,有些地方甚至可能不堪,或者不完善,这些都是开始,一个初型。需要不断的实践,团队不断的去上面去锤炼它,让他成长,然后添加自己的想法,表达自己,它就像一个土壤,为下一步的完善的过程提升了基础。

为团队的下一步,后来,甚至未来的蓝图规划, 带来了一种可能,而不再是纸面上理论,更不再是网上这里缺少一块,那里缺少一块,不可落地的东西,而是一个完善的架构,一个完整的研发中台,希望可以为项目管理,开发,管理带来战略上的共赢。

2、持续迭代,不断更快更好的升级和优化

在后续不断的学习中,会不断的去学习,实践自己的想法,整合更好的资源,技术,吸收更稳定的,可用的东西,不断的提升研发中台的能力。

这是一个很长的过程,可能是一年,两年,甚至是五年十年,学习不止,步伐不停,积跬步以至千里,积小流以成江河。打造研发中台的过程其实出来这个并不是中台的精品,而是这个精品是你自己,磨炼的不是所谓的中台,而是你自己。

最后

以上就是带学生团队1年多来走过的历程,从零实现,走过的路程。不算长,也不算短,只是一个过程。

企业统一研发中台实战视频教程

设计

中台研发设计

  • 研发中台架构整体概括和演示
  • 大中台小前台架构模式的适用场景
  • 企业统一研发中台设计基本原则
  • 企业项目管理整体架构设计
  • 中台整体规划和技术
  • 中台技术选型和基础准备

研发

当前只是基础版

  • 基线规划和组织规划
  • 中台研发基础环境搭建
  • 实现基础工程包
  • 实现代码生成器
  • 实现基础服务工程初版
  • 实现基础配置平台
  • 实现基础网关平台
  • 实现平台基础对外门户
  • 测试基础接口实现
  • 测试基础UI实现
  • 运维基础框架
  • 运维基础监控框架
  • 第一个HelloWorld项目

落地

企业落地

  • 第一个项目组接入
  • 多个项目组接入研发平台
  • 项目组沟通计划落地

迭代

后续迭代

  • 业务中台抽取搭建
  • 企业平台迭代和思路

Java自动化测试工具汇总

xUnit frameworks 单元测试框架

TDD \ ATDD \ BDD

  • 工具
    • JBehave – Behaviour-Driven Development (BDD)测试框架. BDD是从 test-driven development (TDD) 和 acceptance-test演进而来, 让用例的编写对新手更加友好和直觉化
    • Cucumber-JVM – 纯 java的Cucumber实现,支持大部分流行的jvm语言
    • JGiven – 开发者友好且实用的BDD工具. 开发者使用纯java及流利API编写测试场景, JGiven负责生成领域专家可读的报告
    • easyb – Java平台的BDD框架. 通过使用Domain Specific Language(DSL), easyb致力于让文档可读可执行
    • robotframework – 最有名的acceptance test-driven development (ATDD)测试框架
    Spectrum – BDD-style test runner,支持Java 8. 灵感来自于Jasmine, RSpec和Cucumber.

Model-Based Testing

  • GraphWalker – Model-Based测试框架. 这个工具可以从 graphml, dot 或 json文件中读取model,然后自动创建测试用例

Code analysis and coverage 代码扫描和代码覆盖率

  • SonarQube – 管理代码质量的开源工具
  • Gradle Quality Plugin – 静态代码分析工具,支持Java和Groovy,使用 Checkstyle, PMD, FindBugs 和CodeNarc. 插件使用了统一的控制台输出并简化了开发者的工作流: 查看不规范的错误时只需要留意控制台就好,并且控制台输出的体验跟java编译错误的输入体验一致
  • Qulice – Qulice是Java项目的代码扫描和质量控制工具. 包含了最好的静态代码扫描工具和预配置选项。你不需要单独再对这些工具进行配置了。
  • JaCoCo – JaCoCo是免费的代码覆盖率统计工具,应该也是应用最广泛的覆盖率工具了。

Web UI test automation web ui自动化工具

  • libraries
    • Selenium – 浏览器自动化工具
    • SikuliX – 基于OpenCV的 GUI 测试框架, 使用图片识别技术,支持windows/linux/mac系统
  • frameworks and wrappers 框架及封装
    • Selenide – 简洁的Selenium封装,让 UI用例的编写更容易
    • Selenified – 开源的测试框架,目的是让selenium测试更加简单,提供了简单的接口去添加测试报告,错误处理以及线程安全的运行模式。可以运行在本机或云端(Grid or SauceLabs).
    • Serenity BDD (Thucydides) – 创新的开源库,让你可以更高效的编写用户验收用例, 并可以根据用例去生成项目文档及测试报告
    • htmlelements – 让web测试时元素交互更加简单的java库
    • atlassian-selenium – 让开发者可以更高效的编写Selenium/WebDriver功能测试的开源库
    • stevia – Persado出品的开源自动化测试框架
    • darcy – 开源的测试框架,支持java 8,提供了具有表意性以及使用简单的API
    • Satisfy – 基于Thucydides和Jbehave的开源测试框架。支持WebUI, SOAP, REST, emails, files,并支持创建随机数据,开箱即用
    • JDI UI Test Automation Framework – UI自动化测试框架。扩展了Page Object设计模式,并加入了一些常用的元素
    • Geb Framework – 基于groovy自动化测试框架。专为Webdriver Page Object设计模式以及Spock Framework(BDD)的集成而设计。
    • FluentLenium – FluentLenium可以帮助你写出可读性好, 可重用, 可靠且灵活的Web UI功能测试用例. FluentLenium 提供了为Selenium实现的流利api,并为selenium用户的一些常见问题提供了解决方案。
    • Selion – 基于TestNG和Selenium提供了一系列的功能,让你可以在短时间内搞定webdriver. 支持web和移动端测试
  • extensions 扩展
    • BrowserMob Proxy -从浏览器获取性能数据的简单工具, 一般跟自动化工具,比如Selenium和Watir配合使用
    • Selenium-Grid-Extras – 让Selenium Grid 节点的管理更加简单, 并通过清理测试环境的方式让节点更加稳定
    • Selenium Grid Extensions – 扩展了Selenium grid,以及可以在执行selenium用例的同时执行Sikuli用例
    • Selenium Grid Router 轻量级的server,作用是把Selenium Wedriver的请求分发到多个Selenium hub。
    • Docker Selenium Grid – 提供了native的视频录制功能,支持Selenium Grid,最初被设计为跟docker-selenium一同使用。
    • Video Recorder Java – 使用自动化测试用例来录制视频的java库
    • Zalenium – 提供一次性的灵活的Docker-based Selenium Grid视频录制功能, 支持实时预览和online/offline控制面板。
    • SikuliFactory – 为SikuliX提供了PageFactory实现。
    • Mailosaur – 邮件自动化测试工具,基于Mailosaur。

Mobile test automation 移动自动化测试

  • Appium – 开源的自动化测试框架,可以测试native/hybrid/mobile web应用。核心是基于webdriver协议进行了扩展
  • Calabash – 跨平台的自动化测试框架,支持Android和iOS的原生应用以及hybrid应用。 Calabash的语法非常容易理解,甚至可以让非技术人员编写和执行基于上述平台的自动化测试用例。
  • Robotium – 安卓自动化测试框架,支持原生及hybrid应用. Robotium让我们可以非常方便的编写强大和稳定的黑盒UI测试用例。 有了Robotium的支持, 测试开发工程师可以编写安卓应用的功能用例系统用例以及用户验收用例。
  • UIautomator – 提供了高效的测试UI的方式。 可以创建支持真机及模拟器运行的自动化测试用例,并包含了可以查看和分析安卓UI的viewer。
  • Espresso – 比较新的开源自动化测试框架, 让开发者和测试人员都可以编写UI用例。 Espresso的api简单且易学,你可以非常快的使用这个框架上手安卓自动化测试

API test automation 接口自动化测试

  • Karate-DSL – Karate是BDD风格的使用javascript实现的测试框架。可以让你调用任何web-service类型的接口并对响应进行断言。

Windows UI test automation windows ui自动化测试工具

  • SikuliX – 基于OpenCV的 GUI 测试框架, 使用图片识别技术,支持多操作系统
  • Winium.Desktop – 测试Windows应用(主要是基于WinForms和WPF平台)的自动化测试工具. 实现了Selenium Remote WebDriver协议

Unix \ Linux UI test automation Unix \ Linux ui自动化工具

  • SikuliX – 基于OpenCV的 GUI 测试框架, 使用图片识别技术,支持多操作系统

MacOS UI test automation mac ui自动化工具

  • SikuliX – 基于OpenCV的 GUI 测试框架, 使用图片识别技术,支持多操作系统

Server side test automation 服务端自动化测试工具

  • Citrus – Javas实现的测试框架,支持企业级SOA应用的e2e服务测试, 支持 HTTP, JMS, TCP/IP, FTP, SOAP协议,以及XML和JSON.

Kong基础

介绍

技术特性适用场景说明
Kong– 基于OpenResty编写
– 高可用
– 易扩展
– 支持Cassandra存储
– 支持PostgreSQL存储
– restfull 方式 管理admin api
– 插件化支持
– 集群中的节点通过gossip协议自动发现其它节点
网关– 官网
– Kong Community Edition (CE)
– Github
– Docs
– Install Kong Community Edition
– Quickstart
– 入门
– FAQS
– Kong插件
konga– 多用户管理
– 管理多个Kong节点
– 电子邮件异常信息通知
– 管理所有Kong Admin API
– 使用快照备份,还原和迁移Kong节点
– 使用运行状况检查监控节点和API状态
– 轻松的数据库集成(MySQL、postgresSQL、MongoDB)
Kong GUI– 官网
– Github
– Doc
Kong dashboard– 基于node.jsKong GUI官方推荐UI管理工具
– Github
kongdash– 支持windows、MacOS、Ubuntu、Fedoradesktop client for Kong Admin API– 官网
– Github
– 下载

基本概念

名称说明
serviceupstream services的抽象。
Service的主要属性是它的URL。
服务与路由相关联(服务可以有许多与之关联的路由)
Route路由是进入Kong的入口点,并为要匹配的请求定义规则,并路由到给定的Service。
Route定义匹配客户端请求的规则。每个Route与一个服务相关联,一个服务可能有多个与之关联的路由。匹配给定路由的每个请求都将代理到其关联的服务。
upstream service这是指位于Kong后面的您自己的API /服务,转发客户端请求。
target
consumerAPI可能没有用户概念,会出现随意调用的情况。为此Kong提供了一种consumer对象(全局共用),如某API启用了key-auth,没有身份的访问者将无法调用该API。
api用于表示上游服务的旧实体。不推荐使用。

安装Kong

先决条件

安装PostgreSQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ yum -y install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm
$ yum -y install postgresql11
$ yum -y install postgresql11-server
$ /usr/pgsql-11/bin/postgresql-11-setup initdb
$ systemctl enable postgresql-11
$ systemctl start postgresql-11
$ su – postgres
$ psql
$ CREATE USER kong;
$ CREATE DATABASE kong OWNER kong;
$ alter user kong with encrypted password ‘123456’;
\q
$ find / -name “postgresql.conf”
$ vi /var/lib/pgsql/11/data/postgresql.conf
# 修改 listen_addresses项值设定为“*”
$ find / -name “pg_hba.conf”
$ vi /var/lib/pgsql/11/data/pg_hba.conf
# 添加以下内容
host all all 0.0.0.0/0 md5
$ systemctl restart postgresql-11

CentOS7中RPM方式安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 下载
$ cd /usr/local
$ wget https://bintray.com/kong/kong-rpm/download_file?file_path=centos/7/kong-1.3.0.el7.amd64.rpm

# 安装
$ yum localinstall kong-1.3.0.el7.amd64.rpm

# 配置kong的配置文件
$ whereis kong
$ cd /etc/kong/
$ cp kong.conf.default kong.conf
##### 内容开始 #####
database = postgres
pg_host = 10.10.1.179
pg_port = 5432
pg_user = kong
pg_password = 123456
pg_database = kong
##### 内容结束 #####

# 初始化kong的数据库
$ kong migrations up -c /etc/kong/kong.conf

# 启动kong
$ kong start -c /etc/kong/kong.conf

# 测试是否安装成功
$ curl -i http://localhost:8001/

kong的默认值

说明
kong默认的代理地址proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443
默认的管理地址admin_listen = 127.0.0.1:8001, 127.0.0.1:8444 ssl

安装kong-dashboard

npm安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 安装npm
$ yum -y install npm

# 安装kong-dashboard
$ npm install -g kong-dashboard

##### 启动kong-dashboard #####
# 查看启动选项的完整列表
$ kong-dashboard start –help
# 启动Kong Dashboard
$ kong-dashboard start –kong-url http://127.0.0.1:8001
# 在自定义端口上启动Kong Dashboard
kong-dashboard start \
–kong-url http://kong:8001 \
–port [port]
# 使用基本身份验证启动Kong Dashboard
kong-dashboard start \
–kong-url http://kong:8001 \
–basic-auth user1=password1 user2=password2
##### 启动kong-dashboard #####

# 访问kong-dashboard
$ curl http://127.0.0.1:8080

Docker安装

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看启动选项的完整列表
docker run –rm -p 8080:8080 pgbi / kong-dashboard start –help

# 启动Kong Dashboard
$ docker run –rm -p 8080:8080 pgbi / kong-dashboard start –kong-url http:// kong:8001

# 在自定义端口上启动Kong Dashboard
$ docker run –rm -p [port]:8080 pgbi / kong-dashboard start –kong-url http:// kong:8001

# 使用基本身份验证启动Kong Dashboard
$ docker run –rm -p 8080:8080 pgbi / kong-dashboard start \
–kong-url http:// kong:8001
–basic-auth user1 = password1 user2 = password2

安装konga

先决条件

  • 安装node.js 8.0+
  • 安装npm

CentOS7安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
##### 安装node.js 8+ ######
$ cd /usr/local
$ wget https://nodejs.org/dist/v10.14.2/node-v10.14.2-linux-x64.tar.xz
$ tar -xJvf node-v10.14.2-linux-x64.tar.xz
$ mv node-v10.14.2-linux-x64 node
$ vi /etc/profile
##### 在末尾处添加如下
export NODEJS_HOME=/usr/local/node
export PATH=$NODEJS_HOME:$PATH
##### 使环境变量生效
$ source /etc/profile
$ node –version
##### 安装bower ######
$ npm install bower -g
$ bower -v
##### 安装gulp ######
$ npm install gulp -g
$ gulp -v
##### 安装grunt ######
$
##### 安装konga ######
$ git clone https://github.com/pantsel/konga.git
$ cd konga
$ npm i

# 启动
$ npm start
$ curl http://localhost:1337

Admin API

节点信息

查询节点信息

1
$ curl http://localhost:8001
字段说明
node_id正在运行的kong节点的uuid,当kong启动时随机生成,每次kong重启时这个uuid都会变
availabel_on_serverkong节点上安装的plugins的名称
enabled_in_clusterkong节点中启用的插件,即在数据库中生成了对应存储表

查询节点状态

1
$ curl http://localhost:8001/status
字段说明
total_requests客户端请求总数
connections_active包括等待连接的活动客户端连接的当前数量
connections_accepted接受的客户端连接的总数
connections_handled处理连接的总数。一般来说,除非达到一定的资源限制,否则参数值与接受值相同
connections_reading当前Kong正在读取请求头的连接数
connections_writingNGINX将响应写入客户端的连接的当前数量
connections_waiting等待请求的空闲客户端连接的当前数量
reachable反映数据库连接状态的布尔值。注意,此标志不反映数据库本身的健康状况。

Service

添加Service

1
2
$ curl -i -X POST http://localhost:8001/services -d “name=test.service” -d “url=http://后端服务域名/api”
$ curl -i -X POST http://localhost:8001/services -d “name=test.service” -d “protocol=http” -d “host=hxonline.hxsd.cn” -d “path=/api”
字段说明
name服务名称
protocol协议:http or https 默认是 http
host后端服务域名
port后端服务端口
path后端服务子路径;没有就填 ‘/‘
retries重试次数:默认 5次
connect_timeout请求后端服务的超时时间:默认60000 ms
write_timeout写超时时间:默认60000 ms
read_timeout读超时时间:默认60000 ms
url后端服务url地址

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ curl -i -X POST \
–url http://localhost:8001/services/ \
–data ‘name=example-service’ \
–data ‘url=http://mockbin.org’
HTTP/1.1 201 Created
Date: Thu, 13 Dec 2018 07:36:57 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.14.1
Content-Length: 259

{“host”:”mockbin.org”,”created_at”:1544704617,”connect_timeout”:60000,”id”:”c7be1fbd-c8dc-42a5-9397-a494514db290″,”protocol”:”http”,”name”:”example-service”,”read_timeout”:60000,”port”:80,”path”:null,”updated_at”:1544704617,”retries”:5,”write_timeout”:60000}

查询所有Service

1
$ curl -i -X GET http://localhost:8001/services

示例:

1
2
3
4
5
6
7
8
9
10
$ curl -i -X GET http://localhost:8001/services/
HTTP/1.1 200 OK
Date: Thu, 13 Dec 2018 07:42:02 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.14.1
Content-Length: 282

{“next”:null,”data”:[{“host”:”mockbin.org”,”created_at”:1544704617,”connect_timeout”:60000,”id”:”c7be1fbd-c8dc-42a5-9397-a494514db290″,”protocol”:”http”,”name”:”example-service”,”read_timeout”:60000,”port”:80,”path”:null,”updated_at”:1544704617,”retries”:5,”write_timeout”:60000}]}

查询某个Service

1
$ curl -i -X GET http://localhost:8001/services/{服务名称 or 服务id}

示例:

1
2
3
4
5
6
7
8
9
10
$ curl -i -X GET http://localhost:8001/services/example-service
HTTP/1.1 200 OK
Date: Thu, 13 Dec 2018 08:02:24 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.14.1
Content-Length: 247

{“host”:”mockbin.org”,”created_at”:1544704617,”connect_timeout”:60000,”id”:”c7be1fbd-c8dc-42a5-9397-a494514db290″,”protocol”:”http”,”name”:”example-service”,”read_timeout”:60000,”port”:80,”updated_at”:1544704617,”retries”:5,”write_timeout”:60000}

获取某个路由下的Service

1
2
$ curl -i -X GET http://localhost:8001/routes/{路由ID}/service
$ curl -i -X GET http://localhost:8001/routes/xxxx-xxx-xxx-xx/service

更新Service

1
$ curl -i -X PUT http://localhost:8001/services/{服务名称或ID} -d “name=test.service” -d “protocol=http” -d “host=hxonline.hxsd.cn” -d “path=/api”

删除Service

1
2
$ curl -i -X DELETE http://localhost:8001/services/{服务名称或ID}
$ curl -i -X DELETE http://localhost:8001/services/test.service

Route

添加Route

1
2
3
4
$ curl -i -X POST –url http://localhost:8001/routes/ \
-d ‘protocols[]=http&protocols[]=https’ \
-d ‘paths=/test’ \
-d ‘service.id=xxx-xxxx-xxxx-xx’

示例:

1
2
3
4
5
6
7
8
9
10
11
12
$ curl -i -X POST \
–url http://localhost:8001/services/example-service/routes \
–data ‘hosts[]=example.com’
HTTP/1.1 201 Created
Date: Thu, 13 Dec 2018 08:06:10 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.14.1
Content-Length: 290

{“created_at”:1544688370,”strip_path”:true,”hosts”:[“example.com”],”preserve_host”:false,”regex_priority”:0,”updated_at”:1544688370,”paths”:null,”service”:{“id”:”c7be1fbd-c8dc-42a5-9397-a494514db290″},”methods”:null,”protocols”:[“http”,”https”],”id”:”076d68f8-47fd-47aa-af48-40e71677aa9c”}

访问接口:

1
2
3
$ curl -i -X GET \
–url http://localhost:8000/ \
–header ‘Host: example.com’

可以在/etc/hostsname中将example.com地址配置为kong所在的机器的地址:

1
10.10.192.35 example.com

然后就可以通过example.com:8000打开http://mockbin.org。

字段是否必填说明
protocols必填协议列表,http、https。设置:protocols[]=http&protocols[]=https
methods半选填
默认是二者都行
接受请求的方法:GET 或 POST ,二者都行。设置 methods[]=GET&methods[]=POST
hosts半选填与此路由匹配的域名列表。例如:example.com。用作form-encode, 设置:hosts[]= Foo.com和hosts[]= BAR.com
paths必填与此路由匹配的路径列表。
例如:/test
strip_path选填
preserve_host选填
service必填与此路由绑定的服务。
设置:service.id=

获取全部Route

1
$ curl -i -X GET http://localhost:8001/routes/

获取某个Route

1
2
# xxx-xxx-xxx 路由ID
$ curl -i -X GET http://localhost:8001/routes/xxx-xxx-xxx

获取某Service下的Route

1
$ curl -i -X GET http://localhost:8001/services/{服务名或服务ID}/routes

更新Route

可以用 PATCH 和 PUT,PATCH可以修改已存在的路由,PUT 如果路由不存在则新建一个。

1
2
3
4
# xxx-xxx-xxx 路由ID
$ curl -i -X PUT http://localhost:8001/routes/xxx-xxx-xxx \
-d ‘protocols[]=http&protocols[]=https’ \
-d ‘paths=test’ \

删除Route

1
2
# xxx-xxx-xxx 路由ID
$ curl -i -X DELETE http://localhost:8001/routes/xxx-xxx-xxx

配置upstream

1
$ curl -X POST http://localhost:8001/upstreams –data “name=helloUpstream”

配置 target

1
$ curl -X POST http://localhost:8001/upstreams/hello/targets –data “target=localhost:3000” –data “weight=100”

配置Consumer

添加Consumer

1
2
3
4
5
6
7
8
# 创建一个consumer
$ curl -X POST \
–data “username=oauthadmin” \
–data “custom_id=personapi” \
http://127.0.0.1:8001/consumers/
# 在key-auth插件中为此consumer生成key
$ curl -X POST \
http://127.0.0.1:8001/consumers/oauthadmin/key-auth

配置插件

为 hello 服务添加50次/秒的限流

1
2
3
$ curl -X POST http://localhost:8001/services/hello/plugins \
–data “name=rate-limiting” \
–data “config.second=50”

为 hello 服务添加 jwt 插件

1
2
$ curl -X POST http://localhost:8001/services/login/plugins \
–data “name=jwt”

将插件安装在路由上

1
2
3
4
5
6
$ curl -X POST http://localhost:8001/routes/{routeId}/plugins \
–data “name=rate-limiting” \
–data “config.second=50”

$ curl -X POST http://localhost:8001/routes/{routeId}/plugins \
–data “name=jwt”

配置Certificates

1
$

kong与Consul集成

您可以通过指定dns_resolver属性(在kong.conf配置文件中)指向Consul服务器(或通过设置KONG_DNS_RESOLVER=环境变量)使Kong与Consul一起使用。 通过这样做,迫使Kong使用Consul来解析upstream_url API 中的主机名地址。 参考

运维

管理kong

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看版本
$ kong version

# 启动
$ kong start -c /etc/kong/kong.conf

# 停止
$ kong stop

# 重新加载
$ kong reload

# 重启
$ kong restart

# 验证配置
$ kong check /etc/kong/kong.conf

# 健康检查
$ kong health

# 初始化数据库配置
$ kong migrations up -c /etc/kong/kong.conf

配置集群

配置健康检查

配置断路器

配置监控

插件

认证

Basic Authentication

JWT

Key Authentication

LDAP Authentication

OAuth 2.0 Authentication

OKTA

Upstream HTTP Basic Authentication

安全

Bot Detection

CORS

IP Restriction

Cleafy plugin for Kong

Kong Spec Expose

Kong Upstream JWT

Signal Sciences

Wallarm

流控

ACL

Rate Limiting

Request Termination

Response Rate Limiting

Kong Response Size Limiting

Kong Service Virtualization

Request Size Limiting

分析和监控

Datadog

Prometheus

Zipkin

Moesif API Insights

SignalFx

日志

TCP、UDP、HTTP、File、Syslog、StatsD、Loggly等

常见问题

附录

数据字典

acls

字段名类型默认值说明
iduuid
consumer_iduuid
grouptext

apis

字段名类型默认值说明
iduuid
nametext
upstream_urltext
preserve_hostbool
created_attimestamp(6)
retriesint25
https_onlybool
http_if_terminatedbool
hoststext
uristext
methodstext
strip_uribool
upstream_connect_timeoutint4
upstream_send_timeoutint4
upstream_read_timeoutint4

basicauth_credentials

字段名类型默认值说明
iduuid
consumer_iduuid
usernametext
passwordtext
created_attimestamp(6)

certificates

id | uuid | | |
cert | text | | |
key | text | | |
created_at | timestamptz | | – |

cluster_events

字段名类型默认值说明
iduuid
node_iduuid
attimestamp(6)
nbftimestamp(6)
expire_attimestamp(6)
channeltext
datatext

consumers

字段名类型默认值说明
iduuid
custom_idtext
usernametext
created_at

hmacauth_credentials

字段名类型默认值说明
iduuid
consumer_iduuid
usernametext
secrettext
created_attimestamp(6)

jwt_secrets

字段名类型默认值说明
iduuid
consumer_iduuid
keytext
secrettext
created_attimestamp(6)
algorithmtext
rsa_public_keytext

keyauth_credentials

字段名类型默认值说明
iduuid
consumer_iduuid
keytext
created_attimestamp(6)

oauth2_authorization_codes

字段名类型默认值说明
iduuid
codetext
authenticated_useridtext
scopetext
created_attimestamp(6)
credential_iduuid
api_iduuid
service_iduuid

oauth2_credentials

字段名类型默认值说明
iduuid
nametext
consumer_id
client_idtext
client_secrettext
redirect_uritext
created_attimestamp(6)

oauth2_tokens

字段名类型默认值说明
iduuid
credential_iduuid
access_tokentext
token_typetext
refresh_tokentext
expires_inint4
authenticated_useridtext
scopetext
created_attimestamp(6)
api_iduuid
service_iduuid

plugins

字段名类型默认值说明
iduuid
nametext
api_iduuid
consumer_iduuid
configjson
enabledbool
created_attimestamp(6)
route_iduuid
service_iduuid

ratelimiting_metrics

字段名类型默认值说明
iduuid
identifiertext
periodtext
period_datetimestamp(6)
valueint4
route_iduuid
service_iduuid

response_ratelimiting_metrics

字段名类型默认值说明
iduuid
identifiertext
periodtext
period_datetimestamp(6)
valueint4
route_iduuid
service_iduuid

routes

字段名类型默认值说明
iduuid
created_attimestamp(6)
updated_attimestamp(6)
protocolstext[]
methodstext[]
hoststext[]
pathstext[]
regex_priorityint8
strip_pathbool
preserve_hostbool
service_iduuid

schema_migrations

字段名类型默认值说明
iduuid
migrationsvarchar(100)[]

services

字段名类型默认值说明
iduuid
created_attimestamp(6)创建时间
updated_attimestamp(6)更新时间
nametextServiceName
retriesint8代理失败时要执行的重试次数。默认值为5。
protocoltext协议。http/https
hosttextThe host of the upstream server
portint8The upstream server port. Defaults to 80
pathtextThe path to be used in requests to the upstream server. Empty by default.
connect_timeoutint8The timeout in milliseconds for establishing a connection to the upstream server. Defaults to 60000.
write_timeoutint8The timeout in milliseconds between two successive write operations for transmitting a request to the upstream server. Defaults to 60000.
read_timeoutint8The timeout in milliseconds between two successive read operations for transmitting a request to the upstream server. Defaults to 60000.

snis

字段名类型默认值说明
iduuid
nametext
certificate_iduuid
created_attimestamp(6)

targets

字段名类型默认值说明
iduuid
targettext
weightint4
upstream_iduuid
created_attimestamp(6)

ttls

字段名类型默认值说明
primary_key_valuetext
primary_uuid_valueuuid
table_nametext
primary_key_nametext
expire_attimestamp(6)

upstreams

字段名类型默认值说明
iduuid
nametext
slotsint4
created_attimestamp(6)
healthchecksjson
hash_ontext
hash_fallbacktext
hash_on_headertext
hash_fallback_headertext
hash_on_cookietext
hash_on_cookie_pathtext

参考

开源

文档

Kong系列

文章

Jenkins那些常用插件

Jenkins插件大师

作为CI/CD的调度中心,Jenkins具有十八般武艺,目前已有1700多个插件,功能强大到似乎有点过分了。本文主要列出平时我们常用的插件。

以下这两个网站是Jenkins所有的插件及说明

Jenkins Plugins https://plugins.jenkins.io

Jinkins Plugins Wiki https://wiki.jenkins.io


Git Parameter

这是一个参数构建扩展,可以在构建的时候选择git的某一个分支来构建服务。

Docker

利用Docker容器动态创建Jenkins Slave。如果有了Kubernetes/Openshift集群,就不需要这个插件了。直接使用下面的Kubernetes插件。
jenkins非root启动的话,为了运行docker需要执行sudo chmod 777 /var/run/docker.sock

Kubernetes

这个插件可以将Jenkins Slave Node动态配置为Kubernetes集群上的pod。

Openshift

这个插件支持调度Openshift的对象,包括触发 BuildConfig、Deployment、Scale up a Deployment,给ImageStream打新的Tag,以及创建新的对象、删除已有对象等。


GitLab

配置Gitlab的相关认证,同时也支持GitLab的Webhook触发。

GitLab Hook

支持GitLab更好的触发。

Gogs WebHook

支持Gogs代码仓库的触发。


Maven

这个插件为Maven 2 / 3项目提供了高级集成功能。

Pyenv Pipeline

方便对python进行项目级别的环境隔离。
jenkins机器上需要安装python、pip、virtualenv

Python

这个插件支持在Jenkins的构建过程中执行Python脚本。

SonarQube Scanner

支持SonarQube的代码扫描。

Ansible

在构建任务中可以执行Ansible任务。

Publish Over SSH

通过SSH拷贝文件到目标机器,同时可以在目标机器上执行脚本

Publish Over SSH

事先要在设置中添加目标机器的访问方式。


Job Generator

定义一个参数化的模板,通过这个模板快速的在 Jenkins 上创建出任务。

Job Generator

Pipeline:Job

添加一个新的Job类型:Pipeline。

Pipeline:Job

Multijob

把多个Job组织起来。

Parameterized Trigger

这是一个扩展型的插件,使各个job连接的时候可以传递一些job相关的信息。

Join

这也是一个触发job的插件,亮点在于它触发job的条件是等待所有当前job的下游的job都完成才会发生。

Build Pipeline

这个插件提供一个构建流水线的视图。同时它提供了一个任务的手动触发器。

Build Pipeline

Build Monitor View

将Jenkins项目以一块看板的形式呈现。

Build Monitor View


JUnit

展示JUnit单元测试报告。

TestNG Results

导出TestNG的测试报告。

JaCoCo

生成测试覆盖率的报告。

Performance

生成性能测试报告
需要在Jenkins机器上安装Taurus(开源负载测试工具和功能测试工具自动化框架)

Performance

Html Publisher

生成报告文档。参考资料:https://www.jianshu.com/p/8fb776f83243

Email Extension

扩展了发送告警邮件的控制力度。可以定义邮件触发器、邮件内容、收件人。

Mailer

每次不稳定的构建都发送邮件通知。
单独发送邮件给对构建造成不良影响的责任人,会从SCM提交者人的信息中,拼出邮箱。

Sounds

这个插件能让Jenkins通过播放声音来发出通知。

Workspace Cleanup

每次build之前删除workspace目录下指定的文件

Workspace Cleanup


Role-based Authorization Strategy 用户角色

给Jenkins用户权限管理添加了角色组。

Matrix Authorization Strategy Plugin

为每个项目设置用户权限

Disk Usage

对Jenkins节点服务器磁盘的监控。

Disk Usage

Monitoring监控

监控Jenkins节点的CPU、系统负载、平均响应时间和内存使用。

Monitoring监控

Backup备份Jenkins

自定义备份Jenkins Home目录。

Backup备份Jenkins

ThinBackup轻量备份Jenkins

轻量备份Jenkins上的配置与Job

ThinBackup轻量备份Jenkins

SCM Sync Configuration

SCM Sync Configuration

预先要在全局配置中设置代码版本控制库的配置,每次创建或更新job配置时都会提示是否同步配置


参考文章
jenkins常用插件汇总
Jenkins插件大全