- 博客(110)
- 资源 (6)
- 收藏
- 关注
原创 SSE协议介绍
id字段id用于表示Event的序号,客户端通过序号实现断线重连功能。需要重连的时候,客户端在HTTP的header里加一个Last-Event-ID字段,把最后接收到的id传给服务端。服务端实现了重连功能,就能继续传Last-Event-ID之后的消息给客户端。event字段event表示自定义事件类型,客户端通过该字段区分不同消息。id:2data:你的data:名字叫什么?data字段data表示返回的业务数据,如果数据很长可以分成多行返回。id:1data:你data:好,retry字段。
2024-03-13 20:41:07 400
原创 解决JVM进程被系统杀掉问题
遇到问题的时候,通过dmesg命令确定进程是被系统kill。然后,用 -XX:HeapDumpPath命令拿到堆信息。最后,通过MAT工具分析内存泄露的地方。
2024-03-13 20:40:11 1012
原创 Spring mvc原理之注册DispatcherServlet
spring boot的基础是tomcat,就要遵循tomcat的servlet规范。它通过ServletContextInitializer实现了Servlet的自动注册机制;用DispatcherServlet代理所有请求,内部实现了请求的路由、类型转换等。将开发者和tomcat解耦,也方便框架去替换不同的web容器。
2024-01-24 18:47:50 1059
原创 jasypt集成spring-boot原理解析
jasypt通过代理了所有的PropertySource,在获取属性之前,对属性进行解密。是PropertySource的包装类缓存了解密结果是的包装类先解析Spring的占位符实现了延迟加载对象是PBE加密机通过池化提升并发度。
2024-01-22 20:49:35 1071
原创 Mysql给json加索引
json列能添加多值索引,提高了json的查询性能。同时因为索引要指定列的类型,索引列就不能使用任意类型,这会失去一部分schemaless的能力。需要注意的是,使用cast函数添加索引时,要选择合适type,不然会出现类型转换失败的异常。
2024-01-22 14:32:00 1159
原创 SpringBoot升级到2.7.18后不兼容的地方
最近为了给kafka加性能指标采集功能,调研后发现spring-kafka在2.3版本之后就自带了Micrometer指标采集功能。但是当前项目的spring-boot版本是2.0.2.RELEASE,对应的spring-kafka版本是2.1.6.RELEASE,所以准备将spring-boot版本升级到2.7.18,这是2.x系列的最高版本,对应的spring-kafka版本是2.8.11。
2024-01-14 14:46:41 2180
原创 Innodb执行insert造成死锁的问题
起因是线上报了一个错误信息,Deadlock found when trying to get lock;try restarting transaction,这是Mysql检测到死锁后,自动回滚了事务引发的异常。spring框架里打印了异常堆栈,所以很快就定位到哪一行代码出了问题。看了代码逻辑,只有insert的时候会加一个行锁,死锁要有两个锁被多个线程账户等待,才会发生。就算有并发的情况,同时插入两条一样的记录,第二个事务也是处于等待锁的状态,等待锁超时后就报获取锁超时,也不会发生死锁。
2023-12-30 23:39:21 438
原创 处理读写分离延迟
要判断主从严格一致的成本是很高的,用到GTID来判断主从延迟,对代码的侵入性很高,而且要额外的查询GTID和判断GTID是否同步,性能也会受到影响。如果业务场景对一致性要求很高,为了简化编程,还不如直接查主库。如果对一致性要求不高,直接读从库,或者等待1秒也是不错的方式。
2023-12-20 23:04:46 451
原创 读写分离之同步延迟测试
读写分离是快速提高数据库性能的手段,主库只负责写入,从库负责查询。但在性能得到提升的同时,编程的复杂度就会提升。由其碰到主从同步延迟的情况,在数据写入后,在从库无法读取到最新数据,会对业务逻辑造成很大的影响。那么,我们如何发现主从延迟对业务有什么延续呢,那就需要人为的制造延迟,将问题暴露出来。
2023-12-18 22:39:00 731
原创 联合查询为什么小表要放在前面
在Mysql的查询优化里有一条经验,在联合查询时,SQL里要把小表放在大表的前面。小表是指数据量少的表。这个经验的原理是什么呢?这就要从Mysql的遍历方式开始说起。
2023-12-14 20:24:07 366
原创 Mysql日志binlog、redolog、undolog
这里的新版本并不是说一行记录会拷贝成多份,记录只存最新的一条,然后之前的版本会各自对应一条undo log,日志里会记录变更内容的原始值。这时会把修改先记录到log buffer,在提交事务时,先把redo log的状态设置为prepare并存入磁盘,然后提交binlog存入磁盘,最后将redo log设置为commit状态存日磁盘。另一个是用于数据库复制,通过将binlog传给其他数据库副本,然后再执行binlog中的sql实现数据的同步,构建出一套高可用的数据库服务。可以查看日志是否开启。
2023-12-07 14:25:51 954
原创 Mysql索引总结
总结一下Mysql Innodb索引相关的知识,索引是以空间换时间的方式来加快查询速度。本质是将查询涉及的字段单独拎出来减少查询的基数和减少磁盘io次数,先做了排序可以用更高效的查询算法。同时索引也有一些弊端,需要占用额外的空间,还不少。数据写入时,维护索引的数据排序,要消耗cpu。随着索引数量增加,查询优化器要评估每个索引的效率,对于用不到的索引的评估时间,影响查询效率。
2023-11-28 23:47:48 833
原创 Sentinel网关限流
在微服务架构下,每个服务的性能都不同,为避免出现流量洪峰将服务冲垮,需要依赖限流工具来保护服务的稳定性。sentinel是阿里提供的限流工具,社区活跃,功能也很全面,包含实时监控、流控、熔断等功能。spring-gateway服务添加sentinel支持,并通过sentinel dashboard进行规则配置,规则数据存在nacos里,支持规则变更实时生效。sentinel包含7种规则类型,这些规则数据存放在nacos里。注意,使用网关模式对接时,限流规则不能放到flow类型下,要使用gw_flow类型。
2023-11-10 18:11:15 1209 1
原创 ShardingSphereJDBC5.4.0支持Nacos配置(SpringCloud版)
NacosConfigBootstrapConfiguration配置类是Spring Cloud通过org.springframework.cloud.bootstrap.BootstrapConfiguration=com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration方式加载。但使用ShardingSphere Driver后,也就无法通过spring-cloud-starter-alibaba-nacos-config自动载入数据库配置。
2023-10-07 15:55:40 2376 5
原创 RabbitMQ消息的链路跟踪
TraceId能标记一次请求的调用链路,在我们排查问题的时候十分重要。系统引入MQ后,MQ消息默认不带TraceId,所以消息发送和处理的链路就断了。下面分享如何对业务逻辑无感的方式,将TraceId带到消费端。
2023-09-28 16:15:38 1347
原创 Arthas热加载运行中的Java代码
热部署是指在不停止进程的情况下,重新加载新的java代码。例如,修改完方法里的代码后,将修改的逻辑重新注入到Jvm里。Arthas就给我们提供了这样的功能。
2023-09-28 14:26:59 159
原创 Arthas协助MQ消费性能优化
因为本次压测是在测试数据库,所以数据库本身不稳定,虽然定位到了这个性能瓶颈,对消费逻辑优化帮助不大,需要更精准的评估线上数据库的性能。但是通过monitor命令长时间观察doUpdateCoin方法的执行情况,发现大部分时间平均RT其实是比较低的,所以不应该是单次请求慢而降低了总体的消费TPS。可能是因为SQS消息拉取阶段存在瓶颈,所以尝试加大了消费的线程数、将单条拉取改成批量拉取。重新压测后,消费TPS从23提升到了342。
2023-08-04 12:30:50 1351 2
原创 ES优化复合排序
ES我们可以通过_score和sort控制排序规则,本文从实现play_score和publish_time复合排序出发,对比了多次查询、sort脚本排序、script_score打分脚本、field_value_factor打分函数这4种方式的实现和性能。得到2条结论:1. 使用ES自定义排序规则,能简化排序功能实现。2. 实现内置函数field_value_factor比使用脚本(sort脚本、script_score脚本)性能更好。
2023-05-14 19:24:45 1396
原创 SpringSecurity如何设置和修改登录态
通过更新和,我们就能完整更新中的用户信息。如果项目中引入了Spring Session,Spring Session维护的登录态也会同步更新。
2023-04-02 00:52:21 1188
原创 SpringSecurity安全框架简介
我们介绍了Spring Security的基本概念和常见功能,分析了Spring Security扩展机制的实现原理,最后对比了Spring Security6.0的一些改动。可见,使用Spring Security我们通过提供自己的业务过滤器,很容易实现功能的扩展。
2023-03-29 15:19:48 1469
原创 【尝鲜版】ChatGPT插件开发指南
准备开发一款插件,要先明确插件的作用以及限制。下面是ChatGPT插件允许的一些操作:检索实时信息;例如,体育比分、股票价格、最新消息等。检索知识库信息;例如,公司文件、个人笔记等。代表用户执行操作;例如,订机票、订餐等。
2023-03-24 14:48:40 15387 1
原创 Java面试技巧分享
Java 开发者面试可能是一段艰苦的旅程,但不用担心!在这篇文章中,我将会分享一些实用的 Java 面试技巧,以帮助你在面试前、面试中和面试后表现出色。一、面试准备阶段1.1 学习基础知识【学习资料】在准备 Java 面试时,首先要掌握 Java 的基础知识。其中包括:Java 语言基础(变量、运算符、流程控制、方法、类和接口等)Java 集合框架Java 异常处理Java I/OJava 多线程和并发Java 网络编程Java 虚拟机Java 性能优化。
2023-03-23 07:52:18 653
原创 高效使用ChatGPT进行学习
可以看出,使用ChatGPT可以完整的学习一个新事物,当然前提是ChatGPT的训练集包含了这些知识。整个学习过程是,我们按照自己的思考框架,向ChatGPT提出问题(需求),ChatGPT帮我们补充知识细节。在对话的过程中,我们一方面要辨别ChatGPT输出内容的准确性,另一方面要选择深入的方向。所以,ChatGPT并没有代替人,而是按需帮我们完成了知识的收集和组织展示的工作,让我们更专注于处理问题本身。
2023-03-22 17:54:25 5603
原创 ChatGPT扫盲设计模式
设计模式是软件开发中经常使用的一种方法,它们是针对常见问题提出的可复用的解决方案。了解设计模式可以帮助我们更好地编写可维护、可扩展的代码。下面介绍学习设计模式时,应该关注的一些点。
2023-03-22 13:46:02 479
原创 ChatGPT扫盲Redis
Redis 是一个基于内存的键值存储数据库,全称为 Remote Dictionary Server,由 Salvatore Sanfilippo 开发。Redis 最初在 2009 年发布,它的设计目标是为了解决传统关系型数据库存在的性能瓶颈问题,其具有以下优点:高性能:Redis 的数据存储在内存中,能够提供非常快的读写速度。数据结构丰富:Redis 提供了多种数据结构,如字符串、哈希表、列表、集合和有序集合等,能够满足不同的应用场景需求。
2023-03-22 12:21:07 519
原创 ChatGPT扫盲微服务
微服务架构是一种分布式系统架构,将一个大型应用程序拆分成多个小型服务。每个服务都是独立的、自治的,可以独立部署、升级和扩展。微服务架构的主要特点包括:松耦合:微服务之间的通信采用轻量级的协议,服务之间可以独立演进,减少了各个服务之间的依赖。可伸缩性:微服务可以根据负载自动扩展,实现水平扩展和垂直扩展,满足不同的业务需求。独立部署:每个微服务都可以独立部署和升级,不影响其他服务的运行,可以快速发布新功能和修复缺陷。
2023-03-20 15:49:06 615
原创 ChatGPT扫盲大数据
基于身份的访问控制(Identity-Based Access Control,IBAC):IBAC是一种访问控制模型,它基于用户的身份信息来控制对资源的访问权限。基于角色的访问控制(Role-Based Access Control,RBAC):RBAC是一种常用的访问控制模型,它基于用户角色来控制对资源的访问权限。Data Lake Formation:由阿里云提供的数据湖及Lakehouse的服务,为客户提供了统一的元数据管理、统一的权限与安全管理、便捷的数据入湖能力以及一键式数据探索能力。
2023-03-20 14:20:29 1963
原创 SpringSession如何管理Session
SpringSession有一套独立的session模型,它和Servlet非常相似,最大的区别是session存放的位置,从StandardManger换到了SessionRepository。通过扩展SessionRepository,可以实现自定义session存储方式。下图是SpringSession和Servlet的session结构的对比:SpringSession通过注册成Servlet Filter来拦截请求,将请求里注入自己的Session对象,实现session的管理。
2023-03-16 01:00:11 329
原创 Servlet容器如何管理Session
session作为会话的标识,Servlet容器会把它自动管理起来,在需要的时候创建Session对象。
2023-03-15 13:33:37 309
原创 SpringSecurity如何管理session
SessionManagementFilter是在用户认证成功后,执行一些session相关的工作,包括防止固定会话攻击,多点登录登自动下线等。用户通过扩展点,能自定义各种策略。下面是SessionManagementFilter的流程图,分为4个子流程:认证通过,执行策略成功,保存SecurityContext,执行下一个Filter认证通过,执行策略失败,执行身份认证失败策略(一般是重定向到登录页面),结束请求。
2023-03-14 15:17:42 851
原创 SpringSecurity使用数据库的用户数据做认证
InMemoryUserDetailsManager 初始化的位置是在UserDetailsServiceAutoConfiguration 配置文件里。所以,我们提供UserDetailsService Bean之后,配置就会自动失效。这是实例,要注意接口约定loadUserByUsername方法不能返回null,所以找不到用户时要抛UsernameNotFoundException 异常。
2023-03-13 15:28:26 501
原创 问题分析:URL设置成公开,访问还会被拒绝?
使用SpringMvc和SpringSecurity时,把一个不存在的URL的设置成公开访问,并在未登录的状态下访问了,结果会返回404吗?答案并不会,这会触发两种错误处理机制。当URL不存在时,会触发SpringMvc的错误处理机制,将请求重定向给错误页,页面显示404当未登录时,会触发SpringSecurity的权限校验机制,没登录会触发AccessDeniedException 异常,从而转到登录页。这两个机制下,最终SpringSecurity会胜利,所以看到的是没权限访问。
2023-03-12 22:46:36 301
原创 SpringSecurity如何实现前后端分离
由于前端直接调用登录接口,跳过了获取登录页面的步骤,所以服务端没有机会将CSRF Token传给前段,所以要把POST /login接口的CSRF校验剔除掉。
2023-03-11 18:08:28 1878 5
原创 Filter在SecurityFilterChain上的的排序规则
为了让系统正常运行,SecurityFilterChain 上的Filter要保持一定的顺序,例如AuthorizationFilter 要放在各类AuthenticationFilter 的后面,不然还没认证就开始校验权限信息,那一定不会通过。Spring Security为默认的Filter设置了固定的顺序,这些Filter和Filter的子类,都会按照这个顺序执行。
2023-03-11 16:56:16 588
原创 一文了解HTTPS是什么
HTTPS是HTTP开启TLS传输协议,客户端要拿到服务端的公钥,用公钥加密数据后再进行传输,防止数据泄露后背篡改。它要解决两个问题:怎么保证公钥可信怎么加密数据。
2023-03-07 18:50:29 471
原创 什么是Cookie-Session重放攻击
Cookie-Session 重放攻击是一种网络攻击方式,攻击者利用被攻击者已有的认证 Cookie 或 Session ID 等信息,重复发送该信息进行身份验证,从而获得访问权限。
2023-03-07 15:38:23 781
原创 定时攻击简介
定时攻击(Timing Attack)是一种利用计算机系统中对比时间来获取敏感信息的攻击方式。这种攻击方式利用了系统比较两个值的操作需要一定的时间的特点,通过不断地改变一个值的位数并比较两个值的时间差,逐步获取敏感信息。通常,定时攻击可以用于窃取密码、令牌、加密密钥等敏感信息。定时攻击的主要原理是利用系统的时间差异,比较两个值的时间差异可以告诉攻击者哪一个值的某一位比较接近真实值。在密码验证中,攻击者可以通过逐位比较密文和明文的时间差,逐步猜测出密码的每一位。
2023-03-07 15:35:22 364
原创 ChatGPT科普
ChatGPT是一个大语言模型(LLM),它根据已有的内容,循环的生成下一个合理的内容,准确的说是一个token。每次循环的时候,都会生成一份带有概率的token列表,从这个概率列表中挑选一个token拼接到文本中。
2023-03-07 13:20:03 964
原创 SpringSecurity支持WebAuthn认证
解决了密码泄露的风险,主流的浏览器都支持。Spring Security官方暂时未支持WebAuthn,可以用的项目,它将和Spring Security打通,项目还处于开发阶段,设计上可能还会调整。但我们可以通过项目里的demo,很好的学习怎么实现WebAuthn。简单介绍一下中例子的打开方式。
2023-03-07 12:05:03 678
sentinel-dashboard-nacos.jar
2023-11-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人