经验专题-多租户-1、系统设计
1.web部分修改: a.在用户登录时,在线程变量(ThreadLocal)中记录租户的id b.修改 jdbc的实现 :在提交sql时,从ThreadLocal中获取租户id, 添加sql 注释,把租户的schema 放到 注释中。例如:/*!mycat : schema = test_01 */ sql ; 2.在db前面建立proxy层,代理所有web过来的数据库请求。proxy层是用mycat实现的,web提交的sql过来时在注释中指定schema, proxy层根据指定的schema 转发sql请求。 实战经验参考与感谢
经验专题-超时时间-1、超时问题汇总
1. RestTemplateHttpClient 内部有三个超时时间设置:连接池获取可用连接超时,连接超时,读取数据超时: 1.1. ConnectionRequestTimeout从连接池中获取可用连接超时时间,设置从 connect Manager 获取 Connection 超时时间,单位毫秒 HttpClient 中的要用连接时尝试从连接池中获取,若是在等待了一定的时间后还没有获取到可用连接(比如连接池中没有空闲连接了)则会抛出获取连接超时异常。 1.2. connectionTimeout连接目标超时 connectionTimeout,单位毫秒。 指的是连接目标 url 的连接超时时间,即客服端发送请求到与目标 url 建立起连接的最大时间。如果在该时间范围内还没有建立起连接,则就抛出 connectionTimeOut 异常。 如测试的时候,将 url 改为一个不存在的 url:“http://test.com” ,超时时间 3000ms 过后,系统报出异常: org.apache.commons.httpclient.ConnectTimeoutExceptio ...
分布式专题-缓存-Redis-7、缓存一致性
1. 缓存更新策略 低一致性需求,使用内存淘汰机制: 缓存-Redis-2、过期删除与淘汰策略 2. 缓存一致性方案%%▶18.🏡⭐️◼️【🌈费曼无敌🌈⭐️♨️⭐️】◼️⭐️-point-20230315-2202%%❕ ^m4wce9 2.1. 删除缓存还是更新缓存 2.2. 先更新 DB 还是先删缓存 2.3. 如何保证操作 DB 和删除缓存的原子性2.4. 总结 - 先更新数据库再删除缓存⭐️🔴 3. 实战经验 4. 参考与感谢4.1. 黑马4.1.1. 视频https://www.bilibili.com/video/BV1cr4y1671t?t=138.2&p=38 缓存-Redis-1、基本原理 尚学堂https://www.bilibili.com/video/BV1JP411m7W2?t=1126.3&p=84
性能调优专题-基础-0、JVM架构
1. 是什么1.1. 虚拟机所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的 Visual Box,Mware 就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。 程序虚拟机的典型代表就是 Java 虚拟机,它专门为执行单个计算机程序而设计,在 Java 虚拟机中执行的指令我们称为 Java 字节码指令。 1.2. Java 虚拟机Java 虚拟机是一台执行 Java 字节码的虚拟计算机,它拥有独立的运行机制,其运行的 Java 字节码也未必由 Java 语言编译而成。 1.2.1. 作用Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条 Java 指令,Java 虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。 1.2.2. 特点 一次编译,到处运行 自动内存管理 自动垃圾回收功能 1.2.3. 位置 JVM 是运行 ...
面试专题-7、八股文
1. 死锁%%▶6.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230411-2139%%❕ ^mpr2re 死锁,简单来说就是两个或者两个以上的线程在执行的过程中,争夺同一个共享资源造成的相互等待的现象。 如果没有外部干预,线程会一直阻塞无法往下执行,这些一直处于相互等待资源的线程就称为死锁线程。 导致死锁的条件有四个,这四个条件同时满足就会产生死锁: 互斥条件,共享资源 X 和 Y 只能被一个线程占用; 请求和保持条件,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X; 不可抢占条件,其他线程不能强行抢占线程 T1 占有的资源; 循环等待条件,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。 导致死锁之后,只能通过人工干预来解决,比如重启服务,或者杀掉某个线程。所以,只能在写代码的时候,去规避可能出现的死锁问题。按照死锁发生的四个条件,只需要破坏其中的任何一个,就可以解决,但是,互斥条件是没办法破坏的,因为这是互斥锁的基本约束,其他三方条件都有办法来破坏: 对于“请求 ...
框架源码专题-JDK-1、SPI
1. 使用方法1.1. 约定Java SPI 就是这样做的,约定在 Classpath 下的 META-INF/services/ 目录里创建一个 以服务接口命名的文件,然后 **文件里面记录的是此 jar 包提供的具体实现类的全限定名**。 这样当我们引用了某个 jar 包的时候就可以去找这个 jar 包的 META-INF/services/ 目录,再根据接口名找到文件,然后读取文件里面的内容去进行实现类的加载与实例化。 1.2. 示例1.2.1. DriverManager-MySQL 比如我们看下 MySQL 是怎么做的。 再来看一下文件里面的内容。 1.2.2. SpringMVCSpring-4、SpringMVC 2. 源码原理以下源码分析基于 JDK8 2.1. Java SPI 入口-ServiceLoaderServiceLoader.load() 2.2. 运行逻辑在 ServiceLoader.load() 方法中,首先会尝试获取当前使用的 ClassLoader(获取当前线程绑定的 ClassLoader,查找 ...
分布式专题 -14、Dubbo-SPI
1. JDK-SPIJDK-1、SPI 1.1. 优点使用 Java SPI 机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。 1.2. 缺点 JDK 标准的 SPI 会一次性加载实例化扩展点的所有实现,也就是接口的实现类全部加载并实例化一遍。如果你并不想用某些实现类,它也被加载并实例化了,这就造成了浪费; 获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类; 2. DubboSPI2.1. 改进之处 SPI(Service Provider Interface) 是服务发现机制,Dubbo 没有使用 jdk SPI 而对其增强和扩展: 按需加载,Dubbo SPI 配置文件采用 KV 格式存储,key 被称为扩展名,当我们在为一个接口查找具体实现类时,可以指定扩展名来选择相应的扩展实现,只实例化这一个扩展实现即可,无须实例化 SPI 配置文件中的其他扩展实现类,避免资源浪费,此外通过 KV 格式的 SPI 配置文件,当我 ...
Netty
1. Netty 介绍Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位。 RocketMQ、ES、Dubbo、ZK Kafka 自己实现了网络模型做 RPC。底层基于 Java NIO,采用和 Netty 一样的 Reactor 线程模型。 Redis 也是自己的 IO 多路复用和事件分发器,原理类似 MQ-Kafka 1.1. IO[[IO多路复用]] 1.2. 原生 NIO 存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的 ...
框架源码专题-MySQL-7、索引原理
1. 什么是索引索引(index)是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 1.1. 索引优势劣势优势1) 类似于书籍的目录索引,提高数据检索的效率,降低数据库的 IO 成本。2) 通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 的消耗。 劣势1) 实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。2) 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行 INSERT、UPDATE、DELETE。因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。 1.2. 索引结构索引是在 MySQL 的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。MySQL 目前提供了以下 4 种索引: ...
框架源码专题-MySQL-9、SQL应用优化
1. 常用 SQL 技巧MySQL 的性能优化我认为可以分为 4 大部分 l 硬件和操作系统层面的优化 l 架构设计层面的优化 l MySQL 程序配置优化 l SQL 优化硬件及操作系统层面优化从硬件层面来说,影响 Mysql 性能的因素有,CPU、可用内存大小、磁盘读写速度、网络带宽从操作系层面来说,应用文件句柄数、操作系统网络的配置都会影响到 Mysql 性能。这部分的优化一般由 DBA 或者运维工程师去完成。在硬件基础资源的优化中,我们重点应该关注服务本身承载的体量,然后提出合理的指标要求,避免出现资源浪费! 架构设计层面的优化 MySQL 是一个磁盘 IO 访问量非常频繁的关系型数据库在高并发和高性能的场景中.MySQL 数据库必然会承受巨大的并发压力,而此时,我们的优化方式可以分为几个部分。 1. 搭建 Mysql 主从集群,单个 Mysql 服务容易单点故障,一旦服务器宕机,将会导致依赖 Mysql 数据库的应用全部无法响应。主从集群或者主主集群可以保证服务的高可用性。 2. 读写分离设计,在读多写少的场景中,通过读写分离的方案,可以避免读写冲突导致的性能影响 3. 引 ...

