- 博客(471)
- 资源 (26)
- 问答 (1)
- 收藏
- 关注

原创 再论 如何通过一个项目征服Java
第二个是几乎后台的技术,都是为了解决电商的问题而产生的,例如安全、高并发等等,而教育类,各种各样的管理系统,反而没那么高的访问量,因此对接口限流等等没有那么高的需求。云原生是大趋势,目前Java微服务开发越来越重,集成的功能越来越多,很多都与业务本身没有关系,而云原生的目标之一就是将那些固定的工作,例如接口限流等逐步固化到基础组件中,Java只负责业务就可以了,此外还有监控、日志、部署等很多基础功能。就是面向常规的微服务系统的设计,就是要构建一个如下一样的完整系统,设计的技术会非常多。
2024-01-20 21:45:49
3843
原创 【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
1195
原创 【SpringBoot3】从重构HelloWorld看Spring的作用
在我们学习一门新技术的时候,总是先运行出一个基本的程序来输出“Hello World”,如果成功了, 说明我们的开发环境基本就绪了,我们也像婴儿走路一样,能走第一步了。接下来我们就逐步改造一个最基本的HelloWorld来一步步分析Spring到底帮助我们做 了什么。
2024-02-17 12:34:10
1129
原创 【SpringBoot2】Spring容器的本质就是两个HashMap
做为Java程序员,我们就是Spring的用户,Spring的影子在我们的代码里几乎是无处不在,那Spring到底是什么,带给我们什么,如何工作的呢?这个简单问题貌似又不太好讲。因其能够管理bean生命周期以及提供基础设施支持而广受欢迎。Spring框架具有分层架构,支持从表现层到持久层的各个层次,但它并不是专门针对某一层的解决方案。它的主要特点包括依赖注入(DI)和面向切面的编程(AOP)。
2024-02-16 11:38:59
1202
原创 【SpringBoot1】Spring Boot是如何推断你的工程类型的
这里的isPresent()做什么的我们后面再细看,这里通过名字也能推测出来,大致是要判断是否存在的意思,第一个if部分就是判断是否为响应式REACTIVE类型,后面的for循环就是判断是否存在。学过JVM虚拟机原理的同学应该知道,字节码是保存在元空间的,所以这里SpringBoot在启动的时候是去元空间里查,看看我们有没有将Servlet的类信息加载进来。从定义上也能看到,第一种是None类型,表示不是网络服务的类型,如果我们的服务不是web服务可以这么设置,但是这个应用场景极少。那具体到哪里查的呢?
2024-02-03 18:04:36
759
原创 20240203周报—Tomcat暂时收尾,SpringBoot开始
最近几天主要是将Tomcat与Servlet相关的问题做了一个梳理,写了十来篇文章,今天又是周末,所以就写一个周报吧。
2024-02-03 11:34:07
701
原创 【Tomcat与网络11】如何自己实现一个简单的HTTP服务器
HTTP启动之后要持续监听,所以我们可以使用NioServer中的Handler就可以了,在修改后的HttpHandler中首先获取到请求报文并打印出报文的头部,包括协议的首行、请求方法的类型、Url和Http版本等,之后将接收到的请求消息(也就是报文信息)封装在一起,最后将这些信息打包成一个报文发送给客户端。这段代码看似简单,其实包含的逻辑并不少,我们可以看到这里是从key获得Socket通信使用了哪个通道(对于HTTP的就是不同端口号),这个key是哪里的呢?这相当于老板让你干活的时候,给你的锤子。
2024-02-01 12:22:22
886
原创 【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
1444
原创 【Tomcat与网络9】提高Tomcat启动速度的八大措施
本文我们来看一下如何对Tomcat进行调优,我们对于Tomcat的调优主要集中在三个方面:提高启动速度、提高系统稳定性和提高并发能力,后两者很多时候是相辅相成的,我们放在一起看。Tomcat现在一般都嵌入在SpringBoot里,极少会干这个事情,这里还是参考了李号双老师的文章来陈述。
2024-01-31 23:50:08
1952
原创 【Tomcat与网络8】从源码看Tomcat的层次结构
在前面我们介绍了如何通过源码来启动Tomcat,本文我们就来看一下Tomcat是如何一步步启动的,以及在启动过程中,不同的组件是如何加载的。一般,我们可以通过 Tomcat 的 /bin 目录下的脚本 startup.sh 来启动 Tomcat,如果是window那就用startup.bat来启动。那我们执行了这个脚本后发生了什么呢?在一篇中,我们看到tomcat启动是从类Bootstrap里的Main方法开始的,因此对于Tomcat而说,Bootstrap就是创造万物的工具。
2024-01-31 23:06:20
1327
原创 【Tomcat与网络7】亲测有效—如何用idea运行Tomcat9的代码
前面我们看了很多理论,但是总感觉少了什么?少了什么呢?亲手搞一下Tomcat源码,至少要将源码运行起来玩玩吧。今天我们就来看一下如何在idea中运行Tomcat源码。
2024-01-31 20:21:12
707
原创 【Tomcat与网络6】 Tomcat是如何扩展Java线程池的?
学习Tomcat的时候,有很多绚丽的技术值得我们学习,但是个人认为Tomcat的线程池扩展是最值得研究的一个部分,线程池的应用太广了,也重要了,Java原生线程池的特征我相信很多人都背过,那Tomcat为什么要扩展以及如何拓展的呢?这个问题理解了面试的时候就可以提升一下逼格。在开发中我们经常会碰到“池”的概念,比如数据库连接池、内存池、线程池、常量池等。为什么需要“池”呢?
2024-01-31 08:29:48
1545
原创 【Tomcat与网络5】再论Tomcat的工作过程与两种经典的设计模式
前面两篇,我们重点分析了Tomcat的容器和连接器的基本设计,今天我们来看一下两个机构如何在service的调度下进行协同工作的。
2024-01-30 23:53:32
1316
原创 【Tomcat与网络4】Tomcat的连接器设计
下面我来详细介绍这两个顶层组件 ProtocolHandler 和 Adapter。ProtocolHandler 组件由上文我们知道,连接器用 ProtocolHandler 来处理网络连接和应用层协议,包含了 2 个重要部件:EndPoint 和 Processor,下面我来详细介绍它们的工作原理。EndPointEndPoint 是通信端点,即通信监听的接口,是具体的 Socket 接收和发送处理器,是对传输层的抽象,因此 EndPoint 是用来实现 TCP/IP 协议的。
2024-01-30 23:31:24
1186
原创 【Tomcat与网络3】Tomcat的整体架构
Context 确定后,Mapper 再根据 web.xml 中配置的 Servlet 映射路径来找到具体的 Wrapper 和 Servlet。看到这里,我想你应该已经了解了什么是容器,以及 Tomcat 如何通过一层一层的父子容器找到某个 Servlet 来处理请求。需要注意的是,并不是说只有 Servlet 才会去处理请求,实际上这个查找路径上的父子容器都会对请求做一些处理。
2024-01-30 23:10:28
1315
原创 【Tomcat与网络2】一文理解Servlet是怎么工作的
其中最重要是的 service 方法,具体业务类在这个方法里实现处理逻辑。这个方法有两个参数:ServletRequest 和 ServletResponse。ServletRequest 用来封装请求信息,ServletResponse 用来封装响应信息,因此本质上这两个类是对通信协议的封装。比如 HTTP 协议中的请求和响应就是对应了 HttpServletRequest 和 HttpServletResponse 这两个类。
2024-01-30 20:01:58
1511
原创 20240128周报-网络太杂,Tomcat太难
今天来做个小总结吧,之前说想用几个月的时间将Java生态给整理一遍,该工作已经进入第三周了。先和各位老老板汇报一下上一周的工作,然后说一下本周的计划和后面的计划。
2024-01-30 08:36:51
748
原创 【随谈】为什么高端开发岗要求研究过源码?如何研究?
带着这些问题去分析相关的源码效率会更高,同时你在寻找答案的过程中,也会碰到更多问题,等你把这些问题都弄清楚了,你获得的不仅仅是知识,更重要的是你会树立起攻克难关的信心。今天说了这么多,就是想告诉你如果理解透彻一两个中间件,有了一定的积累,这时再来学一个新的系统,往往你只需要瞧上几眼,就能明白它所用的架构,而且你会自然联想到系统存在哪些角色,以及角色之间的关系,包括静态的依赖关系和动态的协作关系,甚至你会不由自主带着审视的眼光,来发现一些可以改进的地方。如果你觉得今天有所收获,欢迎你把它分享给你的朋友。
2024-01-28 12:04:17
912
原创 【Tomcat与网络1】史前时代—没有Spring该如何写Web服务
在前面我们介绍了网络与Java相关的问题, 最近在调研的时候发现这块内容其实非常复杂,设计的内容多而且零碎,想短时间梳理出整个体系是不太可能的,所以我们还是继续看Tomcat的问题,后面有网络的内容继续补充吧。Servlet是Java Web的核心机制,而实现Servlet最好的服务器无疑就是Tomcat。在前面我们介绍了如何用Java实现网络通信,这个与自己实现一个Servlet服务器,比如Tomcat 还差多少呢?差十万八千里,有一个挺好玩的图:目前各类Spring的材料实在太多了,我们用的也多。
2024-01-26 23:41:19
1236
原创 【Java与网络6】实现一个自己的HTTP浏览器
前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理,本文我们来整个大活:自己实现一个简单的Web服务。在讨论HTTP协议的具体请求和响应头字段之前,让我们先来利用以前所学的知识来实现一个HTTP模拟器。所谓HTTP模拟器就是可以在用户输入HTTP的请求消息后,由这个模拟器将HTTP请求发送给相应的服务器,再接收服务器的响应消息。这个HTTP模拟器有几下特点:1. 可以手工输入HTTP请求,并向服务器发送。2. 接收服务器的响应消息。
2024-01-26 17:55:24
1368
原创 【Java与网络5】十分钟实现一个自己的Socket服务器和客户端
由于本例使用了127.0.0.1,因Server和Client类必须在同一台机器上运行。在类Server类中只使用了ServerSocket类的accept方法接收客户端的请求。并从客户端传来的数据中读取两行字符串,并显示在控制台上。在前面我们去请求了外部的网站,如果我们要自己实现自己的服务端和客户端该如何做呢?如果要做一个完整的服务器是非常复杂的,但是想简单写一个能通信的还是挺容易的。功能就这么简单,简简单单十来行就实现了,废话就不多说了,下一篇继续!
2024-01-26 17:26:41
533
原创 【Java与网络4】Java网络编程-感受通过Socket实现网络通信
网络编程最大的作用实现不同机器之间通信。不管多么复杂的系统或网络,本质上到最后都是两个机器进行通信,一般我们把发送请求的一方称为客户端,接收请求的一方称为服务端。因此接下来我们就开始进行客户端和服务端的设计。Socket类是负责处理客户端通信的Java类,通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据。在本文中,我们将讨论使用Socket类的基本步骤和方法。一般网络客户端程序在连接服务程序时要进行以下三步操作。1. 连接服务器。
2024-01-26 17:14:58
1038
原创 【Java与网络3】Java网络编程之初体验
我们平时极少使用Java来直接写网络通信相关的程序,一般都使用Tomcat Web服务或者Netty等框架来帮助我们做,不过呢,要想将技术学到家,我们研究一下基本的网络编程还是非常必要的,这样可以让我们将很多内容融会贯通,更加通透。本文,我们就来练习一下相关内容。
2024-01-26 11:28:05
1021
原创 【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
1587
原创 【Java与网络1】:从HTTP协议看如何提高自己的资历
提到网络,我们往往更多关注的是IP、TCP、UDP等内容,当我们提到Java,我们更多关心的是JavaWeb、Tomcat等等,而他们之间的桥梁—HTTP协议,往往没有引起太多的重视 ,也许是因为这一块内容比较简单,也许是学习其他内容花费了我们比较多的精力。
2024-01-24 08:54:05
863
原创 20240122周报—redis收官,网络开搞
今天来做个小总结吧,之前说想用几个月的时间将Java生态给整理一遍,上周正式开始这个工作了。先和各位老老板汇报一下上一周的工作,然后说一下本周的计划和后面的计划。
2024-01-22 23:56:40
942
原创 【征服redis16】收官-redis缓存一致性问题解决方案
只要使用redis做缓存,就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。比如将商品的库存缓存在Redis,若库存数量不对,则下单时就可能出错,这是不能接受的。缓存和DB的数据一致性缓存有数据 缓存的数据值需和DB相同缓存无数据 DB必须是最新值不符合这两种情况的,都属于缓存和DB数据不一致。
2024-01-22 20:35:28
1359
原创 【征服redis15】分布式锁的功能与整体设计方案
以上的实现思路仅仅考虑在单机版Redis上,如果是集群版Redis需要考虑的问题还要再多一点。Redis由于他的高性能读写能力,所以在并发高的场景下使用Redis分布式锁会多一点。上面的问题一,二,三其实就是redis分布式锁不断改良发展的过程,第一个问题是设置有效期防止死锁,并且引入守护线程给锁续期,第二个问题是支持可重入锁,第三个问题是加锁失败后阻塞等待,等锁释放后再次尝试加锁。Redisson框架解决这三个问题的思路也非常值得学习。阿里云开发者。
2024-01-21 23:55:03
1019
原创 【征服redis14】认真理解一致性Hash与Redis的三种集群
前面我们介绍了主从复制的方式和sentinel方式,这里我们看第三种模式-Cluster方式。
2024-01-21 19:55:07
1756
原创 【redis13】集群前奏:sentinel模式
Redis的哨兵模式是一种用于实现高可用性的机制。在哨兵模式中,多个Redis实例组成一个哨兵集群,其中一个实例作为主服务器,其他实例作为从服务器。哨兵监控主服务器的状态,并在主服务器宕机时自动将某个从服务器提升为新的主服务器,以保证系统的持续可用性。
2024-01-20 23:25:54
1220
1
原创 【征服Redis12】redis的主从复制问题
从现在开始,我们来讨论redis集群的问题,在前面我们介绍了RDB和AOF两种同步机制,那你是否考虑过这两个机制有什么用呢?其中的一个重要作用就是为了集群同步设计的。Redis是一个高性能的键值存储系统,广泛应用于Web应用、缓存、等领域。在实际应用中,为了保证Redis的高可用性,通常需要使用主从复制来进行数据备份和故障转移。本文将介绍Redis主从复制的概念、原理和实现方式,以及主从复制中的一些问题和解决方案。
2024-01-20 22:44:05
1151
原创 再论如何用几个月的时间完成梳理Java体系的任务
现在发现很多内容都需要学习,但是平时上班没时间怎么办?早睡早起,每天学习3小时,坚持下去就能积累很多,从今天开始,没有特殊情况就坚持早起。
2024-01-20 21:55:35
480
原创 【征服redis11】花了一天,我终于懂了redis的底层数据结构
链表是这样一种数据结构,其中的各对象按线性顺序排列。链表与数组的不同点在于,数组的顺序由下标决定,链表的顺序由对象中的指 针决定。List是链型数据存储常用的数据结构,可以是单向链表、双向 链表,可以是排序链表、无序链表,可以是循环链表、非循环链表。链表具有可快速插入、删除的优点。由于List查找复杂度为O(n),n为元素 个数,所以不适用于快速查找的场合。Redis 3.2版本之前使用的双向非循环链表的基本结构如图所示。
2024-01-20 21:22:13
1304
原创 【征服Redis10】一文理解redis为什么这么快
Redis之所以一统分布式缓存的江湖,其中一大优势就是快,到底有多快呢?官方测试数据表明每秒可以处理13万次set或者lpush请求,执行lua调用可以达到12万次之多。一般来说,我们的Java服务,单台服务qps到达1000就很难了,可见这个数量确实高,那redis为什么快呢?今天我们就来讨论一下。我们接下来详细解释,后面两个紧密相关,我们放在一起来解释。
2024-01-20 11:50:05
677
原创 【征服redis9】快速征服lua脚本
Lua是一种小巧而强大的脚本语言,最初由巴西里约热内卢天主教大学的研究小组于1993年开发而成。Lua的设计目标是为应用程序提供灵活的扩展和定制功能。它由标准C编写而成,可以在几乎所有操作系统和平台上编译和运行。Lua的定位决定了它不提供强大的库,因此不适用于开发独立应用程序。Lua的嵌入性使得它在应用程序中广泛应用,既可以作为扩展脚本,也可以替代XML、ini等文件格式作为配置文件使用。Lua脚本可以轻松地被C/C++代码调用,也可以反过来调用C/C++函数,这增加了它在应用程序中的灵活性和应用范围。
2024-01-18 23:40:21
1331
原创 【征服redis8】Redis的AOF持久化
Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使用这些命令来重构数据库状态。
2024-01-17 20:45:21
1246
原创 【征服redis7】谈谈Redis的RDB持久化方式
从现在开始,我们来探讨redis的一个非常重要的问题——集群,要讨论集群,我们需要先理解redis持久化数据的方法,因为集群本质上就是将一个集群的数据同步到其他机器上。Redis 6的持久化机制主要有两种:RDB(Redis DataBase)和AOF(Append Only File)。前者效果好,但是代价高,使用频率低,后者则完全相反。本文将详细介绍这两种持久化方式的工作原理和配置要点。
2024-01-17 20:30:43
1354
原创 【征服redis6】Redis的内存淘汰详解
数据库存储会将数据保存到磁盘中,而Redis的核心数据是在内存中的,而Redis本身主要用来做缓存,当 Redis 的内存达到最大限制时,会发生什么情况?redis 会怎么处理呢?Redis性能很高,官方给的数据 读:110000次/s,写 81000次/s。但是长期使用,Key会不断增加,Redis作为缓存使用,物理内存也会满,内存与硬盘交换(swap)虚拟内存也会被占满,频繁的IO操作会导致性能急剧下降。
2024-01-17 09:03:25
1189
mysql-connector-c++-8.0.23-macos10.15-x86-64bit.dmg
2021-05-10
live555.chm帮助文档
2016-09-09
QtFtp源代码
2016-07-19
qt5使用curl实现文件下载的示例程序
2016-06-20
64位win7系统下安装USB下载器驱动FriendlyArm-usb-dnw-driver
2016-02-02
ffmpeg-2.0.tar.bz2 linux源代码
2014-05-02
vlc -1.1.7.tar.bz2 linux版源代码
2014-05-02
深度学习基础教程
2014-04-10
Geoffrey Hinton 深度学习 培训材料
2014-04-10
Handbook of Face Recognition 李子青-人脸识别技术
2014-04-10
为什么java中使用移位会出错
2022-01-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人