前言

  本博客是长篇系列博客,旨在帮助想提升自己,突破技术瓶颈,但又苦于不知道如何进行系统学习从而提升自己的童鞋.笔者假设读者具有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. Qt unsigned char *与QString之间的相互转换

    //unsiged char *转QString unsigned char  *str = "fdd" ; char *str1 = (char *)str; QString s ...

  2. LINQ之路 6:延迟执行(Deferred Execution) 笔记

    这里刚看的时候不理解. 这个特性在我们通过foreach循环创建查询时会变成一个真正的陷阱.假如我们想要去掉一个字符串里的所有元音字母,我们可能会写出如下的query: IEnumerable< ...

  3. Java 中Enum的使用与分析

    https://www.cnblogs.com/softidea/p/3760235.html https://blog.csdn.net/qq_27093465/article/details/52 ...

  4. drf中的jwt使用与手动签发效验

    jwt认证 1)session存储token,需要数据库参与,耗服务器资源.低效 2)缓存存token,需要缓存参与,高效,不易集群 3)客户端存token,服务器存签发与交易token的算法,高效, ...

  5. docker实践-安装wordpress

    很多人都有搭建wordpress的经历,可能被某些环境的配置搞得焦头乱耳的,这里使用docker,可以很轻松的进行wordpress的搭建工作. 安装 Docker sudo apt-get inst ...

  6. 我在linux的第一个C程序

    今天在虚拟机装起了linux,根据大家学习所需要,可以安装自己喜欢的版本,我这里装的是centos 7.0版本,也正是学习的开始,现在来看看简洁大气的centos界面吧:     在centos编译C ...

  7. Mongdb创建 连接过程

    在bin目录下启动后 Show dbs 显示库,库里有内容才会显示库名称 Use admin 切换库 没有的默认创建 show users显示用户信息 Show collections显示表名 db. ...

  8. hexo文章编写部分语法总结以及hexo使用

    一.hexo的使用 1.1 新建一篇文章 1 $ hexo new [layout] <title> 1.2. 生成静态文件 1 $ hexo generate 可简写为 1 $ hexo ...

  9. 不同浏览器Cookie大小

    一.浏览器允许每个域名所包含的 cookie 数:Microsoft 指出 Internet Explorer 8 增加 cookie 限制为每个域名 50 个,但 IE7 似乎也允许每个域名 50 ...

  10. 强制迁移、合区 APP太强势伤害用户同时是否违法?

    APP太强势伤害用户同时是否违法?" title="强制迁移.合区 APP太强势伤害用户同时是否违法?"> 对于经常混迹在国内各大手游的玩家来说,"合区& ...