怎样提高编程时的arm体系架构与编程水平

从程序员进阶到架构师,最全进阶详解(下篇)-大型网站架构篇
优知学院,提供系统的互联网技术、产品进阶干货以及课程,如果您觉得对您有价值,那么请Ctrl+D 收藏!
优知学院创始人: 陈睿|mikechen ,拥有10年+产品技术经验,前携程定制旅游CTO,曾先后就职于淘宝、百度、携程,负责产品&技术团队。
从程序员到架构师进阶,将涉及到数据结构和算法,Java编程语言掌握,Javaweb核心技术,数据库,Java框架与必备工具,系统架构设计等六大环节。
这是程序员进阶到架构师系列篇的最后一篇,重点讲解大型网站系统架构设计。
面向服务的体系架构(SOA)
其实面向服务架构 SOA 思想概念的提出已不是什么新鲜事,大概在10年前就有不少相关书籍介绍过。当时 Java 企业应用领域 J2EE 依然是主流,应用程序被部署在庞大统一的符合 J2EE 规范的容器中运行,在单一进程中提供所有的功能。
早期的&SOA&通常和另外一个术语关联在一起ESB(企业服务总线)。 当时在 SOA 的实施思路上无一例外的选择了 ESB 模式来整合集成大量单一庞大的应用,以保护企业前期投入成本。因此 ESB 其实是 SOA 特定历史阶段的一种实现方式。
然而,如今谈到SOA服务架构的场景,最具有代表性的的肯定就是阿里集团下的:淘宝、支付宝等大数据、多个的业务模块,成百上千的工程师一起开发的业务的场景。
正确的SOA架构应该怎样定义?
SOA(Service-Oriented Architecture),即面向服务的架构,SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。
面向服务架构,本质上就是将之前的单体应用拆分成多个应用,每个应用之间是通过分布式服务框架或者是一些RPC的框架进行通讯交互,需要服务化提供的三大能力:
第一,是提供的物理层面对业务分解抽象的能力
第二,是解决了系统的一个水平扩展问题。
第三,是能够让一家公司具备百人以上的团队进行协作开发的能力,即提高我们的开发效能。
面向服务设计,因为涉及到分布式这一块,技术涉及非常多,主要包括像分布式服务框架、注册中心,一些序列化化、反序列化的知识以及RPC的框架,服务化之后很重要一点就是需要有服务治理,需要有负载均衡、软负载,需要有配置中心、消息中心等等。每一种技术都是一个比较深的主题,大家可以自行研究一下这方面的技术。
也可以参考阿里开源出来的Dubbo和HFS,阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,以及SOA服务治理方案。
大型网站架构设计能力
其实就是要很清楚整个技术架构的演变历程,知道每个阶段的瓶颈在哪里,以及对应的解决方案。
随着互联网技术迅速发展和演变,不断改变的商业化应用系统越来越复杂,由单一的应用架构到垂直的应用架构,但还是面临的扩容的问题。流量分散在各个系统中,虽然体积可控,但对开发人员和维护人员带来极麻烦。此时,将核心的业务单独提炼出来作为单独的系统对外提供服务。达成业务之间复用,系统也将演变成分布式系统架构。分布式架构是各组件分布在网络计算机上、组件之间仅仅通过消息传递来通信并协调行动,与上面提到的SOA服务架构一脉相承。
大型网站最终都会走向大型分布式业务场景
搭建分布系统的基础设施
分布式缓存搭建 memcached ,redis(推荐),动态、静态数据的缓存,以及配合单点登录的使用等。
为了应付复杂的网络环境和不同地区用户的访问,通过CDN和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN与反向代理的基本原理都是缓存。
持久化储存搭建
Hbase、MySQL、Redis传统的IOE方案: IBM小型机Oracle数据库 EMC持久储存成本很高。传统的数据库提供完整地acid功能,并且提供丰富的内连接外连接关联查询等功能。但是,对于高并发应用来说,有的时候会牺牲关联查询事务数据一致性(降级为最终一致性)。
Hbase有更好地伸缩能力,更适合海量数据储存。并发写入十分出色,能够支持多regionserver同时写入。但是其本身对于查询的支持力度有限,比如group by order by join等。
Redis是一个key-value类型的数据库,能够支持更高的并发量,而且支持的数据类型也比其他的key-value数据库的数据类型多。
消息系统搭建
目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。
使用场景也是非常多:异步处理,应用解耦,流量削锋和消息通讯四个场景。
还有搜索引擎系统、文件系统、日志系统、数据仓库等。
分布式文件系统和分布式数据库
一般先分库,如果分库后查询仍然慢,于是按照分库的思想开始做分表的工作数据库采用分布式数据库(所有节点的数据加起来才算是整体数据),文件系统采用分布式文件系统任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑。
分布式数据库是系统数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。
比如淘宝中期开始的数据库端按照业务垂直拆分:按照业务交易数据库、用户数据库、商品数据库、店铺数据库等进行拆分。
还有就是水平扩展,分库分表,再结合读写分离一起。当然,分库分表需要涉及到对应的SQL路由规则主库备库等,淘宝设计了一套TDDL来解决这些问题,应用端只需配置对应的规则即可,对应用端的没有任何侵入的设计。
采用sql和nosql混搭搭建
随着业务越来越复杂,对数据存储和检索的需求也越来越复杂,系统需要采用一些非关系型数据库如NoSQL和分数据库查询技术如搜索引擎。应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。
代码业务拆分
纵向拆分:
将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统、纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。
横向拆分:
将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务、横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。
还要考虑机房容灾以及系统运维监控等。
如果对大型网站分布式架构有兴趣,也可以查看官网文章,文章里有详细的介绍淘宝的整个架构演变历程和步骤。编程新手如何提高编程能力? - 知乎<strong class="NumberBoard-itemValue" title="被浏览<strong class="NumberBoard-itemValue" title="8,647分享邀请回答2.8K172 条评论分享收藏感谢收起lintcode.com/ 就是一个很不错的刷题网站,不会怎么办!看答案,了解怎么写,然后自己实现一遍。你可以先从easy难度的问题做起,每一个程序也就20-40行左右,甚至你可以一旦AC,反复提交,以增强自信心,虽然这只是一个玩笑,但是它可以让你提高你对编程的自信,对编程的喜爱,当你有自信的时候,你才能真正的把一件事情做好。当你反复解决一个又一个的问题的时候,你要告诉自己我是个天生的编程者!然后你就可以挑战更高难度的问题,当你积累到10W以上的代码量的时候,你会发现你会有一个质变。一切将变的顺手。当以前要想半天的语句,现在信手拈来。恭喜你跨出了很重要的一步。你该去找实习了。当你有了第一步作为铺垫以后,你应该去业界提高你的编程能力,这个很重。什么是编程能力,用程序去解决真正的问题,你的程序写的更让人能读懂,这是编程能力,你的程序高效可维护,这是编程能力,你的程序被review的次数很少,质量很高,这是编程能力,你能快速理解一个小项目,小模块在做什么,怎么做的,这也是编程能力。所以你应该去公司,有mentor指导你的情况下,去做一些事情,参与到团队中去。同时实习生的面试门槛比Full time会低很多,只要你把第一步做好了,好好的准备面试,拿到一个不错的实习也问题不大(实习生也更容易拿到return off)。当你实习结束以后,做一下总结,业界到底在干什么,业界使用的技术到底有哪些,他们平时的编程工具等等这些都是值得你学习的地方,你可以用你学到东西尝试着去做一些简单的project。你会发现原来毫无头绪的事情,慢慢变得清晰起来。疯狂的训练,超强的自信心,去工业界实习一下,你就会明白我要什么,我要为了我所想要的我该怎么做。-----补充-----有人问在哪里看答案,这里给大家提供一个看答案的网站,是我觉得比较高质量的答案:-----3月21日补充-----看了评论里有人说,我在学校老师那里按部就班学不到什么。我想多说几句,虽然说大学教育和社会有一些脱节,但是并不是所有都是无用的。首先谈一下为什么会脱节,没有一个大学的校长会站起来说我们设置计算机相关专业就是为社会提供码农的。大部分学校的目的都是培养计算机科学家的,只有培养残的,成为了码农。当然这就玩笑的成分,但是的确真正有用的可能20%都不到,就是因为少我们就可以否定么,有一些课是很重要的,它们奠定了你的计算机素养,那些课你不用很深入的学习,而是扩展你的广度。虽然你现在觉得无用,但是不要否定它们的价值。说说另一个问题“我需要刷题么”,如果一个有科研前途的人,我会毫不犹豫的说,停下来,搞你的科研去,不要在刷题上浪费你的时间。但是当你问这个问题的时候,我会毫不犹豫的告诉你,你不适合做科研,你在科研的道路上注定成为一个次品,何不早点做好成为码农的准备呢?刷题不是目的,刷题是一种手段,为了积累代码量, 为了找到实习,为了面试,为了走向业界,为了拿到好的offer,为了打开成为码农的大门,它是简单的,它是适合大部分人的,它适合成为码农的你。如果你还表示怀疑的话,你可以去了解一下,当今国内外各大IT互联网公司是如何面试的,我相信你会有一个明确的答案。更多程序员相关问题解答,请关注我的微信公众号:ninechapter52137 条评论分享收藏感谢收起如何设计一款优秀的软件架构
发表于 17:28|
作者黄耀华
摘要:为了给企业提供稳定可靠且优质的服务,作为一名软件架构师,在应用的架构设计上也是费尽心思,本文作者来自“风语者客服+”的CTO黄耀华,他从自己多年的实践出发,总结了软件架构设计的一些经验,分享给大家。
“风语者客服+”是针对中小型企业推出的客服SaaS,节约了企业自建客服系统所需的巨大成本。为了给企业提供稳定可靠且优质的服务,我们在整体架构上费尽心思。虽然不尽完美,希望借此抛砖引玉,互相切磋。前言”Look deep into nature,
and then you will understand everything better.“&--&Albert Einstein我国传统文化上,要做成一件事,讲究三个方面:明道,优术,取势。在软件架构设计方面而言,也是类似的道理:遵循自然规律以明确大的方向,使用优秀的实操战术,再根据实际情况落地。这是个快餐年代,几乎所有人都只做一件事 -“取势”。
几乎没有多少人会去理解一个Servlet的工作原理,去理解一次HTTP请求的完整流程,因为有超多框架帮你屏蔽了这里的细节。询问一个人会什么技术,回答也往往是我会Hibernate、Spring、Ibatis、会PullToRefresh组件、会使用SDWebimage。不过这些框架(Framework)其实并不是软件架构。软件架构是一所有生命力的房子,而这些框架只是大一点的板砖。因为笔者水平有限,这里只提一些普遍准则,也就是”正确的废话“,以飨视听。不会深入到实操战术上,比如怎么用Spring实施MVC架构,怎么使用Maven管理依赖,Redis的常用操作,怎么搭建一个负载均衡的集群,如何使用阿里巴巴的Dubbo框架进行服务化等等。如果大家有兴趣,可以自行搜索,有很多优秀的文章可供参考。不幸的“程序猿”和“程序媛”各有各的痛苦,幸福的程序员都是相似的。其实说幸福有点言过其实,下面就说说怎么让他们不那么痛苦。一. 很好的模块化支持“At the bottom of every person&#039;s dependency, there
is always pain, Discovering the pain and healing it is an essential step in
ending dependency.”&--Chris Prentiss
他们都在一个相对稳定的软件架构里编码,自己的代码不会依赖很多模块,不会因为自己微小的改动造成全局的失败。正如"1984"中的老大哥说的,Ignorance is
strength(”对外界的“无知就是一种力量). &任何一个模块都不能有太强的存在感。曾经在一个大型互联网公司里面,任何人只要用到一个核心模块的功能,就必须依赖一个部署在某远程服务器的库,而且还有IP限制,只能把代码部署到指定网段才能运行起来。导致基本上没法在本地进行单元测试或者简单调试。这个核心库的存在感太强,就成了开发的瓶颈,严重的降低了生产力和码农的幸福程度。在“风语者客服+”的架构中,每个码农都可以很方便的在本地把服务启动起来,一分钟up and running,随便做一些改动就可以立竿见影的看到效果。这里要归功于几个东西:1. Git代码管理在团队作战中,每个程序员可以取下来完整的最新代码库,也可以在本地分支上尽情挥毫泼墨,而不担心影响别人的工作。也可以把本地修改先stash起来,review一下别人的代码,再unstash恢复回来。要想提高团队效率,代码仓库管理建议尽快迁移到Git上。2. Maven、Gradle、Cocopods等依赖管理Maven是一个管理依赖(Dependency)的工具,现在在Java社区应该是比较普及的,无法想象现在还有团队直接拷贝jar包来管理依赖。虽然早期没有Maven的时候,都是拷贝jar包这么过来的,碰到的问题也是显而易见的,依赖的jar包作者改了某个bug,没能及时传导到调用方。多个调用方使用不一致的jar包,导致各种奇异bug。对应的在安卓社区,使用gradle的比较多,iOS的Objective-C开发中,多采用CocoaPods。二. 高内聚,低耦合He should focus on his knitting, not
trying to do everything. Do one thing well.-- Steve Jobs"Do one thing well"其实不算是老乔的专利,UNIX哲学和Google哲学都提倡这一点。这句话本身不完全对,比如对于一个商人,如果只会Do one
thing well,那他无法在市场中存活,但是在工程师中却是万般推崇的哲学。我们可以期望一个人具备一百种技能,然而对一个工具只期望它把一个需求解决好解决彻底,对于实现工具的一个类,一个方法,更是如此。但是,实际经验中,我们经常看到一个5000行以上代码的类,活像一个巨人版的瑞士军刀,什么都能做,但是什么都做不好。这就是”Separation of Duty"没有做好的典范。在风语者”客服+“对外提供的SDK和API中,我们也提倡同样的思想,力争把App使用”客服+“SDK的门槛降到最低,每个API都能自言其一,而且API直接没有时序上的依赖关系。内部各个模块的开发,也秉承同样的责任分割原则。责任分割原则的落实,没有什么好的框架或者工具来支持。只能通过老鸟经常去做Code Review,找出存在的问题,提出重构方案,并督促菜鸟改进。个人一般采用的重构思路,仅作为参考,照搬后被老板批评乃至造成工伤概不负责:把一个大的工具类,根据主题不同,拆分成若干个互不干扰的高内聚工具类;举个例子,一个万能的NetworkUtils可能可以拆成HttpUtils, FTPUtils,TelnetUtils等;对于一个被频繁调用的类,仔细观察调用情况,如果有一些方法的被调用频率远远低于其他方法,那么需要考虑这个方法是不是应该放在这个类中;存在A,B两个类之间的相互依赖,或者更多类的混乱依赖,那么就更要抽丝剥茧,通过合理安排类的功能来去除环形依赖;尝试一句话说清楚一个类的功能,不要使用“和”,“以及”,“或者”等连接词;如果出现了这些连接词,就需要引起重视;三. 用进化拥抱变化“It is not the strongest or the most intelligent
who will survive but those who can best manage change.”&―&前段时间,朋友圈疯传一篇文章 -——“架构腐化之谜”,大家都深表同感,纷纷表示对自己架构的未来的担忧。然而,说句不合时宜的话, 90%的担忧是杞人忧天,因为以现在产品更新换代的速度,90%的项目面市即意味着死亡,没等到架构腐朽,产品已经入土了。剩下10%里面,也许有9%会一直坚持活下去,但是不会蓬勃发展,也就是说,只要保证不出现内存泄露之类的问题,代码就会一直在几台小服务器上运行下去,哪怕后面没有人维护也没关系。只有1%的产品,会日新月异的更新迭代,最终成长为巨无霸,或者巨无霸的生态下的一个环节。这个言论看似悲观,却是对现实最好的妥协。谬用一下泰戈尔的名言:“不是槌的打击,而是水的载歌载舞,使鹅卵石臻于完美”, 不是闭门造车的架构,而是不断拥抱变化的需求,才使得架构臻于完美。假如在早期就纠结于架构的完美性,而延迟产品的交付,是非常得不偿失的。只有生存下来,才有机会。再根据市场变化,不断优化架构,从而延长软件的生命周期。那么,假如撞大运,真的成了这1%,怎样做才能算是拥抱变化?首先,请参考本文第一点和第二点。如果这两点基本功没有练好,那么谈架构的进化就和还没有通关十八罗汉的新手就想练成九阴真经是一个道理。在设计之初,初步考虑系统的Scalability(可伸缩性)下面在第四点会详细阐述。内部的各个模块尽量做到可插拔一方面是接口和实现的分离,可以随着需求的变化更换实现;另一方面,尽量把功能服务化,成为微服务,并且可以监控到服务的互相调用情况,当某个服务老化,可以逐步废弃或使用新的服务取代之。这一点上,阿里巴巴的Dubbo框架是一个不错的选择。尽量采用优秀的框架,站在巨人的肩膀上例如在Web层面,我们使用Twitter的Bootstrap前端框架来实现响应式Web编程,提高生产效率的同时减少了为解决各种设备适配问题的投入。当然,这就需要设计师配合,按照Bootstrap规范来设计页面,减少一些个性化设计。最后,考虑系统的Resilience(弹性,也叫耐受性)俗一点说,就是变成一只打不死的小强,代码中尽量提前预判可能遇到的各种情形。经常看到代码里面有一堆的if(){}判断语句,我就问作者,“你考虑过else{}吗?”一般回答都是,“这绝对只有if,不会有else的”,可如果真的遇到else怎么办?千年虫问题就是这么诞生的。可能很多新同学还不知道什么是千年虫问题,简单地说,就是当年的码农,为了省一点内存空间,只用了2位数来表达年份,比如int year = 98; 表达1998年。我猜码农当时的心态也是,“就我这代码,还能活到2000年,搞笑吧?”程序员们平时可以多扩大自己的脑洞,想想有哪些else情况自己没有处理,而且可以轻易处理的。比如服务器挂了,那么App端是不是也要跟着crash,还是给出友好一点的提示,或者更友好一点,使用本地缓存。四. 设计可扩展,但不要过度设计it&#039;s better to have infinite scalability and not need it, than to need
infinite scalability and not have it--@littleidea 网友无限的扩展能力是一种奢望,但是起码不能让扩展能力成为0。试想一下,你辛辛苦苦为老板开发了一个网站,过了一个月,网站超负荷了,老板说,“小A啊,之前2台服务器花了我5万块,预计流量马上要翻倍了,再给你5万块,帮我扛过去啊。”结果你发现,问题不是线性增加服务器就能解决的,原来的程序没有做分层(Web,Business Logic, Data Access等),导致加服务器也只能把所有层的代码全搬到新的服务器,虽然只是Business Logic的计算有压力,却要浪费老板很多服务器。更糟糕的是,因为程序里面用到了文件系统和操作系统命令,不好做负载均衡。这里有一些准则供参考:代码分层是必须的,层次明朗以后,当哪个层次的负载较重,想办法对该层次进行优化或者扩容即可;保持核心服务是无状态的,所谓无状态就是没有和请求相关的数据依赖;尽可能的选用已被验证的广泛采用的成熟基础架构;充分利用Zookeeper等集群管理工具,来对服务进行管理;风语者“客服+”中,把业务相关的代码内部组装为风语者ServiceBox,使用阿里巴巴的Dubbo服务进行注册管理。当负载增加时,可以迅速在运维层面增加服务节点,以提供更高的服务能力,从而保证客户的优质体验。
作者简介:黄耀华具有11年的计算机软件研发及大型互联网产品研发经验,曾在IBM,百度,人人网等业内顶级企业任职,特别对企业级软件,大规模数据处理,搜索引擎,移动App开发
等领域的原理和实现有着全面且深入的认识。(编辑/魏伟)
更多SaaS技术文章,请扫描下方二维码关注我们
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章如何深入提高编程水平和编程思想?
[问题点数:0分]
如何深入提高编程水平和编程思想?
[问题点数:0分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2000年3月 总版技术专家分月排行榜第三
2000年3月 VC/MFC大版内专家分月排行榜第一2000年10月 Java大版内专家分月排行榜第一
2000年3月 总版技术专家分月排行榜第一
2000年4月 总版技术专家分月排行榜第三
2000年3月 总版技术专家分月排行榜第三
2000年3月 VC/MFC大版内专家分月排行榜第一2000年10月 Java大版内专家分月排行榜第一
匿名用户不能发表回复!|如何才能真正的提高自己,成为一名出色的架构师? - 知乎<strong class="NumberBoard-itemValue" title="被浏览<strong class="NumberBoard-itemValue" title="3,380分享邀请回答1243 条评论分享收藏感谢收起31924 条评论分享收藏感谢收起

我要回帖

更多关于 java编程架构师培训 的文章

 

随机推荐