- 博客(179)
- 资源 (2)
- 收藏
- 关注
原创 Java知识体系个人总结
个人从事Java开发,平时会记录学习的知识点以及项目问题解决方案,个人整理了一些有关Java学习的知识内容(会面会慢慢增加哦(✿◡‿◡))。如有错误或者疏忽的地方,还望各位大佬评论指点,之后会及时更正,在此表示感激不尽。....................................
2021-01-19 18:17:02 1263 2
原创 SpringCloud Gateway路由核心原理解析
SpringCloud Gateway 是 Spring 官方基于 Spring Spring Boot 和 Project Reactor 等技术开发的网关,Gateway 旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Gateway作为 Spring Cloud 生态系中的网关,目标是替代 ZUUL,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了关基本的功能,例如:安全,监控/埋点,和限流等。
2024-10-26 21:38:38 1216 1
原创 系统设计-通用用户权限管理系统
一个没有权限控制的系统,是非常不安全的。在日常业务运营的系统中台,基本都会存在用户的菜单权限控制,会根据当前用户拥有的权限进行菜单展示。比如某某岗位拥有菜单A、菜单B的权限,某某岗位拥有菜单C、菜单D的权限。基础版的用户权限控制,只对用户菜单权限做了控制,在接口、按钮等方面,还是存在安全隐患,会存在一些越权操作(水平越权、垂直越权),并且某些系统还会存在数据权限控制,如不同租户只能查看当前租户下的相关数据。所以,进阶版用户权限控制,需要在用户展示,接口调用安全,数据权限等方面进行全方位的权限控制管理。
2024-10-25 15:59:31 848
原创 一个简单的Http根据规则自动路由
在日常项目中,有时候会根据一些规则/标识进行Http路由匹配,下面我实现一个简单的Http根据systemCode自动路由;
2024-10-25 11:29:12 466
原创 如何通过注解注入一个自定义的FactoryBean
二、定义一个注解三、创建一个FactoryBean四、创建一个BeanPostProcessor4.1 其他关联类AnnotationUtilsServiceBeanNameBuilder五、注入InstantiationAwareBeanPostProcessor到IoC中5.1 实现ImportBeanDefinitionRegistrar接口5.2 通过@Import注入六、使用6.1 打jar包将上面代码打成一个jar6.3 调用![在这里插入图片描述](ht
2024-07-27 18:46:37 397
原创 Mybatis-Plus MetaObjectHandler基操及源码解析
在 MyBatis-Plus 中提供了一个便捷的自动填充功能。MetaObjectHandler 是一个用于处理实体对象的元对象的接口。它允许我们在插入、更新、删除等操作之前或之后,对实体对象进行自定义处理。通过 MetaObjectHandler,我们可以实现如自动填充创建时间、更新时间、删除标记等功能。
2024-07-26 21:44:44 870
原创 Springboot+Mybatis Plus+Sharding Jdbc
【代码】Springboot+Mybatis Plus+Sharding Jdbc。
2024-01-24 23:13:34 207
原创 基于Netty构建Websocket服务端
除了构建TCP和UDP服务器和客户端,Netty还可以用于构建WebSocket服务器。WebSocket是一种基于TCP协议的双向通信协议,可以在Web浏览器和Web服务器之间建立实时通信通道。下面是一个简单的示例,演示如何使用Netty构建一个WebSocket服务器。
2023-12-22 11:52:37 1603
原创 SpringBoot基于gRPC进行RPC调用
在 gRPC 中,客户端应用程序可以直接调用服务器应用程序上的方法 在另一台机器上,就好像它是本地对象一样,使你更容易 创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 是 基于定义服务的思想,指定可以 使用其参数和返回类型进行远程调用。在服务器端, server 实现此接口并运行 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(在某些客户端中称为客户端 languages),它提供与服务器相同的方法。
2023-12-18 16:43:25 1798 2
原创 DDD与微服务的千丝万缕
2004年埃里克·埃文斯发表了《领域驱动设计》这本书,DDD()由此诞生。DDD核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模式和系统架构模式的一致性。DDD不是架构,而是一种架构设计方法论,它通过边界划分将复杂的业务领域简单化,从而设计出清晰的领域和应用边界,进而可以非常容易地实现架构演进。DDD主要包括战略设计和战术设计两大部分。战略设计主要从业务视角出发,建立业务领域模型,划分领域边界,建立通用语言的限界上下文,而限界上下文可以作为微服务划分的主要参考边界。
2023-10-21 10:39:36 1230
原创 MySQL事务底层原理
Update Undo Log 涉及到 MVCC 的功能,所以 Update 操作需要保留 Record 的多个历史版本,当某个 Record 的历史版本还在被使用的时候,这个 Record 不能从 Undo Log 中真正删除,因此需要删除的时候,只是修改对应 Record 的。不同事务或者相同事务的对同一记录的修改,会导致该记录的 Undo Log 成为一条记录版本线性表,既链表,Undo Log 的链首就是最新的旧记录,链尾就是最早的旧记录。、select …
2023-09-28 16:02:57 711
原创 MySQL索引设计与选择
从上面这个图可以看到,真正的数据仍然是保存到主键索引的叶子节点(这也就是为什么InnoDB表必须要有主键的原因),而辅助索引的叶子节点的数据区保存的是主键索引的关键字的值(非主键索引叶子节点的逻辑顺序和磁盘顺序不一致)。从MyISAM引擎中索引的实现来看,由于索引文件和数据文件是分离的,叶 子节点存储的是数据文件对应的磁盘地址,从索引文件.MYI中找到键值后, 会到数据文件.MYD中获取相应的数据记录。在日常生活中,存在很多用到“索引”的地方,比如中华字典目录,图书馆分类,一本书籍目录,等待。
2023-09-26 17:01:22 338
原创 MySQL系统架构设计
MySQL InnoDB 的 Page Cache 默认大小为 16k,但是正常操作系统 Page 为 4k,所以会存在 16K 只写入了一部分的极端情况,如当 InnoDB 在进行数据页的写入操作时,磁盘挂了,就可能导致 16k 只写了一部分情况,产生页断裂,导致数据部分失效,这种失效是无法回滚的,所以为了避免这种情况,引入了 Doublewrite Buffer。如果在数据修改的时候,对应的数据页不存在,那么就会先从磁盘中加载数据到 Buffer Pool,然后进行修改,执行之前流程。
2023-09-26 16:57:19 1655 4
原创 Gossip协议
Gossip协议是一个通信协议,一种传播消息的方式,灵感来自于:瘟疫、社交网络等,在分布式系统中被广泛使用,主要通过 Gossip 协议来保证网络中所有节点的数据一致性,这一点就显得尤为重要。假如小明的同学听说小明昨晚尿床了,然后就悄悄告诉了他的 3 个好朋友,他的3个好朋友听说,觉得也非常有意思,于是也告诉了他们各自的好朋友(实际情况好朋友可能会。:当某一个节点存在数据更新后,节点将变为活跃状态,并周期性的联系其他节点对齐传播消息,直到所有的节点都接收该信息。,保证了数据在集群中的传播和状态一致性。
2023-08-28 17:08:08 2574
原创 SSM框架原理畅谈之SpringMVC
Spring MVC 是一个成熟且广泛使用的Web应用程序框架,它结合了 Spring Framework 的依赖注入和面向切面编程的特性,为开发人员提供了强大而灵活的工具和功能来构建现代化的Web应用程序。HttpServletResponse 接口是 Java Servlet 规范中的一个子接口,继承自 ServletResponse 接口,它提供了更多与 HTTP 协议相关的方法和功能,用于处理HTTP请求的响应。它提供了一组方法,用于获取请求的各种属性和内容。:将模型的数据渲染成用户可见的输出。
2023-07-02 12:28:25 316
原创 数据安全解决方案
Java 提供了强大的加密和解密功能,如标准的加密算法 AES、DES、RSA 等。RSA加解密算法Util} /*** RSA最大加密明文大小/*** RSA最大解密密文大小/*** 算法/*** MD5_RSA。
2023-06-27 16:23:56 305
原创 SpringMVC 之 ResponseBodyAdvice接口
Class <?// 只拦截返回类型为 ResultBO 的方法 return returnType == null?// 添加日志跟踪 traceId resultBO . setTraceId(MDC . get("X-TraceId"));} }
2023-06-14 14:10:18 253
原创 RabbitMQ SpringBoot高级用法
不建议使用 rabbitmq 事务消息,对性能非常影响。建议通过消息发送确认机制实现事务。设置消息发送ConfirmCallback,消息发送成功 / 失败都会调用当前方法。通过前置处理器,可以修改消息、保存消息,设置通用header等。判断消息是否发送成功。
2023-05-26 17:47:58 1399 5
原创 分布式事务解决方案探讨
事务,大家第一时间想到的肯定是数据库事务,即,作为单个逻辑工作单元执行的多个数据库操作,要么同时成功,要么同时失败,且必须满足ACID原子性(Atomicity):事务作为一个整体单位被执行,要么全部成功,要么全部失败。一致性(Consistency):事务完成后,所有数据必须保持一致。隔离性(Isolation):多个事务的执行是相互隔离的(不可见的)。持久性(Durability):事务一旦提交,其修改将永久保存在数据库中,及时系统故障或重启也不会丢失。
2023-05-23 14:35:55 707
原创 微服务框架TraceId方案
MDC(Mapped Diagnostic Context,映射诊断上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的机制。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容(只有子线程创建的时候初始化一次并不适用于线程池)。在项目中随着项目的业务越来越复杂,以及项目的微服务化等,导致平常的项目中出现如:同一次操作日志散乱等现象,对通过查询日志的方式排查问题造成极大困扰。因此迫切需要一种可以追溯当前链路操作日志的手段。
2023-05-22 15:39:29 3108 2
原创 SELECT...FOR UPDATE
悲观锁(Pessimistic Locking) ,顾名思义,在处理多个并发操作时,同一时间点,只能有一个线程可能访问其资源,其他线程需等待锁的释放,才能进行操作。乐观锁的核心思想是:在进行数据更新前,需先检查数据是否被其他事务修改过,如果没有修改,则进行更新操作,如果有修改,则进行冲突处理。当一个事务需要对某个数据进行操作时,会先获取锁,同时,其他事务如果也需要访问该数据,就需要等待锁的释放。是一种数据库查询语句,用于在事务中对选定的行或表进行加锁,以防止其他事务同时对这些数据进行修改。
2023-05-20 15:29:05 2999 4
原创 一文了解JVM整体设计
使用G1收集器时,Java 堆的内存布局与就与其他收集器有很大差别,它将整个 Java 堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分 Region(不需要连续)的集合。如下:每个 Region 大小都是一样的,可以是 1M~32M 之间的数值,但是必须保证是 2的 n次幂。如果对象太大,一个 Region 放不下[超过Region大小的50%],那么就会直接放到 H(Humongous) 中。可通过参数。
2022-11-21 19:16:39 1076
原创 Kafka(三)、Kafka架构
Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,由 Scala 和 Java 编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。其持久化层本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,这使它作为企业级基础设施来处理流式数据非常有价值。此外,Kafka 可以通过 Kafka Connect 连接到外部系统(用于数据输入/输出),并提供了Kafka Streams —— 一个Java流式处理库。
2022-11-03 22:56:47 1978
原创 Kafka(二)、Kafka与SpringBoot集成
实现接口,重写/*** 自定义分区器:key 的哈希值取模return 0;// 关闭时调用 } @Override public void configure(Map < String ,?> map) {// 配置 } }
2022-10-30 23:21:27 711
原创 dubbo源码解析之服务调用(通信)流程
@TOC在 dubbo源码解析之服务发布与注册 一文中,存在步骤 4.4.3 服务发布,通过 暴露一个本地端口,用于监听并处理客户端连接请求。如果采用Netty进行远程通信,最终会通创建一个 对象。在 中,主要是初始化并启动了一个 netty 服务器,然后构造了一个 Handler 处理链。在 构造函数中,存在代码 ,返回一个 ChannlHandler 处理链。最终,ChannelHandler 链路如下:其中 handler 为 中的成员变量。在 dubbo源码解析之服务发现 一文中
2022-09-03 23:03:19 512
原创 dubbo获取服务提供者IP列表
(拦截器调用节点)时,传入了一个 clusterInvoker,我们可通过 clusterInvoker 获取。ClusterInterceptor 为集群处理拦截器 SPI 扩展点,在进行创建。在 dubbo 源码分析中可知,所有服务地址都是通过。
2022-09-03 11:30:38 3377
原创 dubbo源码解析之服务发现
Spring 启动过程中,会扫描所有包目录 的 文件,将其对应的 装载到 Spring IoC 容器中,并调用调用其中的 方法,通过注册一个BeanDefinitionParser 解析器,完成Bean对象的注册,如下:DubboNamespaceHandlerdubbo 会向 Spring IoC 容器中,注入以上 Bean 对象,关于上面 Bean 对象的各种作用,请参照【Dubbo配置及属性详解】,这里不作过多阐述。本系列文章参照 dubbo-2.7.17 进行源码分析。其中 代码,会
2022-08-28 22:56:59 1245 2
原创 dubbo源码解析之服务发布与注册
Spring 启动过程中,会扫描所有包目录 的 文件,将其对应的 装载到 Spring IoC 容器中,并调用调用其中的 方法,通过注册一个BeanDefinitionParser 解析器,完成Bean对象的注册,如下:DubboNamespaceHandlerdubbo 会向 Spring IoC 容器中,注入以上 Bean 对象,关于上面 Bean 对象的各种作用,请参照【Dubbo配置及属性详解】,这里不作过来阐述。本系列文章参照 dubbo-2.7.17 进行源码分析。其中 代码,会
2022-08-27 22:57:09 1903
原创 dubbo源码解析之dubbo配置解析
我们在 Spring 的 xml 配置文件里经常定义各种各样的配置(tx、bean、mvc、bean等等),以及集成第三方框架时,也会看到一些 Spring 之外的配置,例如 mybatis 的配置、dubbo 的配置、redis 的配置等等。看到这里,是否会引发我们思考,Spring 是如何解析这些 xml 配置文件呢???在 Spring 我们通过创建一个// 重启、刷新、重置 refresh();} } }在其构造方法中,会调用一个refresh()
2022-08-22 23:54:04 850
原创 dubbo源码解析之框架粗谈
本系列文件基于做源码参考,欢迎各位小伙伴一起探讨交流,有问题,欢迎评论区进行留言。好了,废话不多说,下面直接上硬货。下面我们根据 dubbo 官网提供的资料,进行 dubbo 框架的简单介绍。
2022-08-22 21:50:41 299
原创 Zookeeper原理解析-集群模式(Zab协议)
zookeeper是一个分布式协调中间件。通过 Zookeeper 可以实现分布式锁(节点唯一性、顺序节点)、注册中心(临时节点、持久化节点)、配置中心、Leader选举等等。zookeeper 采用文件目录树结构方式存储,一个目录代表一个节点(ZNode)。ZooKeeper 提供的命名空间与标准文件系统非常相似。名称是由斜杠(/)分隔的路径元素序列。ZooKeeper 命名空间中的每个节点都有一个路径标识。与标准文件系统不同的是,节点上除了存储数据内容外,还存储了数据节点本身的一些状态信息。
2022-08-20 21:59:15 323
原创 Zookeeper原理解析-单机模式
zookeeper是一个分布式协调中间件。通过 Zookeeper 可以实现分布式锁(节点唯一性、顺序节点)、注册中心(临时节点、持久化节点)、配置中心、Leader选举等等。zookeeper 采用文件目录树结构方式存储,一个目录代表一个节点(ZNode)。ZooKeeper 提供的命名空间与标准文件系统非常相似。名称是由斜杠(/)分隔的路径元素序列。ZooKeeper 命名空间中的每个节点都有一个路径标识。与标准文件系统不同的是,节点上除了存储数据内容外,还存储了数据节点本身的一些状态信息。......
2022-08-14 16:15:11 2153
原创 Alibaba Sentinel - 滑动窗口
为一个多线程并发统计的对象,核心原理就是:在多线程并发情况下,将线程竞争资源由一个,调整为多个(数组),以达到提高线程运行效率问题,最后统计整个数组值的总和。进行通过数量获取/添加、阻塞数量获取/添加、异常数量获取/添加、成功数量获取/添加、响应时间获取/添加等。接口,为 Sentinel 滑动窗口核心实现类,通过该类,可以获取到通过数量、阻塞数量、异常数量、成功数量、响应时间等。定义指标收集API,主要定义一个滑动窗口中成功的数量、异常数量、阻塞数量,TPS、响应时间等数据,代码如下:。...
2022-08-13 00:32:19 389
原创 Alibaba Sentinel - Slot chain解析
经过上面的分析,Sentinel通过各个 Slot 完成统计、限流、降级等逻辑,但Sentinel 是如何进行流量统计(线程数、RT、QPS等)的核心代码还未分析到,实际上,Sentinel 是通过。用于存储资源的统计信息,以及调用者信息,例如,该资源的RT、QPS、Thread count等,这些信息将用于作为多维度限流、降级的依据。负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流、降级。用于根据预设的限流规则已经前面的 slot 统计的状态,来进行流量控制。....
2022-08-10 21:33:02 758
原创 Alibaba Sentinel - 工作流程及原理解析
Sentinel的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时Sentinel也提供相关API,供您来定制自己的规则策略。流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和热点参数规则。下面以流量控制规则为例。//加载流量控制规则FlowRuleManager.loadRules(rules);}可以看到,在初始化规则的过程中,我们主要是创建了一个FlowRule对象,然后通过的方法加载规则。...
2022-07-28 21:54:43 946
原创 Alibaba Sentinel - 集群流量控制
集群流控可以解决流量不均匀导致总体限流效果不佳的问题。假设集群中有10台机器,我们给每台机器设置单机限流阈值为10QPS,理想情况下整个集群的限流阈值就为100QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果。集群流控客户端,用于向所属TokenServer通信请求token。...
2022-07-25 00:04:59 2369
原创 Alibaba Sentinel 基操
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。核心库(Java客户端)不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo/SpringCloud等框架也有较好的支持。控制台方式一主流框架的默认适配主流框架的适配】。方式二抛出异常的方式定义资源SphU。......
2022-07-24 17:13:40 366
原创 Nacos注册中心集群数据一致性问题
也就是我们说的主从复制,主机的数据更新后根据配置和策略,自动同步到备机的master/slave机制,当主节点宕机后,集群会根据某种分布式一致性协议(Raft、gossip协议、ZAB协议等)选举出新的Master节点。Master负责读写,Slave只负责读。在很多组件中都有使用这种思想,比如Mysql主从架构、Redis主从架构、kafka里面的数据副本机制等等。常见的主从复制架构有:一主多从主主复制级联复制多主一从这也是比较常见的集群架构,各自职责如下:Leader:领导者,主要的工作任务有两
2022-07-17 22:35:43 4805
原创 Nacos-注册中心原理解析
服务注册与发现是微服务架构得以运转的核心功能,它不提供任何业务功能,仅仅用来进行服务的发现和注册,并对服务的健康状态进行监控和管理。其核心的工作原理:Nacos为服务注册与发现提供了一个SDK类 NamingService,通过该类,可以实现服务的注册与发现、订阅服务的动态变化、获取服务实例、获取注册中心的健康状态等等。其中,NamingService中的接口,可以分为以下几类:创建 NamingService:获取 NacosNamingService 中带Properties形参的构造函数,然后反射创
2022-07-12 22:38:03 5447 2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人