- 博客(614)
- 收藏
- 关注
原创 SpringCloud Alibaba实战(8:使用OpenFeign服务调用)
Feign是一种声明式、模板化的HTTP客户端。使用Feign,可以做到声明式调用。尽管Feign目前已经不再迭代,处于维护状态,但是Feign仍然是目前使用最广泛的远程调用框架之一。在SpringCloud Alibaba的生态体系内,有另一个应用广泛的远程服务调用框架Dubbo,在后面我们会接触到。Feign是在RestTemplate 和 Ribbon的基础上进一步封装,使用RestTemplate实现Http调用,使用Ribbon实现负载均衡。接下来,我们开始学习Feign的使用,非常简单。
2025-07-15 21:52:25
647
原创 SpringCloud Alibaba实战(7:nacos注册中心管理微服务)
在微服务的体系里,注册中心是最重要的组件之一,我们来简单了解一下什么是注册中心。注册中心和DNS类似,大家想一想,我们平时访问百度,是访问 www.baidu.com ,还是直接访问ip地址呢?注册中心就承担了这样一个“名单”的角色,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。注册中心的作用就是服务的注册和服务的发现。
2025-07-15 21:52:02
792
原创 SpringCloud Alibaba实战(6:nacos-server服务搭建)
Nacos是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。Nacos英文全称Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。Nacos 无缝支持一些主流的开源生态,使用Nacos,可以简化服务发现、配置管理、服务治理及管理。
2025-07-15 21:51:18
843
原创 SpringCloud Alibaba实战(5:子模块基本业务开发)
在上一节里,我们搭建了一个微服务项目的整体架构,并进行了版本控制。接下来我们进一步来完善架构,引入SpringBoot等开发框架,来支撑具体业务的开发。
2025-07-14 21:58:55
948
原创 SpringCloud Alibaba实战(4:基本开发框架搭建)
在上一节,我们已经完成了项目的整体技术架构设计和具体的数据库设计,接下来,我们搭建整体的开发框架。开发工具选用Idea。开发工具只是为了提高效率,如果不习惯Idea的话,STS使用起来也是OK的。
2025-07-14 21:58:17
559
原创 SpringCloud Alibaba实战(3:存储设计与基础架构设计)
我们首先看一下SpringCloud 官方的一些组件,有些组件不再维护升级,有些新的组件重新承担起相应的责任。我们要做的实例的一个粗略的架构图如下,接下来,我们会围绕SpringCloud/SpringCloud Alibaba的体系来进行我们的项目实战。虽然在微服务的理论中,没有对数据库定强制性的规范,但一般,服务拆分之后,数据库也会对应的拆分。在上一章中,我们已经完成了基本业务流程的梳理和服务模块的划分,接下来,开始设计数据存储。这种结合业务来进行拆分的方式是数据库拆分中的垂直拆分。
2025-07-14 21:57:58
225
原创 SpringCloud Alibaba实战(2:电商系统业务分析)
选用了很常见的电商业务来进行SpringCloud Alibaba的实战。当然,因为仅仅是为了学习SpringCloud Alibaba,所以对业务进行了大幅度简化,这里只取一个精简版的用户下单业务。
2025-07-14 21:57:17
385
原创 SpingCloud Alibaba实战(1:微服务与SpringCloud Alibaba)
微服务可谓是这几年比较热门的技术,从2017开始逐渐爆火,逐渐大大小小的公司纷纷将微服务技术引入并在实际业务中落地。微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出:微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用HTTP API通讯。同时,服务会使用最小规模的集中管理 (例如Docker)技术,服务可以用不同的编程语言与数据库等。
2025-07-14 21:57:00
712
原创 十分钟彻底掌握缓存击穿、缓存穿透、缓存雪崩
先从缓存击穿开始。一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打在DB上。缓存击穿会增大数据库的负载,我们看看怎么缓解。缓存穿透:缓存穿透指的查询缓存和数据库中都不存在的数据,这样每次请求直接打到数据库,就好像缓存不存在一样。缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。缓存穿透可能会使后端存储负载加大,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。自身业务代码问题恶意攻击,爬虫造成空命中我们来看看如何解决。
2025-07-14 21:56:43
808
原创 Redis破障之路(四)Jedis基本使用
在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于Java编程语言的客户端。在Java语言体系下,有三个常用的Redis客户端JedisRedissonLettuce。三者各有特点,各有适用的场景。Jedis:Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
2025-07-14 21:56:27
451
原创 Redis破障之路(三)Redis单线程架构
首先要明白,Redis的单线程指的是执行命令时的单线程。Redis客户端与服务端的模型可以简化成下图,每次客户端调用都经历了发送命令、执行命令、返回结果三个过程。我们说的单线程就是在第二步执行命令,一条命令从从客户端达到服务端不会立刻被执行,而是会进入一个队列中等待,每次只会有一条指令被选中执行。发送命令、返回结果、命令排队这些就不是那么简单了,例如Redis使用了I/O多路复用技术来解决I/O的问题。
2025-07-14 21:56:04
760
原创 Redis破障之路(二)Redis安装和基本数据结构
ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。intset(整数集合):当集合中的元素都是整数且元素个数小于set-max- intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。
2025-07-14 21:55:44
813
原创 Redis破障之路(一)强大的Redis
Redis[1]是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景,而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利。
2025-07-14 21:55:23
798
原创 五分钟搞懂MySQL索引下推
索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。
2025-07-12 22:07:19
885
原创 深入学习MySQL(4)InnoDB存储结构
这一节本来计划开始索引的学习,但是在InnoDB存储引擎的索引里,存在一些数据存储结构的概念,这一节先了解一下InnodDB的逻辑存储结构,为索引的学习打好基础。从InnoDB存储引擎的存储结构看,所有数据都被逻辑地放在一个空间中,称之为表空间(tablespace)、区(extent)、页(page)组成,页在一些文档中也被称之为块(block)。
2025-07-12 22:07:04
894
原创 深入学习MySQL(2)存储引擎盘点
在前面我们了解了server层调用存储引擎层接口来完成sql的执行,使用存储引擎的好处是:每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。。MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。其中最常用的3种,InnoDB、MyISAM、Memory,MySQL5.5.8以后,默认存储引擎为InnoDB。
2025-07-12 22:06:17
524
原创 深入学习MySQL(1)MySQL逻辑架构
深入学习MySQL,从概览MySQL逻辑架构开始。首先来看一下MySQL的逻辑架构图:值得一提的是在MySQL8.0中取消了查询缓存,大概的理由是查询缓存存在严重的可伸缩性问题,并且很容易成为严重的瓶颈缓存,将缓存移动到客户端能收获更好的性能。通过一条查询语句的执行过程,来了解一些关键的部件:复制代码。
2025-07-12 22:05:16
610
原创 JVM进阶之路(十四)类加载器和类加载机制
在上一章里,我们已经学习了类加载的过程,我们知道在加载阶段需要”通过一个类的全限定名来获取描述该类的二进制字节流“,而来完成这个工作的就是类加载器(Class Loader)。
2025-07-12 22:05:00
899
原创 JVM进阶之路(十三)类加载过程
通过前面的学习,我们了解了Class文件的结构,在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。接下来,我们开始学习JVM的类加载。
2025-07-11 21:38:16
620
原创 JVM进阶之路(十二)字节码指令
接下来,我们进一步学习字节码的相关指令。首先我们来看一个简单的程序:复制代码编译运行,使用JDK自带的javap我们来找找相加指令在哪里:对于大部分与数据类型相关的字节码指令,它们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表 float,d代表double,a代表reference。
2025-07-11 21:37:39
507
原创 JVM进阶之路(十一)Class文件结构
Java虚拟机和Class文件是Java实现系统无关性的基石。Class文件是JVM实现语言无关性的基石。Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。每一个 Class 文件对应于一个如下所示的 ClassFile 结构体:复制代码简单看一下各项的含义:由于 Class 文件结构没有任何分隔符,所以无论是每个数据项的的顺序还是数量,都是严格限定的,哪个字节代表什么含义,长度多少,先后顺序如何,都是不允许改变的。接下来我们来具体学习每项的含义。
2025-07-11 21:37:04
957
原创 JVM进阶之路(十)JVM调优总结
6、为了验证自己的猜想,于是准备登录后台去测试下,结果在测试的过程中发现到处订单的按钮前端居然没有做点击后按钮置灰交互事件,结果按钮可以一直点,因为导出订单数据本来就非常慢,使用的人员可能发现点击后很久后页面都没反应,结果就一直点,结果就大量的请求进入到后台,堆内存产生了大量的订单对象和EXCEL对象,而且方法执行非常慢,导致这一段时间内这些对象都无法被回收,所以最终导致内存溢出。解决方式除了调整本地内存大小之外,也可以在出现此异常时进行捕获,手动触发GC(System.gc())。
2025-07-11 21:36:39
939
原创 JVM进阶之路(九)性能监控工具-可视化工具篇
在前面已经学习了JVM性能监控的命令行工具,接下来学习JVM性能监控的命令行工具,通过可视化工具可以更直观地监控JVM性能、处理JVM相关问题。
2025-07-11 21:35:54
941
原创 JVM进阶之路(八)性能监控工具-命令行篇
定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。在实际的故障排查、性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用。
2025-07-11 21:35:24
558
原创 JVM进阶之路(七)垃圾收集器盘点
在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法。接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的实现。
2025-07-06 08:00:00
790
原创 JVM进阶之路(五)垃圾回收概述和对象回收判定
垃圾收集(Garbage Collection,简称GC)简单说,就是要干三件事:哪些内存需要回收?什么时候回收?如何回收?在Java的内存区域中:程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,所以这几个区域的内存回收是确定的,随着方法结束或者线程结束,内存自然回收。
2025-07-05 09:00:00
534
原创 JVM进阶之路(三)探究虚拟机对象
例如在64位的HotSpot虚拟机中,如对象未被同步锁锁定的状态下,Mark Word的64个比特存储空间中的31个比特用于存储对象哈希码,4个比特用于存储对象分代年龄,2个比特用于存储锁标志位,在其他状态(轻量级锁、重量级锁、偏向锁)下对象的存储内容变化如图示。如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。
2025-07-05 08:30:00
548
原创 JVM进阶之路(二)Java内存区域
考虑到HotSpot未来的发展,在JDK 6的 时候HotSpot开发团队就有放弃永久代,逐步改为采用本地内存(Native Memory)来实现方法区的计划了,到了JDK 7的HotSpot,已经把原本放在永久代的字符串常量池、静态变量等移出,而到了 JDK 8,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Meta-space)来代替,把JDK 7中永久代还剩余的内容(主要是类型信息)全部移到元空间中。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。
2025-07-05 08:15:00
528
原创 JVM进阶之路(一)Java虚拟机概览
JVM是整个Java平台的基石。JVM可以看作抽象的计算机。编译器将Java文件编译为Java字节码文件(.class),接下来JVM对字节码文件进行解释,翻译成特定底层平台匹配的机器指令并运行。JVM和Java语言没有必然的联系,它只与class文件格式关联。也就是任何语言,只要能编译成符合规范的字节码文件,都是能被Jvm运行的。也就是说JVM是跨语言的平台。
2025-07-05 08:00:00
647
原创 面试官问:“在项目中用过多线程吗?”你就把这个案例讲给他听!
要说线程,必先说进程。进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡的过程。线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享进程的堆和⽅法区资源,但每个线程有⾃⼰的程序计数器、虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作时,负担要⽐进程⼩得多,也正因为如此,线程也被称为轻量级进程。
2025-07-04 13:19:32
558
原创 MySQL索引由浅入深
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。通俗来讲,索引类似文章的目录,用来提高查询的效率。它是 B Tree 的变种,B Tree 能解决的问题,它都能解决。B Tree 解决的两大问题是什么?(每个节点存储更多关键字;路数更多)
2025-07-04 13:09:56
979
原创 synchronized详解
在Java中,锁可能是我们最早接触的锁了,在 JDK1.5之前synchronized是一个重量级锁,相对于juc包中的Lock,显得比较笨重。庆幸的是在 Java 6 之后 Java 官⽅对从 JVM 层⾯对进行⼤优化,所以现在的 synchronized 锁效率也优化得很不错。 的作用主要有三:Synchronized主要有三种用法:(1)、修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁复制代码 (2)、修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象
2025-07-04 13:04:22
626
原创 盘点分布式文件存储系统
在开始介绍分布式存储之前,先了解一下,非分布式的存储方案。在单机时代,将文件直接存储在服务部署的服务器上——直连存储(DAS):存储和数据直连,拓展性、灵活性差。为了扩展,将文件和服务分离,通过网络连接——中心化存储(NAS、SAN):设备类型丰富,通过网络互连,具有一定的拓展性,但是受到控制器能力限制,拓展能力有限。同时,设备到了生命周期要进行更换,数据迁移需要耗费大量的时间和精力。
2025-07-04 13:02:28
559
原创 思维导图整理Java并发基础
乐观锁和悲观锁是在数据库中引入的名词,但是在并发包锁里面引入了类似的思想。悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改,所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制,即在数据 ,在对数据记录操作前给记录排它锁。如果获取锁失败, 则说明数据正在被其它线程修改,当前线程则等待或者抛出异常。如果获取锁成功,则对记录进行操作 ,然后提交事务后释放排它锁。
2025-07-04 13:00:25
610
原创 一张脑图整理Docker常用命令
:Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。其它的指令还有ENTRYPOINT、ARG、VOLUME、WORKDIR、USER、HEALTHCHECK、ONBUILD、LABEL等等。Dockerfile 是一个文本格式的配 文件,用户可以使用 Dockerfile 来快速创建自定义的镜像。一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
2025-07-04 12:58:21
898
原创 什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
首先看看幂等性的概念:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。比如下面这些情况,如果没有实现接口幂等性会有很严重的后果: 支付接口,重复支付会导致多次扣钱;订单接口,同一个订单可能会多次创建。
2025-07-04 12:55:34
553
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人