从小白到架构师确实需要走很长的路,一是需要自己不断地掌握技能,一是必须有一个能够发挥自己的环境,实践是证明真理的唯一标准,的确如此,没有经历活生生的场景,不可能成为一个合格的架构师的。首先非常抱歉本片文章只能抛砖引玉,由于涉及到知识面非常多,不可能一一描述清楚请谅解(在后面的日子里只能逐个详解)。做技术的必须做好负重前行的准备,这样才能带来岁月静好的时光!
感谢技术部所有兄弟这一年来对我工作的认可和支持,因为你们使我看到团队的希望和不可战胜的勇气。
本文谈的是以java的所有项目,其他语言的兄弟请谅解!
由于时间匆忙,对于自己的处女拙作,请大家拨冗斧正,不胜感谢!
一、先说说当前常用框架以及开发流程
常用框架
谈起java web开发框架,先是SSH(Struts、Spring、Hibernate),后来升级为Struts2
到后来Struts2被spring mvc替换掉,变成了Spring + SpringMVC + Hibernate/ibatis架构,然后Hibernate配置维护需要的人力成本大而慢慢被ibatis代替,后来MyBatis出现了,从iBatis到MyBatis,MyBatis提供了更为强大的功能,同时并没有损失其易用性,相反,在很多地方都借助于JDK的泛型和注解特性进行了简化,变成为了Spring+SpringMVC+Mybatis目前很多公司比较流行的框架,但最近开始向Springboot+Mybatis架构转变,同时基于springboot的springcloud微服务框架开始成为前沿框架。
目前应该Spring+SpringMVC+Mybatis这样的框架占主流,Springboot+Mybatis架构开始兴起。所以对于初学者或有丰富经验的开发人员或架构师,在技术学习或选型上应该考虑Springboot+Mybatis。
Mas最近几年比较火,基于SOA的服务会慢慢退出历史舞台,微服务的框架有很多,其实了解主流的springboot、dubbo就可以了,springboot+dubbo目前很多公司也在用。Spring Boot让你可以通过嵌入式服务器将它提供的Java应用程序与你自己的应用程序一起使用,Spring Boot拥有你的应用程序所需的所有基础架构,springboot的优点大家可以去官网学习下,这里不在叙述。
开发流程
我们在开发测试部署上线过程,我叫他工程化概念,大多数企业目前已经使用jenkins进行持续化集成,加上自动化测试及代码扫描功能,很有部分企业处于纯手工阶段,所以第一步要实现开发部门狭隘的工程化,如下图所示,开发只关心开发,开发和测试之间有交集,测试完成后,转交给运维,那么开发的生命周期就结束了。这样的好处是通过软件工程化,使每个人各司其职,把自己分内的事情做好,达到最大的产能输出。
所以从开发到测试,测试到运维部署上线,包括采用docker技术实现虚拟机、容器自动化的创建和部署。
目前搭建基于Kubernetes+Docker的PaaS平台,实现DevOps也是相当火的,大家有时间可以研究下。
二、 Java必备知识
千里之行始于足下,java的基础务必夯实
java的基本数据类型
作用域public,private,protected,以及不写时的区别
Static Nested Class 和 Inner Class的不同
接口与抽象类的区别?
Java中的异常有哪几类?分别怎么使用?
常用的集合类有哪些?比如List如何排序?
ArrayList和LinkedList内部的实现大致是怎样的?他们之间的区别和优缺点?
内存溢出是怎么回事?请举一个例子?
==和equals的区别?
hashCode方法的作用?
NIO是什么?适用于何种场景?
HashMap实现原理,如何保证HashMap的线程安全?
JVM内存结构,为什么需要GC?
NIO模型,select/epoll的区别,多路复用的原理
Java中一个字符占多少个字节,扩展再问int, long, double占多少字节
创建一个类的实例都有哪些办法?
final/finally/finalize的区别?
Session/Cookie的区别?
String/StringBuffer/StringBuilder的区别,扩展再问他们的实现?
Servlet的生命周期?
如何用Java分配一段连续的1G的内存空间?需要注意些什么?
Java有自己的内存回收机制,但为什么还存在内存泄露的问题呢?
什么是java序列化,如何实现java序列化?(写一个实例)?
String s = new String("abc");创建了几个 String Object?
java的几种数据结构线程安全、性能差异要搞清楚,在不同的场景应该选择那种数据结构
Vector、ArrayList和LinkedList区别。
hashmap和hashtable的区别
ConurrentHashMap和Hashtable的区别
算法分析,用java来实现常见的排序算法并且能够分析出他的复杂度
排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性
冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定
简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 稳定
直接插入排序 O(n^2) O(n) O(n^2) O(1) 稳定
希尔排序 O(nlogn)~O(n^2) O(n^1.3) O(n^2) O(1) 不稳定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定
归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定
快速排序 O(nlogn) O(nlogn) O(n^2) O(logn)~O(n) 不稳定
JVM内存分配机制
JVM堆的基本结构。
JVM的垃圾算法有哪几种
CMS垃圾回收的基本流程
JVM有哪些常用启动参数
如何查看JVM的内存使用情况
Java程序是否会内存溢出,内存泄露情况发生
你常用的JVM配置和调优参数都有哪些
常用的GC策略,什么时候会触发YGC,什么时候触发FGC
java的常用指令
内存快照及分析
线程快照及分析
多线程并发问题
如何创建线程?如何保证线程安全
如何实现一个线程安全的数据结构
Volatile关键字的作用
Copy-On-Write的原理
HashMap在多线程环境下使用需要注意什么
Java程序中启动一个线程是用run还是start
什么是守护线程?有什么用
什么是死锁?如何避免
线程和进程的差别是什么
Java里面的Threadlocal是怎样实现的
ConcurrentHashMap的实现原理是
sleep和wait区别
notify和notifyAll区别
volatile关键字的作
ThreadLocal的作用与实现
两个线程如何串行执行
上下文切换是什么含义
可以运行时kill掉一个线程吗
什么是条件锁、读写锁、自旋锁、可重入锁
线程池ThreadPoolExecutor的实现原理
Lock和synchronized的区别
其他泛型、注解之类的
Java中的泛型是什么 ? 使用泛型的好处是什么
Java的泛型是如何工作的 ? 什么是类型擦除
什么是泛型中的限定通配符和非限定通配符
List extends T>和List super T>之间有什么区别
List
注解的功能
注解的属性
自定义注解怎么实现
三、 Spring必备知识
Spring的原理及常用功能的掌握(如果之前没有使用过可以在springboot基础上学习一网打尽,忘记之前繁重的xml配置),
Spring中Bean的生命周期。
Spring注解自定义
SpringMVC的原理
Spring AOP原理及常用功能
Spring事务的传播属性是怎么回事?它会影响什么?
Spring中BeanFactory和FactoryBean有什么区别?
Spring框架中IOC的原理是什么?
spring的依赖注入有哪几种方式
Spring如何实现一个切面?
Spring 如何实现数据库事务?
Spring常用接口
Spring和mybatis结合原理
spring上下文的范围
框架比较
spring
Spring最重要的特征是依赖注入。所有SpringModules不是依赖注入就是 IOC 控制反转。
当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。
SpringMVC`
提供了一种分离式的方法来开发 Web 应用。通过运用像DispatcherServelet,MoudlAndView和ViewResolver等一些简单的概念,开发 Web 应用将会变的非常简单。
SpringBoot
让你可以通过嵌入式服务器将它提供的Java应用程序与你自己的应用程序一起使用。它使用了Tomcat,因此你不必使用其他的Java EE容器。
Spring Boot的工程包括:
[SpringBoot快速入门,讲解了Springboot和dubbo的原理,有兴趣可以去看看](等你哦https://edu.csdn.net/course/detail/8358)
- Spring IO Platform:用于版本化应用程序的企业级分发。
- Spring Framework:用于事务管理、依赖注入、数据访问、消息传递和Web应用程序。
- Spring Cloud:用于分布式系统,用于构建或部署你的微服务。
- Spring Data:用于与数据访问相关的微服务,不管是映射还是归约,关系型还是非关系型。
- Spring Batch:用于高级别的批量操作。
- Spring Security:用于授权和认证支持。
- Spring REST文档:用于RESTful服务文档化。
- Spring Social:用于连接社交媒体API。
- Spring Mobile:适用于移动网络应用。
SpringBoot第三方结合
Mybatis、activemq、rabbitmq、redis、memcached、quartz等
四、分布式缓存
缓存常用框架java自身、ehcache、memcached、redis还有很多数据库、操作系统自己的缓存,Spring缓存、mybatis缓存等等
缓存的优点
提高系统的性能,尽量减少IO的操作(网络io、硬盘io等),特别是磁盘IO的操作,提高大数据量的读取速度。
缓存的缺点
是不支持事务,存储对象必须进行序列化操作,不支持关系型数据库那样的sql查询。
缓存选型务必要懂得各缓存的优缺点,根据不同的业务场景选择不同的框架
这里简单说下redis和memcached原理及使用
redis
Redis是一个开源的key—value型数据库,支持string、list、set、zset和hash类型数据。对这些数据的操作都是原子性的,redus为了保证效率会定期持久化数据。
掌握知识点
redis的常用指令
redis的端口
redis的数据库
redis的集群有哪些中,优缺点是什么
redis节点追加对数据的影响
redis的订阅机制
redis的性能测试工具
redis的持久化方式,有那两种优缺点
memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
掌握知识点
memcached的分布式算法原理
memcahced的性能分析
memcached的分配策略
memcached的常用命令
memcached的分布式集群
基于缓存的扩展
Spring整合分布式缓存
五、 消息中间件
消息中间件的好处是异步处理提高主流程的响应速度,把耗时处理数据放入队列,多个消费者同时处理,而主流程无需等待处理结果。系统间解耦,提高系统的稳定性,从而消除系统的峰值,还有跨系统间数据访问处理。
使用消息中间件首先jms的概念要清楚
Jms规范
JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。
消息类型
点对点、发布订阅
角色
消费者、生产者
开发常用的属性
ConnectionFactory
创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。
Destination
Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。
所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination。
Connection
Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。
Session
Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。
消息的生产者
消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。
消息消费者
消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。
MessageListener
消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。
消息中间件知识,需要掌握
高可用集群方案怎么实现
消息持久化策略是什么
消息的重发机制
消息事务原理
死信队列处理
消息消费的属性有哪些
消息延迟消费机制
消息中间件之间差异
Activemq、rabbitmq、tibco、javaq等
六、 定时任务
各种定时任务的原理及实战比较,从单节点的分布式集群分片执行,下面罗列下知识点,在这里不再详细讲解
基于crontable的定时任务
基于java的timer的定时任务
基于quartz的定时任务
基于Saturn的分布式定时任务
基于spring的定时任务
基于Elastic-Job分布式定时任务
基于zookeeper的分布式定时任务
基于消息队列的分布式定时任务
基于springquartz的分布式定时任务
Cron表达式要掌握
线程池参数及其用途
Spring整合
Spring quartz整合
七、 数据库
关系型
掌握ACID特性
掌握CRUD操作,SQL基础打牢
慢查询的sql要会分析优化
根据执行计划sql调优,一定要使用索引查询
数据建模技能,根据情况可以存在冗余
分库分表(垂直拆分、水平拆分)
读写分离
主从方案
集群方案
常用数据库:mysql、oracle、sqlserver
Nosql数据库
常用的有HBase、Redis、MongoDB、Couchbase、LevelDB,掌握他们的特点以及使用场景
理解ACID与BASE的区别(ACID是关系型数据库强一致性的四个要求,而BASE是NoSQL数据库通常对可用性及一致性的弱要求原则)
理解持久化与非持久化的区别。这么说是因为有的NoSQL系统是纯内存存储的。
关系型数据库与NoSQL系统在数据结构上的本质区别。传统关系型数据库通常是基于行的表格型存储,而NoSQL系统包括了列式存储(Cassandra)、key/value存储(Memcached)、文档型存储(CouchDB)以及图结构存储(Neo4j)
与传统关系数据库有统一的SQL语言操作接口不同,NoSQL系统通常有自己特有的API接口。
在架构上,你必须搞清楚,NoSQL系统是被设计用于成百上千台机器的集群中的,而非共享型数据库系统的架构。
在NoSQL系统中,可能你得习惯一下不知道你的数据具体存在何处的情况。
在NoSQL系统中,你最好习惯它的弱一致性。”eventually consistent”(最终一致性)正是BASE原则中的重要一项。比如在Twitter,你在Followers列表中经常会感受到数据的延迟。
在NoSQL系统中,你要理解,很多时候数据并不总是可用的。
你得理解,有的方案是拥有分区容忍性的,有的方案不一定有。
高可用集群方案
八、 系统监控
监控的目的是事中、事后发现问题,根据历史数据事前进行预防,避免重大的事故发生。主要分三部分数据采集、数据清洗、数据监控。
数据采集
数据采集应该从三个方面,一个是系统级别的,采集cpu、内存、硬盘io、网络io、容器io等,可以利用第三方插件来实现。一是日志级别的,可以采用离线抓取日志文件,采用logstash抓取日志搭建ELK日志分析平台,也可以购买splunk日志抓取并数据分析,也可以自己编写agent来根据日志规则抓取日志,达到妙计监控的效果。一是基于业务数据的分析,属于事后的数据分析,主要是一些环比、同比的分析,提供运营的决策。
当然还有第三方全套的服务,如听云、神策、growingio,基于用户行为分析。
数据清洗
把脏数据清洗掉,提高数据质量并能准确的反映到图表上,一般步骤是数据分析、定义清洗规则、执行数据清洗规则、清洗结果验证。如果利用第三方产品一般都带有清洗功能,开源的框架 spark,hadoop,hive等数据清洗。
如果数据本身都是按照标准规则抓去的,那么清洗的处理会少些,甚至不需要清洗直接可以输出使用。
数据监控
数据清洗以后那就是展示,可以利用开源框架进行开发自己的监控平台,监控可以分为前端展示和后台任务的形式,如前端echarts,第三方帆软报表finereport也可以提供数据的输出,后端的主要是报警的一些任务,如某个数值达到一定阈值进行短信、邮件以及电话的通知,也可以自己设计app来进行消息推送。
九、 性能测试
性能测试工具有很多,我觉得比较流行的有两款,
一是LoadRunner(收费),一是JMeter(免费)
LoadRunner,是hp的一种预测系统行为和性能的负载测试工具
JMeter是Apache JMeter是Apache组织开发的基于Java的压力测试工具
性能指标
1、响应时间
响应时间指的是“系统响应时间”,定义为应用系统从发出请求开始到客户端接收到响应所消耗的时间。把它作为用户视角的软件性能的主要体现。它包括网络上的传输时间,web服务器上处理时间,APP服务器上处理时间,DB服务器上处理时间,但不包括浏览器上的内容显示时间,即“呈现时间”,这是因为呈现时间在很大程度上取决于客户端的表现。
2、最大并发用户数
有两种理解方式,一种是从业务的角度来模拟真实的用户访问,体现的是业务并发用户数,指在同一时间段内访问系统的用户数量。另一种是从服务器端承受的压力来考虑,这里的“并发用户数”指的是同时向服务器端发出请求的客户数,该概念一般结合并发测试(Concurrency Testing)使用,体现的是服务端承受的最大并发访问数。
3、吞吐量
吞吐量是指“单位时间内系统处理的客户请求的数量”,直接体现软件系统的性能承载能力。一般来说,吞吐量用请求数/秒或是页面数/秒来衡量,从业务的角度,吞吐量也可以用访问人数/天或是处理的业务数/小时等单位来衡量。当然,从网络的角度来说,也可以用字节数/天来考察网络流量。对于交互式应用来说,吞吐量指标反映的是服务器承受的压力。
4、性能计数器
性能计数器(Counter)是描述服务器或操作系统性能的一些数据指标。例如,对Windows 系统来说,使用内存数(Memory In Usage),进程时间(Total Process Time)等都是常见的计数器。
5、思考时间
思考时间(Think Time),也被称为“休眠时间”,从业务的角度来说,这个时间指的是用户在进行操作时,每个请求之间的间隔时间。从自动化测试实现的角度来说,要真实地模拟用户操作,就必须在测试脚本中让各个操作之间等待一段时间,体现在脚本中,具体而言,就是在操作之间放置一个Think 的函数,使得脚本在执行两个操作之间等待一段时间。
6、TPS
TPS:Transaction per second,每秒钟系统能够处理的交易或者事务的数量。它是衡量系统处理能力的重要指标。
7、HPS
点击率:HPS,每秒钟用户向WEB服务器提交的HTTP请求数。这个指标是WEB应用特有的一个指标,WEB应用是"请求—响应"模式,用户发出一次申请,服务器就要处理一次,所以点击是WEB应用能够处理的交易的最小单位。
十、 自动化运维
我觉得自动化运维能够提高代码质量、缩短开发周期,提高生产力降低人力成本,作为开发人员要时刻想着怎样去优化自己当前的工作流程,减少出错率,提高效率是工作中创新重点之一
自动化运维大致包含代码管理、版本控制、持续集成、自动化测试、自动化资源收放,容器、系统、应用监控等多维一体的系统,大家在学习中可以逐步研究这些所设计的工具以及扩展型功能的开发,如github的hook机制,jenkins和三方结合代码规范、单体测试、部署脚本等,docker容器的管理,Kubernetes实战,系统监控软件zabbix等。
Devops与持续集成
DevOps 是一个完整的面向IT运维的工作流,以 IT 自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节。
DevOps 是持续集成思想的延伸,持续集成/部署是 DevOps 的技术核心,在没有自动化测试、持续集成/部署之下,DevOps就是空中楼阁。
DevOps 的技术栈与工具链
版本控制&协作开发:GitHub、GitLab、BitBucket、SubVersion、Coding、Bazaar
自动化构建和测试:Apache Ant、Maven 、Selenium、PyUnit、QUnit、JMeter、Gradle、PHPUnit
持续集成&交付:Jenkins、Capistrano、BuildBot、Fabric、Tinderbox、Travis CI、flow.ci Continuum、LuntBuild、CruiseControl、Integrity、Gump、Go
容器平台: Docker、Rocket、Ubuntu(LXC)、第三方厂商如(AWS/阿里云)
配置管理:Chef、Puppet、CFengine、Bash、Rudder、Powershell、RunDeck、Saltstack、Ansible
微服务平台:OpenShift、Cloud Foundry、Kubernetes、Mesosphere
服务开通:Puppet、Docker Swarm、Vagrant、Powershell、OpenStack Heat
日志管理:Logstash、CollectD、StatsD
监控,警告&分析:Nagios、Ganglia、Sensu、zabbix、ICINGA、Graphite、Kibana
十一、 架构的思想及方法
怎样架构,关键点在于自己解决问题的思路和方法,采用什么语言,考虑研发、维护的成本,考虑完成的失效以及对业务影响的范围。能力+别人的感受才能作出合适的架构,架构不分好坏,适合很重要!
业务架构
需要有着对业务很深的了解,从业务的角度怎样去拆分业务模块,先总后分,分而治之,理想的化就像一块蛋糕一样,先整体分几块大的,然后在某块细细拆分,这种场景适合新开发产品,如果是目前运行的系统,那就先从周边慢慢重构改造,抽丝剥茧,甚至存在新老系统并行情况,最终完成整个系统的重构。
技术架构
技术架构相对业务比较容易,他局限于技术部门的改造,对于业务部门应该是透明的,无感知的。主要涉及服务化改造,缓存、消息、定时任务的封装,扩展spring功能,日志监控、读写分离、分库分表等技术方面的任务。
不管业务架构还是业务架构,重构的产品务必经过多次的场景演练及性能测试,达到要求后逐步并行的上线,一定以稳定安全可靠为主。
在通往大神级的架构师的道路上,你需要懂需求、设计、代码、部署、架构、服务器、运维、调优等,在技术方面你要懂前端、后端、数据库、运维、测试、性能调优,解决问题的敏感度,还有新技术的前瞻性,可以说是一个实实在在的全栈人才,不过知识面那么多,也可以有所专攻,如jvm调优、安全方面、通讯方面、容器方面、中间件方面、微服务方面、大数据方面等等,只要做的深了那你就是专家,加油兄弟们!