服务保护和分布式事务
雪崩问题原因分析微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩产生原因: 微服务相互调用,服务提供者出现故障或阻塞 服务调用者没有做好异常处理,导致自身故障 调用链中的所有服务级联失败,导致整个集群故障 解决思路: 尽量避免服务出现故障或者阻塞。 √ 保证代码的健壮性; √ 保证网络通畅; √ 能应对较高的并发请求; 服务调用者做好远程调用异常的后备方案,避免故障扩散 服务保护方案 请求限流:限制访问微服务的请求的并发量,避免服务因流量激增出现故障 线程隔离:也叫做舱壁模式,模拟船舱隔板的防水原理。通过限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散 服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求 失败处理: 定义fallback逻辑,让业务失败时不再抛出异常,而是返回默认数据或友好提示常见的服务保护技术有:Sentinel和Hystrix,毫无疑问这里主要讲述Sentinel Sentinel官方网址->home | Sentinel 微服务整合 引入sentine...
微服务随手记
拆分原则什么时候做拆分 创业型项目:先采用单体架构,快速开发,快速试错。随着规模扩大,逐渐拆分 确定的大型项目:资金充足,目标明确,可以直接选择微服务架构,避免后续拆分的麻烦 怎么拆分 从拆分目标来说: 高内聚:每个微服务的职责要尽量单一,包含的业务相互关联程度高、完整度高 低耦合:每个微服务的功能要相对独立,尽量减少对其他微服务的依赖 从拆分方式来说: 纵向拆分:按照业务模块拆分 横向拆分:抽取公共服务,提高复用性 服务治理RestTemplatespring中自带的http请求封装,利用它可以向服务提供者发起http请求获取想要的数据 注册中心原理 服务提供者去注册中心注册服务信息,并通过心跳续约保证连接 服务调用者去注册中心订阅所需服务,通过负载均衡算法选择所需提供者远程调用,当服务提供者变化时,提供推送变更 负载均衡算法主要有以下集中:随机、轮询、加权轮询、哈希 Nacos注册中心(Nacos 快速开始 | Nacos 官网)部署(docker) 准备数据库表,用来存储Nacos的数据 配置nacos的custom.env:选数据库,写地址端口、账号...
MySQL性能优化
注意,在阅读本篇文章之前,建议看完了MySQL-SQL语法了解参考文章: https://javaguide.cn/database/mysql/mysql-questions-01.html 概述 抓住核心:慢 SQL 定位与分析性能优化的第一步永远是找到瓶颈。面试时,建议先从 慢 SQL 定位和分析 入手,这不仅能展示你解决问题的思路,还能体现你对数据库性能监控的熟练掌握: 监控工具: 介绍常用的慢 SQL 监控工具,如 MySQL 慢查询日志、Performance Schema 等,说明你对这些工具的熟悉程度以及如何通过它们定位问题。 EXPLAIN 命令: 详细说明 EXPLAIN 命令的使用,分析查询计划、索引使用情况,可以结合实际案例展示如何解读分析结果,比如执行顺序、索引使用情况、全表扫描等。 由点及面:索引、表结构和 SQL 优化定位到慢 SQL 后,接下来就要针对具体问题进行优化。 这里可以重点介绍索引、表结构和 SQL 编写规范等方面的优化技巧: 索引优化: 这是 MySQL 性能优化的重点,可以介绍索引的创建原则、覆盖索引、最左前缀匹配原则...
JVM垃圾回收
内容参考JVM垃圾回收详解(重点) 前言无特殊说明,本文针对的是HotSpot虚拟机(JVM的一种具体实现形式,也是现在的主流) 堆空间的基本结构堆内存被通常分为下面三部分: 新生代内存(Young Generation) 老生代(Old Generation) 永久代(Permanent Generation) JDK 8 版本之后 PermGen(永久) 已被 Metaspace(元空间) 取代,元空间使用的是直接内存 。 下图所示的 Eden 区、两个 Survivor 区 S0 和 S1 都属于新生代,中间一层属于老年代,最下面一层属于永久代。 内存分配与回收原则内存分配 大多数情况下,对象在新生代中Eden区分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC 大对象直接进入老年代:大对象就是需要大量连续内存空间的对象(比如:字符串、数组) G1垃圾回收器会根据-XX:G1HeapRegionSize参数设置的堆区域大小和-XX:G1MixedGCLiveThresholdPercent参数设置的阈值,来决定哪些对象会直接进入老年代。 ...
Docker使用
视频参考:https://www.bilibili.com/video/BV1THKyzBER6/文章参考:https://www.runoob.com/docker/docker-tutorial.html Docker的核心概念Docker就是用容器化技术给应用程序封装独立的运行环境,而每一个运行环境就是一个容器 优点: 更轻,更小,启动快:Docker容器之间共用同一个系统内核,区别于虚拟机每一个系统都包含一个自己的操作系统的完整内核 核心概念: 宿主机:运行容器的计算机被称为宿主机 镜像:镜像就是软件安装包,而容器就是安装出来的软件 镜像仓库(Docker Registry):就是用来存放分享的镜像的地方,分享上来的镜像其他人就可以下载使用Docker的官方仓库:Docker Hub 安装DockerUbuntu下安装docker 第一步: 1curl -fsSL https://get.docker.com -o install-docker.sh 第二步: 1sudo sh install-docker.sh Windows下安装docker 搜索Wi...
多级缓存
参考视频非原创!!! 介绍多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能: JVM进程缓存本地进程缓存 缓存在日常开发中起着至关重要的作用,由于是储存在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。 我们把缓存分为两类: 分布式缓存,例如Redis: 优点:储存容量更大、可靠性更好、可以在集群间共享 缺点:访问缓存有网络开销 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享 进程本地缓存,例如HashMap、GuavaCache: 优点:读取本地内存,没有网络开销,速度更快 缺点:储存容量有限、可靠性较低、无法共享 场景:性能要求较高,缓存数据量较小 了解CaffeineCaffeine是基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。GitHub仓库:caffeine-可以在wiki界面中查阅官方文档缓存使用的基本API: 12345678910111213141516171819202122@Testvoid testBasicOps() { //...
设计模式
参考文章23种设计模式(Java版,超详细!),菜鸟教程-设计模式 设计模式介绍设计模式的优点 提供了一种共享的设计词汇和概念,使开发人员能够更好地沟通和理解彼此的设计意图。 提供了经过验证的解决方案,可以提高软件的可维护性、可复用性和灵活性。 促进了代码的重用,避免了重复的设计和实现。 通过遵循设计模式,可以减少系统中的错误和问题,提高代码质量。 设计模式六大原则 开闭原则(Open Close Principle): 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 里氏代换原则(Liskov Substitution Principle): 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上...
Redission
参考Redisson-分布式锁 问题分析在集群模式下或者分布式的系统下,存在多个JVM,不同JVM之间用的是不同的锁监视器,也就意味着可能产生并行而锁不生效的问题,也就导致了线程并发安全问题,为此就需要一种锁监视器,可以让不同的JVM之间使用,也就需要分布式锁 基本原理 什么是分布式锁:满足分布式系统或者集群模式下多进程可见并互斥的锁 特点: 多进程可见 互斥 高可用 高性能(高并发) 安全性 分布式锁的实现(常见) redis常见的实现之一就是通过Redisson Redisson快速开始 引入依赖: 12345<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.2</version></dependency> 配置Redission客户端: 123456789101112@Configurationpublic...
强、软、弱、虚引用
参考文章强、软、弱、虚引用的区别和使用文章的引用介绍也是由强到弱 强引用(StrongReference) 强引用在 java.lang.ref 中并没有实际的对应类型,但我们程序中几乎所有的引用使用的都是强引用。 强引用有如下特点: 强引用可以直接访问目标对象 强引用(存在)指向的对象任何时候都不会被回收,JVM宁愿抛出OOM异常,也不会回收。 强引用可能会导致内存泄漏 注意: 为了尽量避免内存不足的情况,我们可以在变量使用后通过显示的将变量置为null,来加速对象的回收。 区分: 内存溢出(out of memory) 是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory. 内存泄漏(memory leak) 是指 程序申请内存后,无法释放已申请的内存空间,这样的泄漏积少成多,memory leak 会导致 out of memory . 软引用(SoftReference)软引用对应的类为java.lang.ref.SoftReference, 一个软引用中的对象,不会很快被JVM回收,JVM会根据当前堆的使用情况来判断何时回收,当...
缓存问题
视频参考黑马的Redis教程 缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库 如果放任这种请求不断访问,就很容易搞垮数据库T_T,于是有了两种常见的解决方案 缓存空对象 思路:缓存空对象到Redis中,这样下次再请求就不会到达数据库 优点: 实现简单,维护方便 缺点: 额外的内存消耗 可能造成短期的不一致 常见的解决办法就是为null设置TTL(有效时间),避免存太多了null垃圾 业务中实现流程: 在数据库查询为空的时候向Redis添加空值,并设置TTL 向Redis请求时对空值做判断 布隆过滤 思路:在客户端与Redis之间再加入一层布隆过滤器,如果不存在数据,直接拒绝请求返回,有才继续 布隆过滤器:基于某种哈希算法去计算出数据对应的hash值,再转换为二进制保存到布隆过滤器中 所以布隆过滤器可以看作一个二进制的数组,而布隆过滤实际是一种算法 优点: 内存占用较少,没有多余的key 缺点: 实现复杂 存在误判的可能 这里可以看出布隆过滤器借助了哈希,也就意味着不存在时真不存在,但布...
MobaXterm连接教程
前言使用的版本是Ubuntu22.04,目前只在连接虚拟机尝试成功过,如有问题欢迎指正 前置条件 安装好MobaXterm官网下载 在Ubuntu中安装好ssh服务 1sudo apt install openssh-server 通过hostname -I可以获取到自己的ip地址 开始连接 打开MobaXterm的左上角的Session 选择SSH连接 在Remote host上填写你上面获得的ip地址 在Spercify username勾选,然后写上你Ubuntu的用户名 点击OK,输入密码就可以成功连接了 这里端口默认就行,除非被占用
乐观锁、悲观锁
相关文章参考: 面试官灵魂4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点? 乐观锁和悲观锁详解 概念乐观锁乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。 乐观锁本身不会上锁。但是可以与加锁操作合作实现一些业务需求 悲观锁悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。 实现悲观锁的实现像 Java 中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 12345678910111213public void performSynchronisedTask() { synchronized (this) { // 需要同步的操作 }}private Lock lock = new R...












