自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(202)
  • 收藏
  • 关注

原创 MySQL 主从配置

在主从复制中,一般有一个主数据库(Master)和一个或多个从数据库(Slave),主数据库负责接收和处理写操作,从数据库复制主数据库的日志文件,将写操作在自身的数据库重演,从而实现数据的同步。

2024-04-05 17:57:16 476

原创 MySQL 索引失效场景总结

如果对 a、b、c 建立联合索引,那么首先根据 a 字段排序,如果 a 字段值相同,再根据 b 字段排序,如果 b 字段值也相同,再根据 c 字段排序。因此,使用联合索引必须按照从左到右,也就是字段排序的顺序,只有先用了 a,才能接着使用 b,使用了 b 才能接着使用 c。联合索引遵从最左匹配原则,所谓最左匹配原则,就是如果 SQL 语句用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配。如果希望以 % 开头仍使用索引,则需要使用覆盖索引,即只查询带索引字段的列。

2024-03-31 12:35:24 377

原创 SpringBoot 常用注解总结

作用在类上,继承了 @Component,因此也能被 SpringBoot 扫描并处理,提供对 Controller 类的拦截功能,配合 @ExceptionHandler、@InitBinder、@ModelAttribute 等注解可实现全局异常处理,全局参数绑定,请求参数预处理等功能。映射 web 请求,可以注解在类和方法上,@GetMapping 和 @PostMapping 是 @RequestMapping 的两种特例,一个处理 get 请求,一个处理 post 请求。

2024-03-27 11:02:10 962

原创 面试官:说一说 Spring 与 SpringBoot 的区别?

Spring 为开发 Java 应用程序提供了全面的基础架构支持,它将 Java 对象交由容器统一管理,从而实现控制反转(IOC)和依赖注入(DI),并提供了一些常用模块如 SpringAOP、SpringJDBC、SpringMVC 等等SpringBoot 继承了 Spring 的核心思想,并进一步简化应用开发。

2024-03-25 16:15:46 239

原创 Java HashMap 详解

HashMap 由数组和链表实现对数据的存储,HashMap 里面实现一个静态内部类 Entry,包含 Key、Value 和对 key 的 hashcode 值进行 hash 运算后得到的 Hash 值,它还具有 Next 指针,可以连接下一个 Entry 实体,以此来解决 Hash 冲突的问题。因为 1.7 扩容时,元素会被重新移动到新的数组,而使用头插法会使链表发生反转,比如原本是 A-B-C 的链表,扩容之后就变成 C-B-A 了,在多线程环境下,会导致链表成环的问题。先判断是否需要扩容,再插入。

2024-02-29 14:56:34 448

原创 RabbitMQ 学习笔记

具体操作可以通过路由键来实现:创建三个队列,每个队列都对应不同的路由键,每个消息可以根据 id 设置不同的路由键(例如用 id 对路由键的数量取模),消费者通过绑定指定的队列和路由键来接收消息,这样每个消费者只会接收到其关注的特定路由键的消息,从而实现了消息的分区。消费者监听死信队列,实现再次消费。拉模式下,生产者发布消息到队列时,不会立即发送消息给消费者,而是等待消费者请求消息后才发送,优点:消费端可以按照自己的处理速度来消费,缺点:消息传递存在延迟,当处理速度小于发布速度时,容易造成消息堆积在队列。

2024-02-27 16:47:22 871

原创 分布式事务详解

随着互联网的发展,软件系统由原来的单体应用转变为分布式应用。分布式系统把一个单体应用拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作。这种分布式系统下不同服务之间通过远程协作完成的事务称之为分布式事务,例如用户注册送积分事务、创建订单减库存事务,银行转账事务等都是分布式事务举个例子,使用传统本地事务完成转账逻辑,任一步骤出问题都会回滚// 1.本地数据库操作:张三减少金额// 2.本地数据库操作:李四增加金额但在分布式系统下,就变成这样。

2024-02-13 22:37:54 858

原创 接口幂等性详解

所谓接口幂等性就是:在特定场景下,同一条件的多次接口调用,保证操作只执行一次,如果接口没有保证幂等性,在以下场景就会产生问题前端重复提交:用户进行注册、创建个人信息等操作,由于网络抖动导致页面没有及时响应,用户认为没有成功而多次点击提交按钮,发生重复提交表单请求接口超时重试:提供外部系统调用的接口,因为网络抖动等原因执行成功但没能及时响应,外部系统发起重试,导致重复调用。

2024-02-10 14:45:17 367

转载 MySQL MVCC 详解

MVCC 全称 Mutil-Version Concurrency Control,多版本并发控制,是一种并发控制方法,旨在减少读写操作的冲突我们知道,当有多个事务同时操作数据库的相同数据时,会出现并发问题,例如,读 + 写事务并发可能会导致脏读、幻读和不可重复读等问题,写+写事务并发可能会导致数据覆写等问题为了解决读 + 写事务并发可能导致的问题,MySQL 的 innodb 引擎实现了 MVCC,做到不用加锁也可以实现安全的非阻塞的并发读 + 写,而对于写 + 写事务并发则只能通过加锁解决。

2024-01-31 16:38:14 50

原创 死锁面试题详解

死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种相互等待的现象,如果没有外力干涉,这些进程将永远无法继续执行死锁通常发生在多个进程试图同时访问同一资源而无法获取的情况下,例如,进程 A 需要访问资源 C,进程 B 需要访问资源 D,如果进程 A 获取了资源 C 的锁,进程 B 也获取资源 D 的锁,而进程 A 需要获取资源 D 的锁才能继续执行,进程 B 也需要获取资源 C 的锁才能继续执行,那么进程 A 和进程 B 就会陷入相互等待的状态,导致系统无法继续正常工作。

2024-01-23 16:19:49 483

原创 如何设计一个高并发系统?

所谓高并发系统,是指能同时处理大量并发请求,并及时响应,从而保证系统的高性能和高可用那么我们在设计一个高并发系统时,应该考虑哪些方面呢?

2024-01-15 16:36:05 403

原创 Redis 性能优化

服务间存在网络延迟Redis 服务本身存在问题如果是第一种情况,那么所有服务都会发生网络延迟,只需要联系运维处理即可,这里主要讨论第二种情况。

2024-01-10 16:53:07 908

原创 Redis 数据一致性

当我们在使用缓存时,如果发生数据变更,那么你需要同时操作缓存和数据库,而它们两个又分属不同的系统,因此无法做到同时操作成功或失败,因此在并发读写下很可能出现缓存与数据库数据不一致的情况理论上可以通过分布式事务保证同时操作成功或失败,但这会影响系统性能,一般很少使用。虽然没办法做到缓存和数据库强一致,但我们可以让他们的数据尽可能在绝大部分时间内保持一致,并保证最终是一致的。

2024-01-03 15:16:56 622

原创 ThreadLocal 本地线程变量详解

ThreadLocal 意为本地线程变量,即该变量只属于当前线程,对其他线程隔离我们知道,一个普通变量如果被多线程访问会存在存在线程安全问题,这时我们可以使用 Synchronize 来保证该变量某一时刻只能有一个线程访问,从而解决并发安全问题但如果这个变量并不需要被共享,那么就可以使用 ThreadLocal 为每个线程提供一个完全独立的变量副本,每个线程只操作自身拥有的副本,彼此互不干扰。

2023-12-12 11:32:28 956

原创 MySQL Select 语句执行顺序

如果指定了OUTER JOIN(如 LEFT JOIN、RIGHT JOIN),将上一步没有匹配的行添加到 VT-2,生成 VT-3。在这一步,无论后面跟那种联接运算(LEFT JOIN、RIGHT JOIN等),都首先执行交叉联接(CROSS JOIN),计算笛卡尔积,生成虚拟表 VT-1。按照指定的列名对 VT-4 的行进行分组,生成VT-5,最后每个分组只有一行。根据 ON 的筛选条件对 VT-1 进行筛选,生成 VT-2。使用聚合函数对 VT-5 的分组进行筛选,生成 VT-6。

2023-11-20 17:02:03 229

原创 Java 四种引用类型(强引用、软引用、弱引用、虚引用)

/ person 就是指向 Person 实例“张三”的引用Person person = new Person("张三");在 JDK1.2 以前,Java 里的引用是很传统的定义:如果 reference 类型的数据中存储的数值代表的是另外一块内存的起始地址,就称该 reference 数据是代表某块内存、某个对象的引用。

2023-11-15 15:15:47 144

原创 服务链路追踪 —— SpringCloud Sleuth

随着业务的发展,系统规模变得越来越大,微服务拆分越来越细,各微服务间的调用关系也越来越复杂。客户端请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,几平每一个请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求最后的失败。

2023-10-08 12:27:06 128

原创 分布式事务 —— SpringCloud Alibaba Seata

传统的单体应用中,业务操作使用同一条连接操作不同的数据表,一旦出现异常就可以整体回滚。随着公司的快速发展、业务需求的变化,单体应用被拆分成微服务应用,原来的单体应用被拆分成多个独立的微服务,分别使用独立的数据源,业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题无法保证。在微服务架构中,一次业务请求需要操作多个数据源或需要进行远程调用,就会产生分布式事务问题。

2023-10-06 09:42:58 139

原创 消息总线 —— SpringCloud Bus

Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,支持 RabbitMQ 和 Kafka 两种消息中间件。所谓消息总线,简单理解就是一个消息中心,众多微服务实例都可以连接到总线上,实例可以往消息中心发送或接收信息,例如:实例 A 发送一条消息到总线上,总线上的实例 B 可以接收到信息(实例 B 订阅了实例 A),消息总线充当一个中间者的角色,使得实例 A 和实例 B 解耦。

2023-10-04 12:15:25 225

原创 消息驱动 —— SpringCloud Stream

Spring Cloud Stream 是用于构建消息驱动的微服务应用程序的框架,提供了多种中间件的合理配置Destination Binders:目标绑定器,目标指的是 Kafka 或者 RabbitMQ,绑定器就是封装了目标中间件的包,如果操作的是 Kafka,就使用 Kafka Binder,如果操作的是 RabbitMQ,就使用 RabbitMO BinderBindings:外部消息传递系统和应用程序之间的桥梁,提供消息的“生产者”和“消费者”(由目标绑定器创建)

2023-10-02 20:11:46 1034

原创 熔断、限流、降级 —— SpringCloud Alibaba Sentinel

Sentinel 是阿里中间件团队开源的,面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性Sentinel 用来实现微服务系统中服务熔断、降级等功能Sentinel Dashboard 用来监控微服务系统中流量调用等情况。

2023-10-01 16:24:13 1467

原创 声明式调用 —— SpringCloud OpenFeign

Spring Cloud Feign 是一个 HTTP 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 HTTP 请求,而不用通过封装 HTTP 请求报文的方式直接调用Feign 通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求。

2023-09-30 14:43:33 211

原创 负载均衡 —— SpringCloud Netflix Ribbon

Ribbon 是 Netfix 客户端的负载均衡器,可对 HTTP 和 TCP 客户端的行为进行控制。为 Ribbon 配置服务提供者地址后,Ribbon 就可以基于某种负载均衡算法自动帮助服务消费者去请求。Ribbon 默认提供了很多负载均衡算法,例如轮询、随机等,也可以为 Ribbon 实现自定义的负载均衡算法Rule:该组件主要决定从候选服务器中返回哪个服务器地址进行远程调用的操作Ping:在后台运行的组件,用来确认哪些服务器是存活可用的。

2023-09-23 21:58:22 400

原创 微服务网关 —— SpringCloud Gateway

Spring Cloud Gateway 基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术,是在 Spring 生态系统之上构建的 API 网关服务,Gateway 旨在提供一种简单而有效的方式来对 API 进行路由以及提供一些强大的过滤器功能,例如熔断、限流、重试等基于 Spring Framework 5、Project Reactor 以及 Spring Boot 2.0 进行构建能够匹配任何请求属性。

2023-09-02 17:57:37 737

原创 微服务网关 —— SpringCloud Netflix Zuul

鉴权:对于访问每个服务的请求进行鉴权,拒绝鉴权失败的请求监控:对系统的请求进行监控,记录请求响应日志,实时统计当前系统的访问量以及监控状态压力测试:帮助对集群进行可控的压力测试灰度测试:灰度发布可以保证整体系统的稳定,在初始灰度时就可以发现问题并进行调整动态路由:基于请求路径,将请求分发到指定的客户端负载控制:统一控制客户端请求压力,超过压力的请求直接拒绝静态响应处理:在边缘位置直接建立部分响应,避免其流入内部集群。

2023-08-27 10:22:53 576

原创 注册中心/配置管理 —— SpringCloud Consul

Consul 是一个可以提供服务发现,健康检查,多数据中心,key/Value 存储的分布式服务框架,用于实现分布式系统的发现与配置。Cousul 使用 Go 语言实现,因此天然具有可移植性,安装包仅包含一个可执行文件,直接启动即可运行,方便部署。

2023-08-19 11:43:56 1215

原创 注册中心 —— SpringCloud Netflix Eureka

Eureka 是一个基于 REST 的服务发现组件,SpringCloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 SpringCloud 的服务注册与发现,同时提供了负载均衡、故障转移等能力,目前 Eureka2.0 已经不再维护,故不推荐使用Eureka Server:服务注册中心组件,提供了服务的注册与发现的接口。

2023-08-13 12:15:08 845

原创 注册中心/配置管理 —— SpringCloud Alibaba Nacos

Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生的应用程序服务发现和服务健康监测:服务提供者使用原生 SDK、OpenAPI 等注册服务后,服务消费者可以使用 HTTP&API 查找和发现服务。Nacos 提供对服务的实时健康检查,阻止向不健康的主机或服务实例发送请求动态配置服务:动态配置服务可以让你以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

2023-08-06 17:02:57 289

原创 Java 网络编程 —— 安全网络通信

SSL(Secure Socket Layer,安全套接字层)是一种保证网络上的两个节点进行安全通信的协议。IETF(Interet Engineering Task Force)国际组织对 SSL 作了标准化,制定了 RFC2246 规范,并将其称为传输层安全(Transport Layer Security,TLS)SSL 和 TLS 都建立在 TCP/IP 的基础上,一些应用层协议,如 HTTP 和 IMAP,都可以采用 SSL 来保证安全通信。

2023-06-26 23:54:08 1323

原创 Java 网络编程 —— RMI 框架

RMI 是 Java 提供的一个完善的简单易用的远程方法调用框架,采用客户/服务器通信方式,在服务器上部署了提供各种服务的远程对象,客户端请求访问服务器上远程对象的方法,它要求客户端与服务器端都是 Java 程序RMI 框架采用代理来负责客户与远程对象之间通过 Socket 进行通信的细节。RMI 框架为远程对象分别生成了客户端代理和服务器端代理。位于客户端的代理必被称为存根(Stub),位于服务器端的代理类被称为骨架(Skeleton)

2023-06-15 16:52:06 1248

原创 Java 网络编程 —— 基于 UDP 的数据报和套接字

UDP(User Datagram Protocol,用户数据报协议)是传输层的另一种协议,比 TCP 具有更快的传输速度,但是不可靠。

2023-06-11 17:00:28 634

原创 Java 网络编程 —— 客户端协议处理框架

URL 类:统一资源定位符,表示客户程序要访问的远程资源URLConnection 类:表示客户程序与远程服务器的连接,客户程序可以从 URLConnection 获得数据输入流和输出流URLStreamHandler 类:协议处理器,主要负责创建与协议相关的 URLConnection 对象ContentHandler 类:内容处理器,负责解析服务器发送的数据,把它转换为相应的 Java 对象。

2023-06-03 00:06:23 367

原创 Java 网络编程 —— 创建非阻塞的 HTTP 服务器

HTTP 客户程序必须先发出一个 HTTP 请求,然后才能接收到来自 HTTP 服器的响应,浏览器就是最常见的 HTTP 客户程序。HTTP 客户程序和 HTTP 服务器分别由不同的软件开发商提供,它们都可以用任意的编程语言编写。HTTP 严格规定了 HTTP 请求和 HTTP 响应的数据格式,只要 HTTP 服务器与客户程序都遵守 HTTP,就能彼此看得懂对方发送的消息。

2023-05-28 15:02:06 1349

原创 Java 网络编程 —— 异步通道和异步运算结果

下例的代码演示了异步通道的用法,它不断接收用户输入的域名并尝试建立连接,最后打印建立连接所花费的时间。如果程序无法连接到指定的主机,就打印相关错误信息。如果用户输入 bye,就结束程序。相似,区别在于异步通道的一些方法总是采用非阻塞模式,并且它们的非阻塞方法会立即返回一个。从 JDK7 开始,引入了表示异步通道的。对象,用来存放方法的异步运算结果。类,这两个类的作用与。

2023-05-21 12:34:30 479

原创 Java 网络编程 —— 实现非阻塞式的客户端

同步通信指甲方向乙方发送了一批数据后,必须等接收到了乙方的响应数据后,再发送下一批数据。同步通信要求一个 IO 操作完成之后,才能完成下一个 IO 操作,用阻塞模式更容易实现。异步通信指发送数据和接收数据的操作互不干扰,各自独立进行。异步通信允许发送数据和接收数据的操作各自独立进行,用非阻塞模式更容易实现。值得注意的是,通信的两端并不要求都采用同样的通信方式,当一方采用同步通信时,另一方可以采用异步通信。对于客户与服务器之间的通信,按照它们收发数据的协调程度来区分,可分为同步通信和异步通信。

2023-05-20 23:03:40 409

原创 Java 网络编程 —— 实现非阻塞式的服务器

负责接收数据和发送数据的线程按照非阻塞模式工作,只有在读就绪或写就绪事件发生时,才执行相应的接收数据和发送数据操作。假如有许多客户请求连接,可以把接收客户连接的操作单独由一个线程完成,把接收数据和发送数据的操作由另一个线程完成,这可以提高服务器的并发性能。Accept 线程无法向 Selector 注册事件,而主线程没有任何事件可以监控,所以这两个线程将永远阻塞下去。都被设置为非阻塞模式,这使得接收连接、接收数据和发送数据的操作都采用非阻塞模式,注册了事件,并且该事件发生后,主线程才会从。

2023-05-20 11:37:26 918

原创 Java 网络编程 —— 非阻塞式编程

在生活中,最常见的阻塞现象是公路上汽车的堵塞。汽车在公路上快速行驶,如果前方交通受阻,就只好停下来等待,等到公路顺畅,才能恢复行驶。线程在运行中也会因为某些原因而阻塞。所有处于阻塞状态的线程的共同特征:放弃 CPU,暂停运行,只有等到导致阻塞的原因消除,才能恢复运行,或者被其他线程中断该线程会退出阻塞状态,并且抛出 InterruptedException线程执行了方法,线程放弃 CPU,睡眠 n ms,然后恢复运行。

2023-05-14 16:24:36 893 1

原创 Java 网络编程 —— 创建多线程服务器

服务端接收到一个客户连接,就与客户进行通信,通信完毕后断开连接,然后接收下一个客户连接,假如同时有多个客户连接请求这些客户就必须排队等候。如果长时间让客户等待,就会使网站失去信誉,从而降低访问量。

2023-05-03 16:04:42 622

原创 Java 网络编程 —— ServerSocket 详解

当队列中的连接请求达到了队列的最大长度时,服务器进程所在的主机会拒绝新的连接请求,只有当服务器进程通过 ServerSocket 的。除了第 1 个不带参数的构造方法,其他构造方法都会使服务器与特定端口绑定,由参数 port 指定,无法绑定则抛出 IOException,一般是因为端口已经被其他服务占用,或者没有足够的权限去绑定。参数 port 指定服务器要绑定的端口(即服务器要监听的端口),参数 backlog 指定客户连接请求队列的长度,参数 bindAddr 指定服务器要绑定的 IP 地址。

2023-05-02 15:04:28 3379

原创 Java 网络编程 —— Socket 详解

摘自《Java 网络编程核心技术详解》

2023-04-30 15:12:26 4404

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除