- 博客(96)
- 资源 (3)
- 收藏
- 关注
原创 网页打开慢,这锅该谁背?
工作中扯皮说不可避免且非常常见的事情. 开发与产品、开发和测试、前端和后端都会产生扯皮现象. 今天要聊的一个问题就是前后端之间的扯皮问题.网页打开太慢这个锅谁背?做开发不能无凭据地胡乱甩锅, 我们要用数据说话, 具体看哪个参数呢,就是我们今天介绍的 TTFB.TTFBTime To First Byte 就是后台响应的第一个字节到达浏览器的时间, 说白了这个值比较大的话就说明是后端接口的问题,比如达到了几秒甚至十几秒; 如果比较正常的话通常不会超过一秒,一般都是 ms 级别,当然数据较大
2024-03-06 16:30:00
172
原创 J.U.C——CyclicBarrier 实现原理
1. 通过 generation 来实现循环使用,每一轮结束后,都会重置 generation;2. CyclicBarrier 底层和 CountDownLatch 一样是基于 AQS 实现的;3. CyclicBarrier 不需要代码手动移除(trip)屏障,线程数量达到(count==parties)自动触发。
2024-02-20 14:42:00
86
原创 J.U.C——CountDownLatch 的实现原理
1. 调用await 方法的线程处于 WATING 状态,虽然源码中说是 "block";2. 等待线程和任务线程通过核心方法 wait 和 countDown 来协调工作,完成特定场景需求。
2024-02-20 11:12:20
72
原创 Servlet 预览pdf
上篇文章介绍了图片的预览,这篇我们介绍下 pdf 文件的预览,pdf 预览在实际开发中用的还是比较多的,比如很多文件协议、合同都是用pdf 格式,协议预览就需要我们做 pdf 预览了。大家注意看右上角,下载按钮也有了,这个是浏览器的功劳,所以一旦我们做了文件预览功能,下载功能就自动生成了,是不是特别棒~
2024-01-17 15:21:56
687
原创 RocketMQ 限流参数
1. pullBatchSize 在PushConsumer 模式中默认值是32,注意是每一次从队列拉取的最大数据,针对的是单个队列,所以必须考虑到RocketMQ一个 topic 会创建多个 queue 的特性。2. 根据经验,我们会认为pullBatchSize 调大点会更好,减少拉取次数处理效率更高,但是有时我们得根据实际情况来做取舍。
2024-01-17 11:21:31
897
原创 HashMap 死循环
1. 死循环的问题根本原因是多个线程操作(准确地说是修改)同一条链表,导致链表循环,其他线程读取的时候就会发生死循环。2. 虽然 1.8 扩容时链表改成了尾插法,但是仍然无法保证多线程数据安全,毕竟 HashMap 本身就不是线程安全的。
2023-12-25 15:59:59
400
原创 Tomcat 源码之StandardWrapperValve
invoke 中,调用 filterChain#filter,所有的filter 走完,调用servlet#service 方法,整个调用过程的任何exception 都会被捕捉,最后由StandardHostValve重定向到 ApplicationDispatcher(implements RequestDispatcher)我们知道一个请求过来 tomcat 处理的核心的代码在。
2023-12-07 17:32:28
920
原创 从Springboot 看 Tomcat 启动
所以这里可以看出来,启动 server 就是启动 service ,启动 service 里又启动了 engine ,启动 engine 就是启动每个子容器,子容器再递归启动子容器的子容器。就这样engine 启动了 host , host 启动 context ,context 启动 wrapper,这些容器都有一个 startInternal 方法,用来做容器自身的准备以及启动子容器。搞懂每个 startInternal 方法里面做的事情,才能真正理解 tomcat 启动原理!
2023-12-07 17:28:58
989
原创 SpringCloud 项目如何方便 maven 打包以及本地开发
springcloud-alibaba ,使用 nacos 做配置中心,maven 作为构建工具。为了防止 test 、prod 环境配置文件覆盖问题,使用 mvn -P 命令。resources目录中, test 目录下的 bootstrap.yml 指向测试的 nacos,prod 目录下bootstrap.yml 配置的是生产的 nacos。这样就可以根据用户选择test/prod 来打对应的包即可:选择 test 环境时, 就会将 test/bootstrap.yml 打包进去。
2023-04-19 15:05:26
740
原创 Hello 2023
年初到年尾,感觉刚写完,就要迎接2023了。今天是2022最后一天,本来是元旦假期的第一天,奈何要来公司加班,抽个时间来回顾下 2022 吧。
2022-12-31 11:03:33
753
原创 Gitlab + Jenkins 自动触发CI/CD
Gitlab + Jenkins 这一套工具相信大家用的都比较多, 有些场景我们需要自动化构建,比如基础工具包,这套工具也是支持的,只需要做以下简单配置即可,下面跟我操作。
2022-09-07 16:44:57
782
原创 httpClient 高级用法——retryHandler
RPC 框架层出不穷,但是说起鼻祖那一定是来自于 apache 的 httpClient。RPC 框架的一个重要特征就是要解决因网络失败导致超时问题,换句话说就是要支持重试机制。httpClient 也不例外。httpClient 是通过 retryHandler 来实现重试的。当请求过程出现异常时,你可以选择是否自动重试。下面就看下具体使用步骤:一. 定义 retryHandlerHttpRequestRetryHandler myRetryHandler = new HttpReq
2022-05-19 11:46:35
1242
原创 SpringCloud 远程调用——OpenFeign
1. 导入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>2. 开启 openFeign配置类或者启动类上添加注解,自动扫描已经定义好
2022-04-25 10:55:27
994
原创 Lombok 虽好,使用时需谨慎
Lomboklombok 相信大家都不陌生了,一句话带过去:就是一系列注解在编译的时候给大家生产一些常用的基础代码,比如 构造方法、get/set、以及 builder 方式提供的链式编程。今天讨论的就是使用 @Builder 时带来的意想不到的坑。@Builder 的坑@Builder@Datapublic class User{ private Long id; private String username;}通过该注解,你后续可以采用链式编程,比如:
2022-03-25 16:28:02
373
原创 VMware 导入 CentOS 7
用了很久的 Mac ,换工作公司给配了 windows 台式机,刚好最近工作需要用到 linux ,就打算安装个 VMware ,然后导入以前全量克隆出来 CentOS 7 虚拟机。本以为很多东西已经配置好了,以为导入后就可以正常使用,实际却不然,也弄了小半天,这里记录下坑吧。一、宿主机 ping 不通虚拟机原因是以前配置的 ip 地址和公司机器 ip 不在一个网段, 修改后可以 ping 通!1. 配置虚拟网络 vmnet8配置虚拟机的网关:2. 配置 ens33.
2022-03-23 17:02:53
1087
原创 Redis 实现分布式锁
什么是分布式锁已经在之前的文章介绍过了,不明白的同学请回头阅读。这篇文章开始介绍分布式锁的具体实现。实现方式有很多,今天介绍如何通过 redis 来实现。今天介绍最基本的通过 setnx命令来实现,当然还有基于 redis 开源的第三方实现,比如 redisson.SETNXset if not exist,如果 key 不存在,设置指定的值并返回 1,否则不做任何操作返回 0,整个过程是原子操作。通过该命令来实现锁时需要考虑多线程并发带来的异常情况,比如上一次程序中断导致锁没有释放、死
2022-03-23 14:04:30
1268
原创 classpath 到底指什么?
classpathThe CLASSPATH variable is one way to tell applications, including the JDK tools, where to look for user classes.JavaSE 中定义 calsspath 是一个环境变量,用来告诉你的应用到哪里去找你的 class 文件。JavaEEeclipse 使用的 workspace 中找到 .classpath 文件使用文本编辑器查看:classpath.
2022-03-17 14:46:32
726
原创 再谈 NIO
之前的文章已经提到了 IO 模型之一的 NIO, 今天打算从 “阻塞”字面 以及java 代码层面再深一步聊一聊 NIO.《到底什么是 IO》https://mp.weixin.qq.com/s/OkIajg8aDlkLtsE81NP5jQAll is blocking从严格意义上说,所有的请求都是阻塞的,原因是所有的请求发出去之后都会等待,只是等待时长多少而已,这点希望大家明白。阻塞与非阻塞实际上就是阻塞的时间长短不同。Blocking vs Non-Blocking两者不同之处..
2022-03-14 11:31:46
691
原创 Bean 的生命周期之初始化
之前的文章《Spring IOC 中循环依赖,两幅图搞定》中介绍了 bean 的创建过程:1. 创建 createBean2. populateBean3. initializeBean第一步,通过反射拿到构造方法创建 bean; 第二步,填充 bean 的属性,如果发现被依赖的属性不存在则会首先创建被依赖属性,然后填充,里面涉及的循环依赖的问题已经讲过;第三步初始化是我们今天来聊的话题。先看代码: protected Object initializeBean(final Str
2022-03-08 15:51:56
1124
原创 Netty 源码之 channel 注册和 eventLoopGoup
一、NioServerSocketChannel 注册到 bossGroup (evenLoop)二、bossEventLoop (使用selector)轮询一旦有客户端连接,执行 read 方法:继续跟进 unsafe.read 方法:再进去, read 方法并不是真正的系统调用 read, 而是accetp 连接!!!!获取连接后,pipeline (channelHandler链)开始工作:首先就是ServerBootstrapAc...
2022-03-04 16:45:33
358
原创 Reactor 和 Proactor 到底是什么玩意
网络编程中出了 IO 模型之外,另一个被经常提到的就是 Reactor 模型和 Proactor 模型, 其实这两个模型和 IO 模型有着重要的关系,看完本文你就知道了.如果你对 IO 模型还不清楚,请先移步下面的文章后再回头来看本文.《到底什么是IO》https://mp.weixin.qq.com/s/OkIajg8aDlkLtsE81NP5jQ在网络编程中,服务器设计的好坏直接影响到能支持的最大并发数,通常会考虑两种方式,一种是通过 线程的方式,另一种就是通过事件的方式.单线程网络通.
2022-03-03 16:34:44
629
原创 Redis 的分区
为什么要分区分区是指把不同的 key 分发到不同的 redis 实例上,每个 redis 实例只存储 所有 key 的一个子集。分区的好处是能够支持更大的数据量,多个 redis 实例能够充分利用多核的优势。分区后带来的问题1. 同时操作多个 key 会比较复杂;2. redis 事务不再支持:跨 redis 实例的两个操作无法保证事务性。3. 伸缩节点比较复杂:redis cluster 在伸缩节点时可以自动 rebalance key ,但是 客户端和代理服务分区的方式就不能
2022-01-25 17:02:54
1387
原创 分布式一致性协议——Gossip
关于分布式一致性问题我已经在之前《分布式一致性协议——Raft》的谈到,还不清楚的朋友可以回头看一下。这篇文章将介绍另一种分布式一致性协议——Gossip。问题思考下,大规模集群时,如果还是采用 raft 协议,会不会有问题?根据上篇文章,我们知道 leader 会广播到 follower ,集群规模较大,势必会造成网络拥挤、网络超时等问题,无论从可用性还是性能角度考虑,都会存在问题。因为大规模集群需要考虑一下问题:1. 集群规模大,可靠性降低,即使出现部分网络问题,数据也应该能最终到达
2022-01-24 17:55:57
2730
原创 一致性 hash
分布式系统中,多个节点间实现请求的负载均衡,如果部分实例由于一些特殊的原因宕机或者需要扩容,这个时候就涉及到部分请求重新分发的问题。为了最小化请求重新分发,引入了一致性 hash 算法。先看下传统的 hash 算法解决请求分发问题的过程。hashhash 算法大家应该很熟悉了,就是将不定长的数据经过计算后输出定长的结果。如果在分布式系统中使用 传统hash 方法来分发请求,server = hash(key)%n这会带来两个问题: 一旦服务器节点数 n 发...
2022-01-24 11:00:55
478
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人