由于我毕业设计做基于Java的在线小说发布系统,所以前后端都有涉及。虽然以前端为主,但是后端的科普还是需要的。好久没碰后端了,对后端有些生疏了。
参考文章:Java开源项目之「自学编程之路」:学习指南+面试指南+资源分享+技术文章
参考书籍江南一点雨大佬写的《springboot+vue全栈开发实战》
参考Java团长的博客。
我打算分三个部分讲后端技术栈:历史、学习框架、学习路线。
Java后端程序员都做些什么?
原始阶段
一开始每个程序员都是全栈,前后端一起搞定。后端用jsp,前端用HTML、css、JavaScript
前后端分离阶段
但是随着大家对浏览器页面的视觉和交互的要求越来越高,开始出现reactjs框架进行前后端分离。后端的工程师只负责提供接口和数据,专注于业务逻辑的实现,前端取到数据后在浏览器中展示。前端用reactjs,后端用SSM 。
分布式阶段
但是虽然用户越来越多,单机部署的小小war包撑不住,于是分布式应运而生。原来的单个Tomcat得变成Tomcat的集群,前边弄个Web服务器做请求的负载均衡,不仅如此,还得考虑状态问题,session的一致性。
业务越来越复杂,我们不得不把某些业务放到一个机器(或集群)上,把另外一部分业务放到另外一个机器(或集群)上,虽然系统的计算能力,处理能力大大增强,但是这些系统之间的通信就变成了头疼的问题,消息队列(MQ),RPC框架(如Dubbo)应运而生,为了提高通信效率,各种序列化的工具(如Protobuf)也争先空后地问世。
单个数据库也撑不住了,那就做数据库的读写分离,如果还不行,就做分库和分表,把原有的数据库垂直地切一切,或者水平地切一切, 但不管怎么切,都会让应用程序的访问非常麻烦,因为数据要跨库做Join/排序,还需要事务,为了解决这个问题,又有各种各样“数据访问中间件”的工具和产品诞生。
为了最大程度地提高性能,缓存肯定少不了,可以在本机做缓存(如Ehcache),也可以做分布式缓存(如Redis),如何搞数据分片,数据迁移,失效转移,这又是一个超级大的主题了。
互联网用户喜欢上传图片和文件,还得搞一个分布式的文件系统(如FastDFS),要求高可用,高可靠。
数据量大了,搜索的需求就自然而然地浮出水面,你得弄一个支持全文索引的搜索引擎(如Elasticsearch ,Solr)出来。
林子大了,什么鸟都有,必须得考虑安全,数据的加密/解密,签名、证书,防止SQL注入,XSS/CSRF等各种攻击。
自动部署阶段
由于系统越来越多,还都是分布式的,每次上线,运维十分难以把这么多系统协调好。于是出现了docker,可以持续集成、自动化部署、自动化测试。开发、测试、生成环境都保持一致。系统原来只是在环境(如Ngnix, JVM,Tomcat,MySQL等)上部署代码,现在把代码和环境一并打包,运维效率大大提升。
公司自己购买服务器比较贵,维护也麻烦,又难以弹性增长,于是虚拟服务器出来了,硬盘和内存都动态扩展,云计算出现。
随着时间发展,各个公司和系统手机的数据越来越多。于是大数据出来了,通过数据分析,把用户的购买、阅读、浏览习惯推荐给他东西。不过由于这些数据实在太多了,用传统方法需要计算好几天甚至好几个月,于是用分布式的技术,讲计算分到各个计算机去,最后再把计算结果返回,Hadoop应运而生。
参考博客:互联网系统架构演进之路
原始阶段
一台服务器既处理文件又处理数据库。技术栈Linux+Apache+mysql+PHP
应用服务与数据服务分离
随着数据越来越多,应用服务器、数据库服务器、文件服务器开始各司其职。
分布式服务器与数据库
但是数据还是越来越多,于是分布式缓存服务器应运而生。
继续随着时代发展,网站访问经常出现高峰期,应用服务器成了整个网站的瓶颈。于是应用服务器集群出现。负载均衡调度服务器控制应用服务器集群。
还是随着时代发展,数据库成了瓶颈。于是数据库读写分离。出现数据访问模块mybatis。
随着用户规模越来越大,发布范围越来越广,地域网络环境差别很大,为保证用户访问体验,反向代理和CDN加深出现。
单文件服务器、单数据库服务器存不下日益增多的数据。于是分布式文件系统和分布式数据库系统出现。
随着数据库的存储需求和检索需求越来越复杂,nosql和搜索引擎出现
随着业务越来越复杂,迭代周期越来越快,业务拆借出现。
大数据技术、监控、日志分析系统
- 大数据:Hadoop、Spark
- 系统监控:Zabbix、ElasticSearch+beats+Kibana
- 集中式日志分析系统:ELK
后端技术的演变和服务器架构的演变息息相关,两者互相印证。
JavaGuide、JavaCollection;
主要介绍springboot一家。介绍的同时也给自己扫盲。
起因是看到mall项目的后端的技术栈,有些自己没接触过。所以扫一下盲。
按相关性分三部分
业务功能:容器(springboot)、系统间通信(rabbitMQ)、安全(SpringSecurity)、jwt(json web token)、接口文档(swaggerUI)、搜索(elasticsearch);
数据库:mybatis(对象关系映射)、Redis(分布式缓存)、MongoDB(NOSQL);
部署:容器(docker)、logStash(日志收集工具)、自动部署工具(Jenkins);
技术 | 说明 | 官网 |
---|---|---|
SpringBoot | 容器+MVC框架 | https://spring.io/projects/spring-boot |
SpringSecurity | 认证和授权框架 | https://spring.io/projects/spring-security |
MyBatis | ORM框架 | http://www.mybatis.org/mybatis-3/zh/index.html |
MyBatisGenerator | 数据层代码生成 | http://www.mybatis.org/generator/index.html |
PageHelper | MyBatis物理分页插件 | http://git.oschina.net/free/Mybatis_PageHelper |
Swagger-UI | 文档生产工具 | https://github.com/swagger-api/swagger-ui |
Hibernator-Validator | 验证框架 | http://hibernate.org/validator |
Elasticsearch | 搜索引擎 | https://github.com/elastic/elasticsearch |
RabbitMQ | 消息队列 | https://www.rabbitmq.com/ |
Redis | 分布式缓存 | https://redis.io/ |
MongoDB | NoSql数据库 | https://www.mongodb.com |
Docker | 应用容器引擎 | https://www.docker.com |
Druid | 数据库连接池 | https://github.com/alibaba/druid |
OSS | 对象存储 | https://github.com/aliyun/aliyun-oss-java-sdk |
MinIO | 对象存储 | https://github.com/minio/minio |
JWT | JWT登录支持 | https://github.com/jwtk/jjwt |
LogStash | 日志收集工具 | https://github.com/logstash/logstash-logback-encoder |
Lombok | 简化对象封装工具 | https://github.com/rzwitserloot/lombok |
Jenkins | 自动化部署工具 | https://github.com/jenkinsci/jenkins |
技术:SpringBoot
说明:容器+MVC框架
官网:https://spring.io/projects/spring-boot
官网介绍:通过Spring Boot,可以轻松地创建独立的,基于生产级别的基于Spring的应用程序,并且可以“运行”它们。我们对Spring平台和第三方库持固执己见的观点,因此您可以以最小的麻烦开始使用。大多数Spring Boot应用程序需要最少的Spring配置。
技术:RabbitMQ
说明:消息队列(处理各个系统之间的通信)
官网:https://www.rabbitmq.com/
官网介绍:RabbitMQ轻巧,易于在内部和云中部署。它支持多种消息传递协议。RabbitMQ可以部署在分布式和联合配置中,以满足大规模,高可用性的要求。
补充:还有RocketMQQ、Kafka也做消息队列
技术:JWT
说明:JWT登录支持
官网:https://github.com/jwtk/jjwt
官网介绍:适用于Java和Android的JSON Web令牌
技术:SpringSecurity
说明:认证和授权框架
官网:https://spring.io/projects/spring-security
官网介绍:Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。致力于为Java应用程序提供身份验证和授权。
补充:除了springsecurity,还有Oauth2、shiro也可以提高安全框架。
技术:Swagger-UI
说明:文档生产工具
官网:https://github.com/swagger-api/swagger-ui
官网介绍:Swagger UI是HTML,JavaScript和CSS的集合,这些文件在Swagger兼容的API动态生成漂亮的文档。
补充说明:前后端分离已经逐渐成为互联网项目一种标准的开发方式。但是项目开发中的沟通成本也随之升高,这部分沟通成本主要在于前端开发人员与后端开发人员对WebAPI接口的沟通,Swagger2 就可以很好地解决,它可以动态生成Api接口文档,降低沟通成本,促进项目高效开发。
补充说明:
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。
作用:
- 接口的文档在线自动生成。
- 功能测试。
Swagger是一组开源项目,其中主要要项目如下:
- Swagger-tools:提供各种与Swagger进行集成和交互的工具。例如模式检验、Swagger 1.2文档转换成Swagger 2.0文档等功能。
- Swagger-core: 用于Java/Scala的的Swagger实现。与JAX-RS(Jersey、Resteasy、CXF…)、Servlets和Play框架进行集成。
- Swagger-js: 用于JavaScript的Swagger实现。
- Swagger-node-express: Swagger模块,用于node.js的Express web应用框架。
- Swagger-ui:一个无依赖的HTML、JS和CSS集合,可以为Swagger兼容API动态生成优雅文档。
- Swagger-codegen:一个模板驱动引擎,通过分析用户Swagger资源声明以各种语言生成客户端代码。
技术:Elasticsearch
说明:搜索引擎
官网:https://github.com/elastic/elasticsearch
官网介绍:Elasticsearch是为云构建的分布式RESTful搜索引擎。开源,分布式,RESTful搜索引擎
技术:MyBatis
说明:ORM框架
官网:http://www.mybatis.org/mybatis-3/zh/index.html
官网介绍:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
技术:Redis
说明:分布式缓存
官网:https://redis.io/
官网介绍:Redis是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。
补充:Redis是key-values数据库。比SQL数据库在某些方面十分有优势。
技术:MongoDB
说明:NoSql数据库
官网:https://www.mongodb.com
官网介绍:MongoDB是为现代应用程序开发人员和云时代构建的基于文档的通用分布式数据库。
技术:LogStash
说明:日志收集工具
官网:https://github.com/logstash/logstash-logback-encoder
官网介绍:针对JSON和其他Jackson数据格式的高度可配置的通用结构化日志记录机制。输出的结构及其包含的数据是完全可配置的。
技术:Jenkins
说明:自动化部署工具
官网:https://github.com/jenkinsci/jenkins
官网介绍:Jenkins是领先的开源自动化服务器。它使用Java构建,提供了1700多个插件来支持几乎任何东西的自动化,从而使人类实际上可以将时间花在做机器无法做到的事情上。
技术:Docker
说明:应用容器引擎
官网:https://www.docker.com
官网介绍:
java学习路线图
学习Java后端。说白了就两条线,一条线是学Java,一条线是学数据库和HTTP协议;Java+HTTP=servlet=》spring=》springboot;java+mysql=JDBC=》mybatis;
第一阶段。了解Java的基础语法、面对对象思想、集合反射、泛型等概念和数据库基础。以及使用对应开发工具。
面向对象(Java)的学习笔记汇总
这段时间使用eclipse的心得
数据库的摘要学习
MySQL数据库和Navicat的简单使用
第二阶段。理解servlet,JDBC;有了这些基础就了解spring、mybatis、springmvc。并且用SSM框架开发一个网站。
对SSM的理解
第三阶段,学习springboot技术栈。(这一部分我没深入过)
一位资深程序员大牛给予Java初学者的学习路线建议
学习Java在各个阶段做的重点也是各不相同的。
第一阶段(未做过Java):多学多练;
第二阶段(工作一年内):深入Java
第三阶段(工作两年):多考虑设计模式
第四阶段(工作三年):深入理解虚拟机,看源码;
第五阶段(工作四年):选择一个定位深入,如大数据、分布式等;
最后多交流,多发表,多学习。
暂时写到这。
更新地址:GitHub
更多内容请关注:CSDN、GitHub、掘金