一位普通Javaer的成长之路

lazykingloveu / 2024-02-19 / 原文

前言

此文章用于记录自己作为Java开发者的成长历程
永远置顶于我的博客

为什么要做Java

其实本来是想学C#做桌面应用程序的,奈何Java的火热和易上手,加上好找工作些,所以入行了Java

当然,也不影响我现在偶尔会学学C#,做windows下的桌面应用程序

以《斗破苍穹》的斗气段位来代表计算机专业的学习的阶段,更有趣也更直观一些
这是以后端Java程序员走软件工程方向举例,毕竟计算机专业不止软件工程,也可以是做物联网,大数据方向等

  • 斗之气,大学入门课程C语言学习阶段
  • 斗者,C语言大作业能自己完成
  • 斗师,大学Java课程学习阶段
  • 大斗师,学完了Java基础,能够完成Java大作业
  • 斗灵,学习JavaWeb,数据库相关知识,学习使用Linux
  • 斗王,能够利用JavaWeb和数据库,做一个相对能看的管理端系统
  • 斗皇,学Spring全家桶,会使用SpringBoot,ORM框架(MyBatis一般都是),此时的水平已经能去找工作了
  • 斗宗,开始学习微服务,Nginx,Redis,消息中间件,搜索引擎,日志分析追踪,Jenkins流水线等相关组件,提高自己的系统性能和可用可维护性
  • 斗尊,进阶学习斗宗阶段的内容,理解源码,融会贯通
  • 半圣,开始研究架构相关,分布式数据库,超高并发,深入浅出JVM,编译原理等
  • 斗圣,一名真正的强大的架构师,什么都懂什么都会,K8s?
  • 斗帝,???

2024-02-19 目前工作三年,处于斗宗阶段

Java基础

入门级别,学完了也仅限于刚刚入门能看懂代码,自我编写的能力有限

有C语言基础的情况下,很快就能学会
从零开始重学Java 第0天

JavaWeb

Java强大的地方在于做Web服务,访问密集,计算相对较少

Java基础学习结束,能做到的系统仅仅局限于普通的命令行程序,想要做一个大众能看能用的系统,就需要JavaWeb了

熟悉又陌生的JavaWeb 第0天

Spring与ORM

虽然已经可以用JavaWeb开发网页,但仅限简单网页,如果网页数量较多,项目整体的开发和管理是很痛苦的
特别是涉及到与外部系统交互,很明显仅仅靠网页是不够的,于是有了前后端分离,前端负责页面展示交互,后端负责数据逻辑,以约定好的(JSON)数据格式交互

Spring

SpringBoot

一键启动,约定大于配置,Java框架的里程碑,Java不再需要繁杂的xml配置

ORM

数据库与Java直接交互的封装,再也不需要自己new Statement啦,框架帮你处理

日志分析追踪

假如没有日志,系统出现了问题,都无从排查,记录日志是一个好习惯
利用好切面等统一处理的方式来记录通用日志,重点代码处单独记录日志

日志记录

不想每次都去拉取log文件排查,那就异步记录到数据库里吧

日志追踪

涉及到微服务多模块调用,如何确定是同一笔请求,就需要利用TraceId在模块间传递

单体系统出现性能瓶颈

单体系统,已经用了加内存,加线程数量,仍不足以解决当前业务并发量,需要想新的办法

Nginx

单体模块性能有些不够用,我们部署2台,靠Nginx反代均衡负载
新老系统并行,利用Nginx分发请求到不同系统

搜索引擎

大文本数据的搜索,多种类型数据的聚合搜索,仍然傻傻的用 like '%xx%',数据量访问量日趋增大,数据库不堪重负
于是引入搜索引擎,方便客户端快速检索到需要的数据

微服务,Duboo或者SpringCloud

多种业务代码全部写在一个模块里总是不好的,不利于优化代码,也不利于分工协作,启动也越来越慢,一些公用代码也难以改动
我们可以把每个模块都独立出去,各自管理自己分内的事情

Redis

单模块下,缓存可以用本地Map来处理,业务加锁也只需要关注自身
微服务多模块,就不能再使用单模块方案,于是有了Redis来解决这种情况

消息中间件

单模块下,多任务可以本地使用线程池来解决
微服务多模块,注重解耦,两处代码不在一个模块里,需要通知另一处代码协作处理

Jenkins流水线

模块太多啦,每次版本发布升级都需要处理很多台服务器,容易出错
重复的操作都可以被程序替代,Jenkins为你解忧

继续深入学习架构

分布式数据库

深入浅出JVM