原文首发于 github ,欢迎 star 。
Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻这片领域。
目录
框架 Spring Boot
Spring 框架已经成为 Java 服务端开发领域里的标配,无数的服务基于其开发,它整合了服务端开发所需的绝大多数组件,Spring Boot 在其基础上又做了一层轻封装并简化了依赖管理,使得它用起来更加的便捷。
Vert.xSpring 框架早已成为主流,但是我们也不能忽略了其他优秀框架的存在。
Vert.x 是在 JVM 基础上构建响应式应用的一套工具集,支持多种语言,它不仅是一套工具集,也可视作是一套框架,其中包含使用 Netty 编写的 Web 框架、gprc、redis 客户端等众多组件,囊括了大部分开发网络应用时所需用到的组件,它最重要的核心概念是使用了事件驱动的非阻塞模型,因此具备高度的可伸缩性。它使用了响应式的编程模型,这个话题在下文中会再提到。
网络 五层协议学习计算机网络时一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,即物理层、数据链路层、网络层、运输层、应用层,每一层都有其各自的术语,比如:吞吐量、子网掩码、VIP、DNS等等,这在平时工作的沟通过程中也是至关重要。要做好服务端编程,我们必须对网络的一些基本概念有一个清晰的认识,推荐阅读《计算机网络:自顶向下方法》。
推荐阅读:
五层协议
计算机网络知识总结
HTTP 协议对于服务端编程而言,在网络这个部分最重要的还是 HTTP 协议,从 TCP、DNS ,最后到浏览器响应,我们必须清楚整个过程是如何运转的,中间再加入 CDN、反向代理、流量控制等服务时,其会更加复杂,但也正因为网络的分层模型,使得我们可以在这个中间过程中对服务端的响应性能做出优化。
具体到 HTTP 协议,其承载于 TCP 协议之上,中间再加上 TSL 或 SSL,就成了 HTTPS ,协议头如何解析,响应体如何发送,搞清楚了这些,可以很容易地开发一个简单的 HTTP 服务。HTTP 协议也在不断改进,目前已经到了 2.0 版本,在传输性能上有大幅的提升。
HTTP 使用明文传输,因此很容易受到中间人攻击,可以在路由器、代理等多个层面截获传输信息,因此 HTTP 终将退出历史舞台,HTTPS 必然成为主流,但是 HTTPS 也并非绝对安全,由于证书签发机构存在安全漏洞,曾导致许多网站使用了不安全的 SSL 证书,因此很多应用会采用自定义的加密方式来加强信息传输的安全性。
TCP 拥塞控制TCP 使用多种拥塞控制策略来避免发送方至接收方之间的链路变得拥塞,其有许多具体的实现算法,具体的实现细节隐藏在操作系统的内核当中,通过使用不同的算法,可以在不同的场景下获得最佳的性能,例如 Google 设计并发布的 BBR(Bottleneck Bandwidth and Round-trip propagation time)拥塞算法,它能更有效地利用网络环境,尤其在超远距离的网络传输中能获得更大的性能提升,目前已经移植到 linux 内核4.9版本。
由于许多网络层相关的算法都隐藏在操作系统内核当中,普通计算机用户一般无需理解这些概念,但是对于服务端开发者来说,若对其有一定的了解,则能够从这一层面寻找解决方案来提升系统的吞吐量。
网络 I/O 模型常见 I/O 模型主要有 BIO(阻塞I/O),NIO(非阻塞I/O),I/O复用、事件(信号)驱动I/O、AIO(异步I/O)。以读取数据为例,传统的 BIO 里面调用 socket 的 read 方法,函数在收到数据前会一直阻塞,对于 NIO,如果有数据则返回,反之返回 0,不会发生阻塞,而 AIO 则更进一步,不光等待数据就绪是非阻塞,连数据从网卡到内存的过程也是异步的。
结合使用 NIO、AIO、I/O复用,可以解决线程瓶颈并处理海量连接,比如 nginx 使用了 AIO 模型,因此性能比 apache http server 性能更好。在 Java 领域,Netty 基于 Reactor 模式实现了一个异步事件驱动的 NIO 框架,其已经运用在互联网的许多领域,大到大数据、通信行业、游戏行业,小到 redis 客户端、Web 框架等开源组件都有其身影。
数据库 关系型数据库MySQL 是最流行的开源数据库,PostgreSQL 是最高级的开源数据库,SQL Server 是微软开发的企业级数据库,还有在大型公司用的较多的 Oracle 数据库。在服务端开发方面,MySQL 的市场占用率是最高的,但也推荐学习一下 PostgreSQL 和所谓的「企业级数据库」,毕竟 MySQL 在这些数据库面前有时确实显得功能简单、实用性不足。