一个项目征服Java
文章平均质量分 89
纵横千里,捭阖四方
弱小,是最大的罪过;没有行动,梦想终究是想一想
展开
-
【SpringBoot5】SpringBoot如何找到我们写的类的
Spring在刚刚发布的时候,管理Bean主要使用xml,在1.2.0版本仅仅支持@Transaction等少量几个注解。到了2006年,Spring2发布,其中的Spring2.5是一个重要的分水岭,此时Spring引入了多个非常重要,至今仍然大量使用的注解:1.依赖注入注解 @Autowired2.依赖查找注解 @Qualifier3.组件声明注解:@Service或者@Component。原创 2024-02-19 00:00:08 · 1106 阅读 · 0 评论 -
【SpringBoot4】如何理解SpringBoot的约定大于配置
今天我们来谈谈SpringBoot到底给我们带来了什么以及如何做的。原创 2024-02-18 09:50:29 · 1129 阅读 · 0 评论 -
【SpringBoot3】从重构HelloWorld看Spring的作用
在我们学习一门新技术的时候,总是先运行出一个基本的程序来输出“Hello World”,如果成功了, 说明我们的开发环境基本就绪了,我们也像婴儿走路一样,能走第一步了。接下来我们就逐步改造一个最基本的HelloWorld来一步步分析Spring到底帮助我们做 了什么。原创 2024-02-17 12:34:10 · 1090 阅读 · 0 评论 -
【SpringBoot1】Spring Boot是如何推断你的工程类型的
这里的isPresent()做什么的我们后面再细看,这里通过名字也能推测出来,大致是要判断是否存在的意思,第一个if部分就是判断是否为响应式REACTIVE类型,后面的for循环就是判断是否存在。学过JVM虚拟机原理的同学应该知道,字节码是保存在元空间的,所以这里SpringBoot在启动的时候是去元空间里查,看看我们有没有将Servlet的类信息加载进来。从定义上也能看到,第一种是None类型,表示不是网络服务的类型,如果我们的服务不是web服务可以这么设置,但是这个应用场景极少。那具体到哪里查的呢?原创 2024-02-03 18:04:36 · 672 阅读 · 0 评论 -
20240203周报—Tomcat暂时收尾,SpringBoot开始
最近几天主要是将Tomcat与Servlet相关的问题做了一个梳理,写了十来篇文章,今天又是周末,所以就写一个周报吧。原创 2024-02-03 11:34:07 · 677 阅读 · 0 评论 -
【Tomcat与网络11】如何自己实现一个简单的HTTP服务器
HTTP启动之后要持续监听,所以我们可以使用NioServer中的Handler就可以了,在修改后的HttpHandler中首先获取到请求报文并打印出报文的头部,包括协议的首行、请求方法的类型、Url和Http版本等,之后将接收到的请求消息(也就是报文信息)封装在一起,最后将这些信息打包成一个报文发送给客户端。这段代码看似简单,其实包含的逻辑并不少,我们可以看到这里是从key获得Socket通信使用了哪个通道(对于HTTP的就是不同端口号),这个key是哪里的呢?这相当于老板让你干活的时候,给你的锤子。原创 2024-02-01 12:22:22 · 829 阅读 · 0 评论 -
【Tomcat与网络10】Tomcat I/O和线程池的并发调优
前面我们看了提高Tomcat启动速度的措施,这里我们看一下如何提高Tomcat的性能。Tomcat 的调优涉及 I/O 模型和线程池调优、JVM 内存调优以及网络优化等,今天我们来聊聊 I/O 模型和线程池调优,由于 Web 应用程序跑在 Tomcat 的工作线程中,因此 Web 应用对请求的处理时间也直接影响 Tomcat 整体的性能,而 Tomcat 和 Web 应用在运行过程中所用到的资源都来自于操作系统,因此调优需要将服务端看作是一个整体来考虑。原创 2024-01-31 23:54:00 · 1294 阅读 · 0 评论 -
【Tomcat与网络9】提高Tomcat启动速度的八大措施
本文我们来看一下如何对Tomcat进行调优,我们对于Tomcat的调优主要集中在三个方面:提高启动速度、提高系统稳定性和提高并发能力,后两者很多时候是相辅相成的,我们放在一起看。Tomcat现在一般都嵌入在SpringBoot里,极少会干这个事情,这里还是参考了李号双老师的文章来陈述。原创 2024-01-31 23:50:08 · 1634 阅读 · 0 评论 -
【Tomcat与网络8】从源码看Tomcat的层次结构
在前面我们介绍了如何通过源码来启动Tomcat,本文我们就来看一下Tomcat是如何一步步启动的,以及在启动过程中,不同的组件是如何加载的。一般,我们可以通过 Tomcat 的 /bin 目录下的脚本 startup.sh 来启动 Tomcat,如果是window那就用startup.bat来启动。那我们执行了这个脚本后发生了什么呢?在一篇中,我们看到tomcat启动是从类Bootstrap里的Main方法开始的,因此对于Tomcat而说,Bootstrap就是创造万物的工具。原创 2024-01-31 23:06:20 · 1280 阅读 · 0 评论 -
【Tomcat与网络7】亲测有效—如何用idea运行Tomcat9的代码
前面我们看了很多理论,但是总感觉少了什么?少了什么呢?亲手搞一下Tomcat源码,至少要将源码运行起来玩玩吧。今天我们就来看一下如何在idea中运行Tomcat源码。原创 2024-01-31 20:21:12 · 585 阅读 · 0 评论 -
【Tomcat与网络6】 Tomcat是如何扩展Java线程池的?
学习Tomcat的时候,有很多绚丽的技术值得我们学习,但是个人认为Tomcat的线程池扩展是最值得研究的一个部分,线程池的应用太广了,也重要了,Java原生线程池的特征我相信很多人都背过,那Tomcat为什么要扩展以及如何拓展的呢?这个问题理解了面试的时候就可以提升一下逼格。在开发中我们经常会碰到“池”的概念,比如数据库连接池、内存池、线程池、常量池等。为什么需要“池”呢?原创 2024-01-31 08:29:48 · 1450 阅读 · 0 评论 -
【Tomcat与网络5】再论Tomcat的工作过程与两种经典的设计模式
前面两篇,我们重点分析了Tomcat的容器和连接器的基本设计,今天我们来看一下两个机构如何在service的调度下进行协同工作的。原创 2024-01-30 23:53:32 · 1281 阅读 · 0 评论 -
【Tomcat与网络4】Tomcat的连接器设计
下面我来详细介绍这两个顶层组件 ProtocolHandler 和 Adapter。ProtocolHandler 组件由上文我们知道,连接器用 ProtocolHandler 来处理网络连接和应用层协议,包含了 2 个重要部件:EndPoint 和 Processor,下面我来详细介绍它们的工作原理。EndPointEndPoint 是通信端点,即通信监听的接口,是具体的 Socket 接收和发送处理器,是对传输层的抽象,因此 EndPoint 是用来实现 TCP/IP 协议的。原创 2024-01-30 23:31:24 · 1118 阅读 · 0 评论 -
【Tomcat与网络3】Tomcat的整体架构
Context 确定后,Mapper 再根据 web.xml 中配置的 Servlet 映射路径来找到具体的 Wrapper 和 Servlet。看到这里,我想你应该已经了解了什么是容器,以及 Tomcat 如何通过一层一层的父子容器找到某个 Servlet 来处理请求。需要注意的是,并不是说只有 Servlet 才会去处理请求,实际上这个查找路径上的父子容器都会对请求做一些处理。原创 2024-01-30 23:10:28 · 1277 阅读 · 0 评论 -
【Tomcat与网络2】一文理解Servlet是怎么工作的
其中最重要是的 service 方法,具体业务类在这个方法里实现处理逻辑。这个方法有两个参数:ServletRequest 和 ServletResponse。ServletRequest 用来封装请求信息,ServletResponse 用来封装响应信息,因此本质上这两个类是对通信协议的封装。比如 HTTP 协议中的请求和响应就是对应了 HttpServletRequest 和 HttpServletResponse 这两个类。原创 2024-01-30 20:01:58 · 1446 阅读 · 0 评论 -
20240128周报-网络太杂,Tomcat太难
今天来做个小总结吧,之前说想用几个月的时间将Java生态给整理一遍,该工作已经进入第三周了。先和各位老老板汇报一下上一周的工作,然后说一下本周的计划和后面的计划。原创 2024-01-30 08:36:51 · 717 阅读 · 0 评论 -
【随谈】为什么高端开发岗要求研究过源码?如何研究?
带着这些问题去分析相关的源码效率会更高,同时你在寻找答案的过程中,也会碰到更多问题,等你把这些问题都弄清楚了,你获得的不仅仅是知识,更重要的是你会树立起攻克难关的信心。今天说了这么多,就是想告诉你如果理解透彻一两个中间件,有了一定的积累,这时再来学一个新的系统,往往你只需要瞧上几眼,就能明白它所用的架构,而且你会自然联想到系统存在哪些角色,以及角色之间的关系,包括静态的依赖关系和动态的协作关系,甚至你会不由自主带着审视的眼光,来发现一些可以改进的地方。如果你觉得今天有所收获,欢迎你把它分享给你的朋友。原创 2024-01-28 12:04:17 · 869 阅读 · 0 评论 -
【Tomcat与网络1】史前时代—没有Spring该如何写Web服务
在前面我们介绍了网络与Java相关的问题, 最近在调研的时候发现这块内容其实非常复杂,设计的内容多而且零碎,想短时间梳理出整个体系是不太可能的,所以我们还是继续看Tomcat的问题,后面有网络的内容继续补充吧。Servlet是Java Web的核心机制,而实现Servlet最好的服务器无疑就是Tomcat。在前面我们介绍了如何用Java实现网络通信,这个与自己实现一个Servlet服务器,比如Tomcat 还差多少呢?差十万八千里,有一个挺好玩的图:目前各类Spring的材料实在太多了,我们用的也多。原创 2024-01-26 23:41:19 · 1132 阅读 · 0 评论 -
【Java与网络6】实现一个自己的HTTP浏览器
前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理,本文我们来整个大活:自己实现一个简单的Web服务。在讨论HTTP协议的具体请求和响应头字段之前,让我们先来利用以前所学的知识来实现一个HTTP模拟器。所谓HTTP模拟器就是可以在用户输入HTTP的请求消息后,由这个模拟器将HTTP请求发送给相应的服务器,再接收服务器的响应消息。这个HTTP模拟器有几下特点:1. 可以手工输入HTTP请求,并向服务器发送。2. 接收服务器的响应消息。原创 2024-01-26 17:55:24 · 1342 阅读 · 0 评论 -
【Java与网络5】十分钟实现一个自己的Socket服务器和客户端
由于本例使用了127.0.0.1,因Server和Client类必须在同一台机器上运行。在类Server类中只使用了ServerSocket类的accept方法接收客户端的请求。并从客户端传来的数据中读取两行字符串,并显示在控制台上。在前面我们去请求了外部的网站,如果我们要自己实现自己的服务端和客户端该如何做呢?如果要做一个完整的服务器是非常复杂的,但是想简单写一个能通信的还是挺容易的。功能就这么简单,简简单单十来行就实现了,废话就不多说了,下一篇继续!原创 2024-01-26 17:26:41 · 492 阅读 · 0 评论 -
【Java与网络4】Java网络编程-感受通过Socket实现网络通信
网络编程最大的作用实现不同机器之间通信。不管多么复杂的系统或网络,本质上到最后都是两个机器进行通信,一般我们把发送请求的一方称为客户端,接收请求的一方称为服务端。因此接下来我们就开始进行客户端和服务端的设计。Socket类是负责处理客户端通信的Java类,通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据。在本文中,我们将讨论使用Socket类的基本步骤和方法。一般网络客户端程序在连接服务程序时要进行以下三步操作。1. 连接服务器。原创 2024-01-26 17:14:58 · 1008 阅读 · 0 评论 -
【Java与网络3】Java网络编程之初体验
我们平时极少使用Java来直接写网络通信相关的程序,一般都使用Tomcat Web服务或者Netty等框架来帮助我们做,不过呢,要想将技术学到家,我们研究一下基本的网络编程还是非常必要的,这样可以让我们将很多内容融会贯通,更加通透。本文,我们就来练习一下相关内容。原创 2024-01-26 11:28:05 · 971 阅读 · 0 评论 -
【Java与网络2】:HTTP核心知识与Curl工具
对于网络,我们更多是在实践中应用,其中cURL是在命令行下工作的文件传输工具。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。curl支持的协议非常多,cURL支持的通信协议有: FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。原创 2024-01-26 09:51:32 · 1466 阅读 · 0 评论 -
【Java与网络1】:从HTTP协议看如何提高自己的资历
提到网络,我们往往更多关注的是IP、TCP、UDP等内容,当我们提到Java,我们更多关心的是JavaWeb、Tomcat等等,而他们之间的桥梁—HTTP协议,往往没有引起太多的重视 ,也许是因为这一块内容比较简单,也许是学习其他内容花费了我们比较多的精力。原创 2024-01-24 08:54:05 · 832 阅读 · 0 评论 -
20240122周报—redis收官,网络开搞
今天来做个小总结吧,之前说想用几个月的时间将Java生态给整理一遍,上周正式开始这个工作了。先和各位老老板汇报一下上一周的工作,然后说一下本周的计划和后面的计划。原创 2024-01-22 23:56:40 · 916 阅读 · 0 评论 -
【征服redis16】收官-redis缓存一致性问题解决方案
只要使用redis做缓存,就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。比如将商品的库存缓存在Redis,若库存数量不对,则下单时就可能出错,这是不能接受的。缓存和DB的数据一致性缓存有数据 缓存的数据值需和DB相同缓存无数据 DB必须是最新值不符合这两种情况的,都属于缓存和DB数据不一致。原创 2024-01-22 20:35:28 · 1289 阅读 · 0 评论 -
【征服redis15】分布式锁的功能与整体设计方案
以上的实现思路仅仅考虑在单机版Redis上,如果是集群版Redis需要考虑的问题还要再多一点。Redis由于他的高性能读写能力,所以在并发高的场景下使用Redis分布式锁会多一点。上面的问题一,二,三其实就是redis分布式锁不断改良发展的过程,第一个问题是设置有效期防止死锁,并且引入守护线程给锁续期,第二个问题是支持可重入锁,第三个问题是加锁失败后阻塞等待,等锁释放后再次尝试加锁。Redisson框架解决这三个问题的思路也非常值得学习。阿里云开发者。原创 2024-01-21 23:55:03 · 985 阅读 · 0 评论 -
【征服redis14】认真理解一致性Hash与Redis的三种集群
前面我们介绍了主从复制的方式和sentinel方式,这里我们看第三种模式-Cluster方式。原创 2024-01-21 19:55:07 · 1500 阅读 · 0 评论 -
【redis13】集群前奏:sentinel模式
Redis的哨兵模式是一种用于实现高可用性的机制。在哨兵模式中,多个Redis实例组成一个哨兵集群,其中一个实例作为主服务器,其他实例作为从服务器。哨兵监控主服务器的状态,并在主服务器宕机时自动将某个从服务器提升为新的主服务器,以保证系统的持续可用性。原创 2024-01-20 23:25:54 · 1161 阅读 · 1 评论 -
【征服Redis12】redis的主从复制问题
从现在开始,我们来讨论redis集群的问题,在前面我们介绍了RDB和AOF两种同步机制,那你是否考虑过这两个机制有什么用呢?其中的一个重要作用就是为了集群同步设计的。Redis是一个高性能的键值存储系统,广泛应用于Web应用、缓存、等领域。在实际应用中,为了保证Redis的高可用性,通常需要使用主从复制来进行数据备份和故障转移。本文将介绍Redis主从复制的概念、原理和实现方式,以及主从复制中的一些问题和解决方案。原创 2024-01-20 22:44:05 · 1117 阅读 · 0 评论 -
【征服redis11】花了一天,我终于懂了redis的底层数据结构
链表是这样一种数据结构,其中的各对象按线性顺序排列。链表与数组的不同点在于,数组的顺序由下标决定,链表的顺序由对象中的指 针决定。List是链型数据存储常用的数据结构,可以是单向链表、双向 链表,可以是排序链表、无序链表,可以是循环链表、非循环链表。链表具有可快速插入、删除的优点。由于List查找复杂度为O(n),n为元素 个数,所以不适用于快速查找的场合。Redis 3.2版本之前使用的双向非循环链表的基本结构如图所示。原创 2024-01-20 21:22:13 · 1268 阅读 · 0 评论 -
【征服Redis10】一文理解redis为什么这么快
Redis之所以一统分布式缓存的江湖,其中一大优势就是快,到底有多快呢?官方测试数据表明每秒可以处理13万次set或者lpush请求,执行lua调用可以达到12万次之多。一般来说,我们的Java服务,单台服务qps到达1000就很难了,可见这个数量确实高,那redis为什么快呢?今天我们就来讨论一下。我们接下来详细解释,后面两个紧密相关,我们放在一起来解释。原创 2024-01-20 11:50:05 · 638 阅读 · 0 评论 -
【征服redis9】快速征服lua脚本
Lua是一种小巧而强大的脚本语言,最初由巴西里约热内卢天主教大学的研究小组于1993年开发而成。Lua的设计目标是为应用程序提供灵活的扩展和定制功能。它由标准C编写而成,可以在几乎所有操作系统和平台上编译和运行。Lua的定位决定了它不提供强大的库,因此不适用于开发独立应用程序。Lua的嵌入性使得它在应用程序中广泛应用,既可以作为扩展脚本,也可以替代XML、ini等文件格式作为配置文件使用。Lua脚本可以轻松地被C/C++代码调用,也可以反过来调用C/C++函数,这增加了它在应用程序中的灵活性和应用范围。原创 2024-01-18 23:40:21 · 1291 阅读 · 0 评论 -
【征服redis8】Redis的AOF持久化
Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使用这些命令来重构数据库状态。原创 2024-01-17 20:45:21 · 1208 阅读 · 0 评论 -
【征服redis7】谈谈Redis的RDB持久化方式
从现在开始,我们来探讨redis的一个非常重要的问题——集群,要讨论集群,我们需要先理解redis持久化数据的方法,因为集群本质上就是将一个集群的数据同步到其他机器上。Redis 6的持久化机制主要有两种:RDB(Redis DataBase)和AOF(Append Only File)。前者效果好,但是代价高,使用频率低,后者则完全相反。本文将详细介绍这两种持久化方式的工作原理和配置要点。原创 2024-01-17 20:30:43 · 1293 阅读 · 0 评论 -
【征服redis5】redis的Redisson客户端
Redisson 最初由 GitHub 用户 “mrniko” 创建,并在 Apache 2.0 许可证下发布。它的目标是提供一组强大的工具和 API,帮助开发人员在分布式环境中处理数据,并解决并发和一致性的问题。Redisson 是一款在 Redis 的基础上实现的 Java 驻内存数据网格(In-Memory Data Grid)。它提供了很多分布式的java对象并直接映射到Redis服务器的数据结构。原创 2024-01-16 21:23:44 · 2624 阅读 · 1 评论 -
【征服redis4】一文征服redis的Lettuce客户端
Lettuce是一个高级Redis客户端,用于线程安全的同步、异步和反应式访问。它支持高级的Redis特性,如Sentinel、集群、流水线、自动重新连接和redis数据模型等。Lettuce是完全非阻塞的,基于Netty事件驱动的通信层,其方法将返回具有可观察的类型,可在流或异步编程环境中使用。Lettuce与其他Redis客户端的比较与Jedis这种阻塞的Java Redis客户端相比,Lettuce的主要优势在于其完全非阻塞的IO和线程安全。原创 2024-01-16 20:57:39 · 1434 阅读 · 0 评论 -
【征服redis3】一文征服redis的jedis客户端
Jedis 是一个流行的 Java 编写的 Redis 客户端库,它提供了连接和操作 Redis 服务器的功能。简单易用:Jedis 提供了简洁的 API,方便开发人员使用,减少了连接和操作 Redis 的复杂性。高性能:Jedis 是通过直接与 Redis 服务器进行通信来实现操作的,因此具有较高的性能。支持多种数据类型:Jedis 支持操作 Redis 的各种数据类型,包括字符串、哈希、列表、集合、有序集合等。原创 2024-01-15 23:58:55 · 942 阅读 · 0 评论 -
【征服redis2】redis的事务介绍
在前面我们介绍了redis的几种典型数据结构和应用,本文我们来看一下redis的事务问题。事务也是数据库的重要主题,熟悉关系型数据库的读者应该对事务比较了解,简单地说,事务表示一组动作,要么全部执行,要么全部不执行。例如在社交网站上用户 A关注了用户B,那么需要在用户A的关注表中加入用户B,并且在用户B的粉丝表中添加用户A,这两个行为要么全部执行,要么全部不执行,否则会出现数据不一致的情况。Redis提供了简单的事务功能,将一组需要一起执行的命令放到 multi和exec两个命令之间。原创 2024-01-15 22:44:15 · 1032 阅读 · 0 评论 -
【征服redis1】基础数据类型详解和应用案例
以mysql为代表的数据库,相信很多人都非常熟悉,这是数据持久化存储的最佳方式。但是在更新频繁或者访问强度高的场景下,数据库的性能捉襟见肘,这时候我们使用Redis作为缓存更加合适。缓存是redis最主要的功能,此外,redis还在分布式锁、异步消息队列等方面有重要应用。Redis 是一个开源的在内存中存储数据的结构化键值数据库,它支持多种类型的数据结构,如字符串、列表、集合、哈希、有序集合等。此外,Redis还支持事务、持久化、LUA脚本、LRU清除、自动故障转移等功能。Redis特点。原创 2024-01-14 22:49:35 · 1148 阅读 · 0 评论