焦虑使人进步。
本科毕业设计时接触过Hadoop,Hbase,后来从事嵌入式行业,浅尝辄止。
后来炒的非常火的物联网也好,人工智能也好,云计算都是关键的技术支撑之一。
软件行业,没有“稳定的工作”这个说法,所以对这种通用的技术和框架还是要保持关注。
跟进一门技术,最好的方法是看下当前市面上的需求是哪些。
随后从一些招聘帖收集部分信息如下:
大规模高性能并发系统设计、开发、运维经验。熟悉消息队列(Kafka/RabbitMQ等)、缓存(Memcache/Redis等)、关系性数据库(Oracle/MySQL等),能够设计复杂业务、高并发、大数据量的系统;
有实时大数据处理经验,熟悉Hadoop/Map-Reduce/Storm/Spark/Flink等分布式计算框架优先考虑
spring相关框架体系,熟悉spring boot快速开发机制,熟悉spring cloud体系并且对spring源码有研究者优先;
分布式软件的设计和运行原理,熟悉ZooKeeper、Redis、Kafka、 NoSQL等相关开源软件的使用和开发。
分布式软件架构设计,如:微服务架构、分布式事务和数据一致性设计等
熟悉RestFul、微服务等软件架构风格和理论,有海量节点管理/调度系统设计、开发经验者优先;
了解虚拟化和容器技术,熟悉k8s/mesos/docker/OpenStack等系统;
了解数据中心规划、网络架构、服务器部署等基础设施架构,熟悉离线计算、实时计算、流计算模型;
精通Python/Java/Go/C其中之一,编码风格良好
结合云计算的三个层次, 再加上如上列举的各种技术点,做一个整理如下。
IaaS,PaaS,SaaS简介
IaaS层相关技术和概念
1.虚拟化
通过某种方式,隐藏底层物理硬件的过程,使得多个操作系统能透明的共享和使用这部分资源。
服务器绝大部分时间,都是处于“休眠”,只有5%的左右的时间工作,虚拟化的优点在于可以减少服务器的数量,对企业来将,其实就是开发减少不动资产,能耗,冷却和管理成本;
举例来讲就是:
a公司服务器设施必须要满足自身业务量的峰值,b公司也一样,峰值不是经常有的,并且大家的峰值可以错开,那就可以维护一套硬件设施来满足多个用户的使用,对于a,b公司来讲,本身的成本是降低的,他们再满足自身业务的同时,无需担心为那些大多数时间上闲置的资产去开销成本。
2.hypervisor(虚拟管理程序或VMM)
架构上提供虚拟化的层,具体分为两类:
a. 直接运行在物理硬件上,基于内核实现的虚拟机,比如KVM
b. 运行在一个操作系统内的,比如QMEU,WINE
具体的实现有:Xen,Oracle VM,VirtualBox,KVM,VMware ESX/ESXi等
3. 相关技术点
通过Open Stack,Open Nebula,Apache Cloudstack等软件平台,利用现有的KVM等hypervisor实现虚拟化,同时支持对计算资源,网络资源,存储资源的抽象和管理,也支持对安全相关的API接口,提供命令行等服务。
PaaS层相关技术和概念
1. 概念
摘自wiki上对PaaS的解释:
PaaS属于云计算服务的一类,它提供一种平台,使得用户可以在其上实现对应用的开发,运行和管理,同时不需要考虑复杂的构建,配置和维护相关配套的开发环境。主要分为两类:
以虚拟机为基础的,代表为AWS的Beanstalk;
以容器为基础的,代表为GAE,CloudFoundry,Heroku;
经济性上容器比虚拟机占绝对优势,性能上容器技术也会好一些;但是在安全和隔离方面,虚拟机远远好于容器。
2. 架构模式(摘自https://yq.aliyun.com/articles/68828)
-
路由模块:该模块的基本功能是将终端用户请求路由到对应的服务器实例,并提供应用动态注册等功能。目前绝大多数的实现是基于ngnix,同时也需要使用简单的lua脚本完成应用注册和路由查询等基本功能;
-
服务管理模块:该模块会为开发人员和运维人员提供管理接口,其基本功能包括创建应用实例、配置应用运行参数、启停应用、发布应用程序、扩容或缩容等。服务管理模块也需要提供相应的客户端被用户使用,如命令行或是用户界面等;
-
应用容器模块:应用容器是PaaS平台的核心,其主要功能是管理应用实例的生命周期,汇报应用的运行状态等。目前来看,应用容器可以基于虚拟机来实现(如AWS),也可以使用Linux容器技术来实现,最早使用的是LXC,CloudFoundry使用的是自己的warden,同样也是基于cgroup,现在最新的是docker;
-
应用部署模块:应用部署模块需要将应用程序打包成为可直接部署的发布包。该模块是实现PaaS平台开发性的关键。由于现有通用的PaaS平台需要支持多种编程语言和框架,如Java, Python, Ruby和PHP等,当应用发布时,PaaS平台需要根据不同的编程语言将应用打包成为通用的发布包,然后传递给容器模块部署。应用部署模块是实现这一过程的关键,目前来看起源于Heroku的buildpack已经被大家广发接受;
-
块存储模块:该模块主要用于存储应用的发布包,需要保证程序包的长久存储和。目前AWS的Beanstalk直接使用S3,CF可以使用网络文件系统NFS或是其他任何分布式文件存储系统(如HBase);
-
数据存储模块:该模块需要保存应用和服务的基本信息,可以基于任何现有的数据库技术实现,如MYSQL或是MONGODB等;
-
监控模块:该模块的作用是持续监控应用的运行状态,比如健康状态(是否存活)、资源使用率(CPU、内存、硬盘、网络等)和可用性等。这些指标会成为整个PaaS平台运维的关键,也为自动弹性伸缩奠定基础;
-
用户认证模块:该模块需要保证应用程序的安全性和隔离性,通常而言,公有云的提供商会使用OAuth等技术集成现有的用户认证服务;
-
消息总线模块:该模块也是最重要的模块,由于PaaS平台所搭建的是一个大规模分布式环境,通常而言,规模在数百台到上千台的机器数量,所有模块之间的通讯会变成一个核心的问题。所以消息总线会变成系统之间通讯的基础,通常需要支持pub/sub模式。
基于该架构,应用实例的弹性伸缩也能够非常容易的实现。首先需要监控服务来不断获取实时的应用状态,当某些指标超出预先定义的阈值时,平台会启动伸缩服务,首先从应用容器模块预留资源,然后调用应用部署模块打包应用并部署,最后将应用节点注册到路由模块完成整个伸缩的过程
3. 相关技术点
AUFS技术:
一种union file system,UnionFS主要特点是,将不同的物理位置合并mount到同一个目录中。比如将只读的CD/DVD和硬盘目录联合挂载到一个目录上,你就可以对CD/DVD上的文件进行修改,修改结果会存于硬盘上的目录中。
这篇文章中有详细的例子:https://www.open-open.com/lib/view/open1440483391763.html
Docker:
利用AUFS技术第一次将容器实例镜像化,这一突破性的创新能够让容器实例可以复制,可迁移,可重用。彻底打破了以前只有使用虚拟机才能迁移实例的局限性。
粗浅的理解,docker将常用的依赖资源,比如OS,lib,基础组件等打包作为一个整体镜像,统一配置到容器的根目录下,然后docker利用了layer的概念,形成了一种增量的rootfs,镜像的每次都会生成一个layer,再通过UnionFS联合挂载的方式,不同应用将通过各自所在容器,选择性的对各个layer进行引用,就完成了实例的复用。
SaaS层相关技术和概念
1. 概念
软件及服务,更像是一种商业模式,而非一种技术框架。
用户不断的付费,然后获得持续性的软件服务,客户端非常轻量级,无需配置,管理和维护这些软件资源;
依据“可配置,高性能,可伸缩”,可以将SaaS划分为 四级成熟度模型。
2. 相关技术点
MDA(model driven architecture):
模型驱动架构,用来实现“可配置化”常用架构。架构模型图如下:
其余技术点补充
RestFul(representational state transfer,表现层状态转化)软件架构
网站也是一种软件,是一种采用C/S模式,分布式部署,通过互联网通信交互点一种互联网软件。
符合REST原则的互联网软件,就可以叫RestFul风格的软件。
REST原则具体有以下几点:
a. 每一个URI表示一种资源
b. 客户端和服务器之间,传递资源的某种表现层
c. 客户端通过POST,GET,PUT,DELETE四种方式来操作服务端资源,实现表现状态转化
这个框架里面,核心的东西,在于界定和抽象“表现状态”,资源的不同版本,不同展现形式等都可以抽象为表现状态。
有一篇文章讲的很好,可以参考:http://www.ruanyifeng.com/blog/2011/09/restful.html
Spring MVC
一个开源的java平台,MVC即model,view,controller;用于开发灵活和松散耦合的web应用程序。
分布式消息队列
分布式系统重要组件,主要应用在解决应用耦合,实现异步消息,处理流量削峰,实现消息通讯四个场景。
目前使用较多的有Kafka,RabbitMQ,ActiveMQ,ZeroMQ等。