两年期目标
2018年3月——–2020年3月
重申两年期计划:能够成为一个项目经理,独当一面,能很好的完成架构师交代的任务,能很好的协调产品,测试,开发,前端,甚至运营,能深入的理解一个小型的业务,并且能做到很好。
两年期目标汇集及计划。
主体围绕分布式和集群以及微服务概念拓展,核心思想就是扩展性设计。服务分布式,扩展采用集群
分布式和集群概念
集群是个物理形态,分布式是个工作方式。
分布式:一个业务分拆多个子业务,部署在不同的服务器上。集群:同一个业务,部署在多个服务器上
1:分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起,实现同一业务。
分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。
举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成。
而分布式,从窄意上理解,也跟集群差不多,但是它的组织比较松散,不像集群,有一个组织性,一台服务器垮了,其它的服务器可以顶上来。
分布式的每一个节点,都完成不同的业务,一个节点垮了,那这个业务就不可访问了。
2:简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
例如:如果一个任务由 10 个子任务组成,每个子任务单独执行需 1 小时,则在一台服务器上执行该任务需 10 小时。
采用分布式方案,提供 10 台服务器,每台服务器只负责处理一个子任务,不考虑子任务间的依赖关系,执行完这个任务只需一个小时。(这种工作模式的一个典型代表就是 Hadoop 的 Map/Reduce 分布式计算模型)
而采用集群方案,同样提供 10 台服务器,每台服务器都能独立处理这个任务。假设有 10 个任务同时到达,10 个服务器将同时工作,1 小时后,10 个任务同时完成,这样,整身来看,还是 1 小时内完成一个任务!
微服务
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。那么微服务和soa的区别是什么,微服务是SOA的一种实现,微服务是去ESB的SOA,服务肯定是分布的,这是大前提,是SOA的本质理念之一。分歧在于对服务的治理,是分布还是集中。微服务的粒度更小
SpringBoot
ElasticSearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
目标知识点汇集
消息机制
注意:(分布式发布订阅消息系统) 为分布式集群系统服务的
Kafka
kafka是分布式集群消息,Kafka不仅仅是一套传统的消息总线,本质上Kafka是分布式的流数据平台,因为以下特性而著名:1,提供Pub/Sub方式的海量消息处理。2,以高容错的方式存储海量数据流。3,保证数据流的顺序。
RPC
远程调用机制,多用于分布式集群服务器间的通信。更多介绍来自知乎
通俗的介绍RPC:https://www.zhihu.com/question/25536695/answer/36197244
高速缓存机制
注意:(分布式集群系统缓存) 为分布式集群系统服务的
Redis
redis虽然也支持消息的Pub/Sub模式,但貌似更适合用于分布式集群系统的缓存,消息订阅基本交给kafka来做。
扩展性设计
注意:
(Cassandra:分布式 Key-Value 数据存储系统) 为分布式集群系统服务的
(Docker:应用容器集装箱) 为应用发布提供服务的(微服务)
Nosql方式的数据扩展
Cassandra
容器部署方式的服务扩展
Docker
1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
Kubernetes
Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
使用Kubernetes可以:
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组,并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性,如果容器失效就替换它,等等…
服务/功能为依据的划分方式
工程架构技能
设计模式
设计模式
语言学习
go语言
python语言
测试相关
单元测试
好用的存储
PostgreSQL
架构师软素质
概念图
理论知识学习
磨练自己的耐心
无论如何,不要生气,遇到问题,解决问题,积极沟通,要抗压,能承受言语压制,不能着急
领域驱动设计(DDD)
目标总结
当然总结的过程中有些概念有点儿强行靠拢的感觉,不尽然准确,只是为了串起来这些概念。不要过多思考概念。不够精细。
从架构的角度来讲(虽然现在谈这个还为时尚早),可以了解了解微服务。了解下领域驱动设计,还有就是磨练自己的耐心!
其实目标总体就是围绕扩展性展开的,而扩展性又体现在数据和服务的扩展性上,一个成熟web必须在数据和服务上都可扩展,这样才能扛住访问压力和及时进行备份以及灾难恢复。
用一个通俗的流程来解释一下,你要扩展
首先就是服务的扩展,你得分布式吧,1,从业务的角度来说:把一个业务拆分成很多小业务放到很多服务器上去执行,那么有这么多的服务器,你得通信吧,所以涉及到RPC的远程调用机制吧,不同的业务之间传递的消息需要管理吧,那么你需要kafka来统一管理消息的发布和订阅。2,从服务器的角度来讲,你一个服务器上可能有很多小业务,有的是.net的,有的是Java的,怎么隔离呢,这就需要集装箱Docker,这么多Docker,怎么管理,这时候就需要Kubernetes,Kubernetes可是个好东西,还可以做到负载均衡,当服务器访问压力大的时候,要用Redis来负责缓存。
其次数据库也需要扩展,扩展的方式就是使用NoSql,这个时候就用到Cassandra,而关系型数据库则可以用一下PostgreSQL,这个数据库可以说非常NB。
最后,很好,现在基本技术都总结完了,思想上也该有些改变,写代码可以更高效,好好学学设计模式吧。go语言和python语言也在解决某些问题上有独特的长处。搞完这一切就可以去装B了,具体怎么Show呢,你需要会画概念图,这样才能把NB的地方展现出来。