很多人会问我:我现在是个普通 Java 程序员,如何才能“更有竞争力”?
画外音:Java,是目前世界上最流行的语言。
我认为所谓竞争力,其实包括两个方面,现在的和未来的:搞得定当下的事,并且未来有不错的发展空间,所以,我的建议有下面 3 条:
1、既然选择了 Java 技术栈,Java 必须深入学习,它是现阶段互联网公司覆盖最广的研发语言,不管是 Web 应用、后端服务还是大数据等等,最常见的研发语言都是 Java,掌握 Java 核心技术体系,不管在哪里都会有立足之地。
2、尽早学习架构领域相关知识,从编程思维到架构思维的升级,这是 3 - 5 年的高级工程师将会遇到的第一个槛,早点锻炼自己的架构思维,多储备知识,才能在合适的时机升级,承担起架构设计的任务。
画外音:不想当架构师的程序员不是好开发,每个程序员心中都有一个成为架构师的梦想。永远记着,机会总是留给有准备的人。
3、持续学习,不要满足于眼前的技术高度和深度。
如果你想扎实自己的 Java 技术,锻炼自己的架构设计思维,我这里自己收集了一些 Java 资料,里面就包涵了一些 BAT 面试资料,以及一些 Spring,MyBatis,Netty 源码分析,高并发、高性能、分布式、微服务架构的原理,JVM 性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源
由于平台规则限制,需要获取资料的朋友们可以关注小编,后台私信“666”获取。
具体内容如下:
一、分布式专题
分布式计算就是通过计算机网络将计算工作分布到多台主机上,多个主机一起协同完成工作。
我试着列一下相关知识吧。
网络通讯,网络是分布式的基础,对分布式的理解建立在对网络的理解上,包括:
OSI 模型的 7 层
TCP/IP,DNS,NAT
HTTP,SPDY/HTTP2
Telnet
网络编程,是通过程序在多个主机之间通信。包括:
Socket
多线程
非阻塞 IO
网络框架
Netty
Mina
ZeroMQ
操作系统的网络部分
RPC,Socket 使用不是很方便,很多分布式应用是基于 RPC 的,包括:
同步 RPC
异步 RPC
主要的一些 RPC 协议
RMI
Rest API
Thrift
集群,分布式计算离不开集群。集群就是多台主机被当作一个系统
集群类型
高可用,如主机备机切换,冷备,热备,双活
伸缩性,如 Web 服务器集群,数据库服务器的 Sharding
并行计算,如网格,大数据
集群相关技术,包括:
高可用性,保证服务一直能够被访问,延长 MTBF,缩短 MTTR
冗余的设备
多副本,为了避免单点失效
负载均衡,如何将大量工作负载分配到多个主机上,最大化吞吐量,最小化平均响应时间,最大化资源利用率。
伸缩性(横向),能够添加计算机和设备来应对增长的计算压力
分片(Sharding),把数据分成多个数据集,由多个服务器来分别处理。
自动分片
容错性,当硬件或软件发生故障,能够继续运转
故障检测,以及故障预测
心跳包
告警
性能预警
故障转移,当出现错误,如何解决,为了高可用性和容错性
分布式一致性,在分布式环境中如何维持状态的一致性,严格一致性,还是最终一致性
集群状态协调,如 Zookeeper,etcd 等。
分布式锁,在分布式环境中如何进行加锁
选主,当 Master 宕机,如何选择出新的 Master,协议如 Raft
一致性哈希,如何将数据分布到集群中的多个主机。
分布式事务,保证在多台服务器上完成的操作符合事务的 ACID 属性。
安全,网络通常需要保证安全。
身份认证,如何验证人或机器是他们声明的身份
基于用户名 / 口令
基于数字证书
私密性,如何防止窃听和嗅探
对称加密
非对称加密
完整性,如何保证数据不被篡改
安全散列
消息认证码(MAC)
不可否认性
基于数字证书的数字签名和验签
基于密钥的散列,如 HMAC
互联网站的基本架构
页面缓存
负载均衡器,如 HAProxy,Nginx
分布式缓存,如 Memcache,Redis
消息队列,如 ActiveMQ,Kafka
分布式框架
关系型数据库(Sharding,主从同步)
NoSQL
HBase,基于 HDFS 和 Zookeeper 的 NoSQL
Cassandra,无主集群
大数据
HDFS,分布式文件系统
MapReduce,将数据处理任务拆分为多个工作,通过集群来完成。
Spark,提供分布式的数据集抽象
二、微服务专题
微服务架构分为四大模块,围绕微服务的通用模式,集合微服务必须要掌握的知识点,使微服务的开发更加方便、快捷,让微服务应用更加稳定、可用。
微框架
与微服务之间的关系
热部署实战
核心组件:Starter、Actuator、AutoConfiguration、Cli
集成 Mybaits 实现多数据源路由实战、集成 Dubbo 实战、集成 Redis 缓存实战
集成 Swagger2 构建 API 管理及测试体系
实现多环境配置动态解析
Spring Cloud
Eureka 注册中心
Ribbon 集成 REST 实现负载均衡
Fegion 声明式服务调用
Hystrix 服务熔断降级方式
Zuul 实现微服务网关
Config 分布式统一配置中心
Sleuth 调用链路跟踪
BUS 消息总线
基于 Hystrix 实现接口实现降级
集成 Spring Cloud 实现统一整合方案
Docker 虚拟化
Docker 的镜像、仓库、容器
Docker File 构建的 LNMP 环境部署个人博客 Wordpress
Docker Compose 构建 LNMP 环境部署个人博客 Wordpress
Docker 网络组成、路由互联、Openvswitch
基于 Swarm 构建 Docker 集群实战
Kubernetes 简介
微服务架构
SOA 架构和微服务架构之间的区别和联系
如何设计微服务及其设计原理
解惑 Spring Boot 流行因素及能够解决什么问题
什么事 Spring Cloud,为何要选择 Spring Cloud
基于全局分析 Spring Cloud 各个组件所解决的问题
三、并发编程专题
Java 线程
线程模型
Java 线程池
Future(各种 Future)
Fork/Join 框架
volatile
CAS(原子操作)
AQS(并发同步框架)
synchronized(同步锁)
并发队列(阻塞队列)
四、工程化专题
工欲善其事必先利其器,工具对 Java 程序员的重要性不言而喻现在有很多库、实用工具和程序任 Java 开发人员选择。下图列出的工具都是程序员必不可少的工具
五、源码分析专题
程序员每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。这种怪状,真要追究起来,怪不得程序员这个群体本身 —— 它是两个原因造成的。
我们所有的教育和培训都在强调怎么写代码,并没有教大家如何读代码
大多数工作场景都是一个萝卜一个坑,我们只需要了解一个系统的局部便能开展工作,读不相干的代码,似乎没用
我常常把写代码和写作进行类比 —— 二者有很多相通之处; 但从培养写代码和写作的过程来看,二者又有很多不同。我们的写作能力,是建立在大量基础阅读的基础上的,是除了学习语法和文法知识外,从小学开始,经年累月,通过阅读各种不同层次的名家的作品,再加上各种各样的写作训练,累积出来的; 而我们的写代码的能力,在了解和掌握了语法 / 文法之后 (学习和抄写 example 代码也算语法 / 文法学习的一部分),跳过了大量阅读名家作品的过程,直接 biu 地一下就自动养成了:学会基础的语法和试验了若干 example 后,我们就火箭般蹿到了自己写代码打怪赞经验的阶段。这样略过大量阅读代码的阶段有三个害处:
写代码的基础是不牢靠的,打怪升级的过程也是最慢的。道理很简单 —— 前辈们踩过的坑,总结的经验教训,你都不得不亲自用最慢的法子一点点试着踩一遍。
很容易养成 stackoverflow driven 的写代码习惯 —— 遇到不知如何写的代码,从网上找现成的答案,找个高票的复制粘贴改吧改吧,凑活着完成功能再说。写代码的过程中遇到问题,开启调试模式,要么设置无数断点一步步跟踪,要么到处打印信息试图为满是窟窿的代码打上补丁,导致整个写代码的过程是一部调代码的血泪史。(见我的文章:你要避免的软件开发模式)
你周围最强的那个工程师的开发水平的上限就是你的上限。
六、性能优化
性能优化,简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。性能问题永远是永恒的主题之一,而优化则更需要技巧。
对于这六大模式我也总结了一套学习资料,获取方式
由于平台规则限制,需要获取资料的朋友们可以关注小编,后台私信“资料”获取。