前言

  本博客是长篇系列博客,旨在帮助想提升自己,突破技术瓶颈,但又苦于不知道如何进行系统学习从而提升自己的童鞋.笔者假设读者具有3-5年开发经验,java基础扎实,想突破自己的技术瓶颈,成为一位优秀的架构师,所谓java基础扎实,比如:
  1.java语言三大特性.
  2.java语言八大基本类型及其表示范围.
  3.为什么float和double存在精度丢失?
  4.publish/private/default/protected表示的范围?
  5.static/final的用法及含义.
  一位Java基础扎实的童鞋,以上问题应该都能答上来,并且能知其然知其所以然,从底层原理明白为什么是这样的,在具备这些基础后,才能进阶突破自己,成为更优秀的工程师.

  当然,本系列文章为笔者原创,许多观点都是笔者自己的观点,假如有不正确或者想和笔者讨论的,欢迎至极,毕竟每个人都会犯错,大家一起进步岂不妙哉!

如何成为一名架构师?

  笔者认为,想成为一名架构师,首先第一点必然是你的技术足够优秀,知识的深度和广度足够,遇到问题能很快从脑海中寻找出最合适的解决之道.其次,架构师会从整体上领导项目,与人打交道必不可少,因此与人沟通这些软技能也必不可少,当然,这个因人而异,有些人天生更会与人打交道,但无论如何,技术足够优秀是基本条件.当然,想成为一名优秀的架构师,实际开发经验是必不可少的,没有多年架构师的经验也不行,但至少,我们想成为一名架构师,理论知识得先掌握不是吗?否则谈何实践呢?因此,我总结了一张JAVA架构师进阶学习图谱:

  当然还有许多技术和技能也是需要的,比如:架构师要进行文档输出,会需要画相关的图,常见的比如:流程图/用例图/时序图/泳道图/状态图/协作图等等(回忆一下这些课程在大学的时候是不是老师都讲过?只是我们当时不在意罢了,至少笔者是这样的,哈哈~).再比如java反射机制及其相关API,高性能NIO---Netty框架等等.如果是大数据相关还需要我们了解flink/blink/spark/hadoop/hbase,不一定全都要会,但是至少脑子里面要有个概念,这个技术是干嘛用的,以至于别人说的时候能听得懂.至于为什么没有画在上面的图中,是因为笔者后续的文章只准备写图中的内容,其余的留给童鞋们自己去学习吧.当然,因为博客篇幅所限,每种技术不可能百分百把所有知识点都讲到,但是保证讲的全部都是干货,能让读完的童鞋有所收获!

架构师应该关注什么?

  这个问题,换句话说,是我们在进行架构设计的时候应该关注什么,笔者认为从大的层面来讲分两类,功能性需求以及非功能性需求,细分的话有以下六个方面:

1.功能

  记得我的老师曾说过,功能是0,其余的是1,再牛逼的架构师,如果不满足功能,再牛逼的设计也是没用的,只有在满足功能的前提下,其他的设计才有用.

2.性能

  对现代系统来说,响应时间越短就越可能留住用户,毕竟谁会忍受打开一个页面要等待10秒甚至几分钟呢?至少笔者在访问任何网站的时候,一个网页加载5秒以上就直接关了.常用的性能指标有QPS(每秒查询速率)/TPS(每秒事务处理率).当然,性能需要在系统开发完成后进行预发环境(和生产环境一样的环境)测试,常用的性能测试工具有apachebench(简称ab)/http_load/jmeter等等.QPS也遵循28原则,一天中80%的访问量集中在20%的时间内,可以据此估算网站的QPS,从而规划服务器配置,如果性能不达标,则需要优化,常见的优化手段有加机器(简单粗暴),前端优化(CDN/动静分离/减少请求次数/),后端代码优化,缓存(如redis),JVM优化.

3.可用性

  可用性是对现代分布式系统来说,当其子系统有一个或几个节点宕机的时候,是否还能继续提供正常的服务.常用的手段是集群以及自动故障转移,几乎所有分布式系统中使用的技术都支持高可用,比如缓存redis官方提供redis-cluster集群,MongoDB分片集群,消息中间件(ActiveMQ/RabbitMQ/kafka/RocketMQ)集群,数据库MySQL集群等等,如果对以上全部都了解的童鞋,总结一下,会发现它们的核心思想都一样,通过集群提供数据冗余,再通过自动发现并且故障转移机制保证组件的高可用.

4.伸缩性

  伸缩性是指当系统容量不够或者多余的时候,是否能方便的进行扩容/缩容处理,很多大公司这方面都做的很好,比较好的策略是容器化,使用docker+k8s进行部署管理,可以方便的进行扩容或者缩容处理,能更好的合理利用资源.

5.扩展性

  扩展性是指当有需求发生变更或者新增的时候,是否能在不改代码或者改动很少代码的情况下就能实现功能.扩展性相当考验一个架构师的功力,笔者看来,想设计一个扩展性很好的系统,除了事先考虑,在合适的情景下使用设计模式也是相当好的方案,因此对架构师而言,设计模式很重要!举个例子,有一个上传服务,使用FTP协议进行上传,我们基于apach ftpClient封装了一套接口,此时另外有一个需求,是需要使用SFTP协议,我们又使用jsch封装了另一套接口,那假如后续又有新的协议呢?每新增一个协议就需要我们新增代码来适配,这个时候使用适配器模式是不是就能很好的解决问题呢?这也符合设计模式的思想,面向接口编程,以后新增一个协议,我们只需要新增一个实现类,而不会改动原有代码,是不是在代码改动最少的情况下满足了需求呢?

6.安全性

  一个网站,如果是用户访问量很大的情况下,很容易遭到网络黑客的攻击,常见的攻击手段包括:

6.1 XSS攻击

  常见的防御手段是消毒(不信任用户输入,对输入进行严格校验和过滤,比如使用"&lt"代替"<"等等).

6.2 SQL注入攻击

  以前我们使用JDBC的时候,使用Statement会导致SQL注入攻击,因此后面有了PreparedStatement预编译的方式来防止SQL注入攻击,并且大量查询的情况下PreparedStatement 效率更高.

6.3 CSRF攻击

  跨站请求伪造,攻击者盗用受害者cookie,以受害者的名义发送恶意请求,常见的防御方式有:表单提交验证码(用户体验相对不友好),URL带token验证,HTTP referer验证等.

6.4 DDOS攻击

  分布式拒绝服务攻击,DOS攻击的进阶版,防御难度很高,并且方案也相对复杂,业界比较厉害的是阿里,多次双11大促都抗住了,毕竟阿里有道哥(吴翰清,阿里最年轻的P8,神一样的存在)及其领导的安全小组的存在.

  当然,还有其他的攻击方式,这里笔者就不一一列出来了,有兴趣的童鞋可以自行了解.下一篇文章,我们正式开始进阶内容---JVM篇,敬请期待!

  如果觉得博主写的不错,欢迎关注博主微信公众号,博主会不定期分享技术干货!

本文由博客一文多发平台 OpenWrite 发布!

【JAVA进阶架构师指南】之一:如何进行架构设计的更多相关文章

  1. 【JAVA进阶架构师指南】之四:垃圾回收GC

    前言   在[JAVA进阶架构师指南]系列二和三中,我们了解了JVM的内存模型以及类加载机制,其中在内存模型中,我们说到,从线程角度来说,JVM分为线程私有的区域(虚拟机栈/本地方法栈/程序计数器)和 ...

  2. 看阿里P9架构师如何向你定义架构及架构师

    架构的定义 先来看看软件架构的普遍定义吧. 一个程序和计算系统软件体系结构是指系统的一个或多个结构.结构中包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 体系结构并非可运行软件.确切的说, ...

  3. 【JAVA进阶架构师指南】之二:JVM篇

    前言   谈到JAVA,就不得不提JVM---JAVA程序员绕不开的话题.也许有童鞋会说,我不懂JVM,但是我一样可以写出JAVA代码,我相信说这种话的童鞋,往往是只有1-3年的初级开发人员,对JAV ...

  4. 【JAVA进阶架构师指南】之五:JVM性能调优

    前言   首先给大家说声对不起,最近属实太忙了,白天上班,晚上加班,回家还要收拾家里,基本每天做完所有事儿都是凌晨一两点了,没有精力再搞其他的了.   好了,进入正题,让我们来聊聊JVM篇最后一个章节 ...

  5. WEB架构师成长之路之三-架构师都要懂哪些知识

    Web架构师究竟都要学些什么?具备哪些能力呢?先网上查查架构师的大概的定义,参见架构师修炼之道这篇文章,写的还不错,再查查公司招聘Web架构师的要求. 总结起来大概有下面几点技能要求: 一. 架构师有 ...

  6. Srinath总结 架构师们遵循的 30 条设计原则

    作者:Srinath 翻译:贺卓凡,来源:公众号 ImportSource Srinath 通过不懈的努力最终总结出了 30 条架构原则,他主张架构师的角色应该由开发团队本身去扮演,而不是专门有个架构 ...

  7. 厉害了,Apache架构师们遵循的 30 条设计原则

    作者:Srinath 翻译:贺卓凡,来源:公众号ImportSource Srinath通过不懈的努力最终总结出了30条架构原则,他主张架构师的角色应该由开发团队本身去扮演,而不是专门有个架构师团队或 ...

  8. 【架构师之路】APP架构师必看:面对爆发流量如何进行架构调整

    一.APP架构与WEB架构的最大不同 移动APP的架构和传统PC的WEB架构有三点不同: 1.连接的稳定性.在传统的web端连接成功后就可以认为它是稳定的,但在移动端.无线端,APP连接非常敏感,可能 ...

  9. 【转】Apache的架构师们遵循的30条设计原则

    本文作者叫Srinath,是一位科学家,软件架构师,也是一名在分布式系统上工作的程序员. 他是Apache Axis2项目的联合创始人,也是Apache Software基金会的成员. 他是WSO2流 ...

随机推荐

  1. ZOJ-1183-Scheduling Lectures

    可以用贪心求最小讲课次数,贪心策略也很好想,就是对于任意主题,能早讲就早讲.这种方案的讲课次数一定是最少的,但是不满意指标不一定是最小,然后再利用动态规划求在最少讲课次数前提下的最小不满意指标. 方法 ...

  2. JS做深度学习3——数据结构

    最近在上海上班了,很久没有写博客了,闲下来继续关注和研究Tensorflow.js 关于深度学习的文章我也已经写了不少,部分早期作品可能包含了不少错误的认识,在后面的博文中会改进或重新审视. 今天聊聊 ...

  3. 吴裕雄--天生自然KITTEN编程:切换角色

  4. 变身六次失去核心的小米Note还能火吗

    奥特曼变身有时间限制,因此我们总是希望它多变几次身,从而把小怪兽打得嗷嗷叫.但对于科技产品来说,不断推出"变身版",似乎总有江河日下.大势已去之感.三星形形色色的复仇者联盟S6版, ...

  5. 阿里投资Magic Leap 是美酒还是毒药?

    Leap 是美酒还是毒药?" title="阿里投资Magic Leap 是美酒还是毒药?"> 土豪阿里又摊上"大事"了!但这次不是让人头痛的假 ...

  6. 关于运算符的那些坑—自增x++&&++y

    题目 比较常见的问题,因为比较细,看书的时候一不注意可能就过去啦,但是遇到的时候就会容易出问题.先看下面程序,考虑一下运行结果是什么呢? int x = 1, y = 1; if(x++ == 2 & ...

  7. -scp Linux之间复制文件和目录

    scp 简介 scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速 ...

  8. 1,Hadoop知识储备

    Hadoop初学思维导图 1,Hadoop ··· Hadoop:     Hadoop的核心由HDFS和MapReduce组成.HDFS是分布式文件系统,是Hadoop生态圈的分布式数据存储基石:M ...

  9. 使用 GitHub 开源项目申请 IntelliJ License

    一.写在前面 这次要介绍的是通过使用 GitHub 上的开源项目来申请 IntelliJ Pycharm 的正版 License,只需在 GitHub 上准备一个维护超过3个月的开源项目,就能免费使用 ...

  10. mp4相比m3u8第一帧加载较慢的原因?

    mp4相比m3u8第一帧加载较慢的原因? 工作室正在做的软件,是一个以长视频播放为主的Android与IOS 手机软件. 最近半年,老板要求对视频的 秒开率(1秒内成功加载的播放数 / 播放总数).失 ...