摘要: Nacos:支持CP或AP,同时包括了雪崩保护、自动注销实例、监听支持、多数据中心、跨注册中心同步、springCloud基础、dubbo集成、k8s集成 原理: 原理: nacos集成到springCloud,nacos client中实现了NacosServiceRegistry,实现了regi 阅读全文
posted @ 2025-04-16 19:02 难得 阅读(11) 评论(0) 推荐(0)
摘要: 服务故障引起的雪崩: 多个微服务之间调用时,A调用B和C,B和C又调用其他服务,这就是所谓扇出,如果链路上某个微服务由于网络或自身原因导致服务响应时间过长或不可用,对A的调用就会占用越来越多的系统资源,进而引起系统崩溃。 对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟 阅读全文
posted @ 2025-04-16 19:02 难得 阅读(30) 评论(0) 推荐(0)
摘要: Feign解决什么: Feign旨在使编写JAVA HTTP客户端变得更加容易,Feign简化了RestTemplate代码,实现了Ribbon负载均衡,使代码变得更加简洁,也少了客户端调用的代码,使用Feign实现负载均衡是首选方案,只需要你创建一个接口,然后在上面添加注解即可。 Feign是声明 阅读全文
posted @ 2025-04-16 19:00 难得 阅读(28) 评论(0) 推荐(0)
摘要: 基于HTTP和TCP的客户端负载均衡工具,主要负责请求分发,服务之间通讯基于Http Restful。SpringCloud服务调用方式有Rribbon+RestTemplate和Feign。当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表 阅读全文
posted @ 2025-04-16 18:59 难得 阅读(18) 评论(0) 推荐(0)
摘要: 注册中心提供:管理服务注册和发布、服务注册后如何被及时发现、服务宕机后如何及时下线、服务如何有效的水平扩展、服务发现时如何路由、服务异常时如何降级、注册中心如何实现自身高可用 Zk: leader(读写)+follower(读),leader主动同步数据到follower,保证顺序一致性,尽量保证数 阅读全文
posted @ 2025-04-16 18:35 难得 阅读(29) 评论(0) 推荐(0)
摘要: RPC: 应用分布在不同的机器上,无法共用内存空间,或者在一台机器内通过本地调用无法完成相关的需求,比如不同的系统之间的通讯,甚至不同组织之间的通讯。此外由于机器的横向扩展,需要在多台机器组成的集群上部署应用等等。 RPC是远程过程调用协议,允许程序调用另一个地址空间的过程或函数,不需要显示编码远程 阅读全文
posted @ 2025-04-16 18:31 难得 阅读(20) 评论(0) 推荐(0)
摘要: 网络IO交互过程: 一次网络IO的交互涉及到用户态、内核态、网卡之间的处理流程。以输入操作为例: 等待网络上的数组分组到达网卡,它会被拷贝到内核中的某个缓存区。该阶段可以定义为:等待数据准备好,然后把数据从网卡拷贝到内核空间 数据准备好后,把数据从内核缓存区拷贝到应用进程缓冲区 阻塞/非阻塞:描述的 阅读全文
posted @ 2025-04-16 18:29 难得 阅读(38) 评论(0) 推荐(0)
摘要: 单工、半双工、全双工:主要发生在路由器的交换机这块功能里。 单工:数据传输只支持一个方向,同一时刻只能有一方接收或发送消息 半双工:数据传输支持两个方向,同一时间只能有一方接收或发送信息。需要先判断是否有数据接入进来,避免发生信号碰撞问题,要等一个方向数据过去了,才能把数据发出去。以太网层面处于半双 阅读全文
posted @ 2025-04-16 18:24 难得 阅读(46) 评论(0) 推荐(0)
摘要: 应对高并发的核心原则 分而治之:拆解系统为独立模块,分别优化(如读写分离、服务拆分)。 空间换时间:通过缓存、预加载减少实时计算。 异步化:避免阻塞,提升吞吐量(如MQ解耦、批量处理)。 冗余与弹性:预留资源缓冲,支持快速扩缩容。 防御性设计:假设一切可能失败,提前设计降级、熔断、补偿机制。 一、评 阅读全文
posted @ 2025-04-16 18:22 难得 阅读(67) 评论(0) 推荐(0)
摘要: 为什么要分库分表: 分表:当单表数据量太大时,会极大影响sql执行的性能,会导致sql查询很慢。分表是把一个表的数据放到多个表中,比如用户信息表,用用户id来分表,每张表控制在200w数据量。那么操作时数据量就少,执行sql速度也会快。 分库:单库的并发量有限(2000) ,当并发请求超过数据库的瓶 阅读全文
posted @ 2025-04-16 18:20 难得 阅读(60) 评论(0) 推荐(0)
摘要: Redis原子操作保证并发安全: 多个操作在redis中实现成一个操作,即单命令操作 把多个操作写到一个lua脚本,以原子性方式执行单个lua脚本 单个节点实现分布式锁:setnx key value:当且仅当key不存在时,set成功并返回结果为1,如果key存在,什么都不做返回0 expire 阅读全文
posted @ 2025-04-16 18:18 难得 阅读(45) 评论(0) 推荐(0)
摘要: Redis扩展数据存储量: 纵向扩展:升级单个redis实例资源配置,包括增加内存容量、磁盘容量、高配置PCU。 优缺点:实施简单、直接。但是单个实例数据量大,RDB持久化时,fork子进程可能会阻塞一定时间,不考虑持久化还能接受。其次硬件容量跟成本是有限制的,不能无限扩。 横向扩展:横向增加当前R 阅读全文
posted @ 2025-04-16 18:15 难得 阅读(142) 评论(0) 推荐(0)
摘要: 当Redis做主从复制高可用方案时,如果master宕机了,Redis本身都没有实现自主进行主备切换,而Redis Sentinel是一个独立的进程,能监控多个master-slave集群,发现master宕机后能进行自动切换。 哨兵的作用: 监控节点状态 当Master节点故障时,自动提升Repl 阅读全文
posted @ 2025-04-16 18:11 难得 阅读(31) 评论(0) 推荐(0)
摘要: 单机服务的问题: Redis服务故障,可能会造成数据丢失 QPS支撑不够,利用主从集群,主从复制,实现读写分离 主从复制: 在Redis中,用户通过执行SLAVEOF命令或配置slaveof选项,让一个服务器去复制另一个服务器,被复制的服务器为master,进行复制的服务器为从slave。主节点负责 阅读全文
posted @ 2025-04-16 18:09 难得 阅读(24) 评论(0) 推荐(0)
摘要: Redis数据存储原理:Redis使用全局哈希表来保存所有键值对,实现从键到值的快速访问。哈希桶中的值是指向具体值的指针。 全局哈希表提供了快速访问的能力,通过key快速找到哈希桶位置,从而访问相应的实际键值。实际复杂度是O(1)。 RedisObject:Redis数据类型很多,不同数据类型都有些 阅读全文
posted @ 2025-04-16 18:07 难得 阅读(39) 评论(0) 推荐(0)
摘要: Redis高性能、开源的、基于KEY-VALUE的存储服务系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。 优点:执行非常快、支持丰富的数据结构、操作具有原子性、适用于多种场景使用 存储结构:String、list、map、set、sorted-set Redis执行原理 Redis 阅读全文
posted @ 2025-04-16 18:05 难得 阅读(33) 评论(0) 推荐(0)
摘要: 一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 CAP: 一致性:数据分布在不同节点,某个节点数据进行更新,其他节点都能读取到这个数据,就是强一致性 阅读全文
posted @ 2025-04-16 17:34 难得 阅读(63) 评论(0) 推荐(0)
摘要: MySQL磁盘随机读写: 执行CURD时,会从表空间中磁盘文件里读取数据,可能在随机的位置读取一个数据页到缓存,这就是磁盘随机读,性能比较差。 磁盘随机读关注IOPS和响应延迟: IOPS代表底层存储系统每秒可以执行多少次磁盘读写操作,IOPS越高,数据库并发能力越强。 磁盘读写操作的响应延迟对数据 阅读全文
posted @ 2025-04-16 17:28 难得 阅读(27) 评论(0) 推荐(0)
摘要: 复制方式: 基于语句的复制(逻辑复制)、基于行的复制。两种方式都是通过在主库上记录二进制日志、在备库重放日志的方式来实现异步的数据复制。 两种复制方式意味着,在同一时间点备库上的数据可能与主库存在不一致,并且无法保证主备之间的延迟。 复制带来的开销:复制不会增加主库的开销,主要是启用二进制日志的开销 阅读全文
posted @ 2025-04-16 17:26 难得 阅读(57) 评论(0) 推荐(0)
摘要: 索引是数据库中帮助快速查询数据的一种数据结构,它将数据表中的数据放在索引文件中,以便于快速查询。索引存在磁盘中,会占据物理空间,因此不恰当的索引会影响性能。MySQL索引存储在存储引擎层。 为什么要使用索引: 大大减少存储引擎需要扫描的数据量:索引的大小通常远小于数据的大小,以InnoDB为例,引擎 阅读全文
posted @ 2025-04-16 17:24 难得 阅读(14) 评论(0) 推荐(0)
摘要: 锁的意义: 用来解决并发事务的访问问题,事务并发执行时可能带来的各种问题,最大的一个难点是:一方面要最大程度地利用数据库的并发访问,另外一方面还要确保每个用户能以一致的方式读取和修改数据,尤其是一个事务进行读取操作,另一个同时进行改动操作的情况下。 一个事务进行读取操作,另一个进行改动操作,这种情况 阅读全文
posted @ 2025-04-16 17:21 难得 阅读(22) 评论(0) 推荐(0)
摘要: 事务是一系列的数据库操作,是数据库应用的基本单位。MySQL 事务主要用于处理操作量大,复杂度高的数据。 MySQL的ACID: 原子性:事务是一个完整的操作,不可被分割。事务操作要么都成功,要么失败回滚。 一致性:事务完成时,数据必须处于一致状态 隔离性:对数据进行修改的所有并发事务是彼此隔离的 阅读全文
posted @ 2025-04-16 17:20 难得 阅读(15) 评论(0) 推荐(0)
摘要: Buffer Pool: 数据库内存组件,缓存了磁盘上的真实数据,系统对数据库执行的增删改操作,主要就是对这个内存数据结构中的缓存数据执行的。然后数据库中有定时的IO线程,将该内存中的数据刷导磁盘,减少了磁盘IO的次数。 Buffer Pool本质是一片内存数据结构,默认是128M,实际生产时通过i 阅读全文
posted @ 2025-04-16 17:18 难得 阅读(342) 评论(0) 推荐(0)
摘要: MySQL基础架构示意图: 主体可分为:Server层和存储引擎。Server层包括连接器、查询缓存、分析器、优化器、执行器等。所有跨存储引擎的功能都在这一层实现。存储引擎层负责数据的存储和提取,插件式架构。 应用与MySQL服务器大致交互过程: 连接器: 负责跟客户端建立连接,获取权限,维持和管理 阅读全文
posted @ 2025-04-16 17:14 难得 阅读(24) 评论(0) 推荐(0)
摘要: YGC风险和调优:一般的应用服务器的配置是2C4G或4C8G,E区内存分配在1G左右,正常的YGC耗时最多几十毫秒,然后E区增速不快,YGC频率不高,用户使用时是无感知的。 风险: 机器升级:很多系统在流量大后,低配置机器无法满足性能要求。会升级到大机器,类似于数据计算的系统对于内存要求高,如32C 阅读全文
posted @ 2025-04-16 17:10 难得 阅读(73) 评论(0) 推荐(0)
摘要: 在Java堆内存创建的对象都是占用内存资源的,而且内存资源有限,当对象实例不需要使用时,JVM通过垃圾回收机制回收实例对象。GC回收前需要判断对象是否死去,通过引用计数法或可达性分析法。 引用计数法:每个对象都存在一个引用计数器,被引用就加1,引用失效就减1,任何时候为0代表对象不可能再被使用。此算 阅读全文
posted @ 2025-04-16 17:08 难得 阅读(41) 评论(0) 推荐(0)
摘要: JVM组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池、直接内存 程序计数器:Java代码被翻译成字节码对应各种字节码指令,当JVM的字节码引擎去执行代码指令时,程序技术器被用来记录当前执行的字节码指令的地址,字节码指示器通过改变计数器的值来选取下一条需要执行的字节码 阅读全文
posted @ 2025-04-16 17:03 难得 阅读(13) 评论(0) 推荐(0)
摘要: 类的生命周期: 加载、连接(验证、准备、解析)、初始化、使用、卸载。解析阶段不一定按顺序,它可以在初始化阶段后开始。 类加载的过程: 加载:根据查找路径找到相应的class文件然后导入 验证:检查加载的class文件的正确性 准备:给类中的静态变量分配内存空间 解析:虚拟机常量池内的符号引用替换为直 阅读全文
posted @ 2025-04-16 17:01 难得 阅读(9) 评论(0) 推荐(0)