自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【架构师从入门到进阶】第一章:架构设计基础——第二节:架构设计原则

本篇文章我们来学习架构设计的原则,有这么三个原则,第一个是合适原则,第二个是简单原则,第三个是演化原则。许多同学心中或多或少有成为架构师的想法,可是并不是说你把代码写好,就能成为一个架构师,优秀的程序员和架构师之间,还有一个明显的鸿沟需要跨越,这个鸿沟就是不确定性。对编程来说,它是不存在不确定性的,对于同样的一行代码,不管是谁写的,不管什么时候执行,执行的结果总是确定的,这里的确定呢,它不一定是正确性,也就是说哪怕这个程序运行的有bug,那它也是确定的。但是。

2024-09-29 09:05:52 803

原创 【图解秒杀系列】秒杀技术点——隔离、熔断、限流、降级

一个容器有它独立的与外界隔离的环境与资源,包括CPU、内存等,如果容器中的服务出问题,比如占用资源过高,也不会影响到别的容器中的服务。秒杀系统的隔离是指单独部署一套秒杀服务,与常规的服务区分开,这样即使秒杀服务出了问题,原先的服务也不会受影响。比如服务A的接口调用服务B的接口发生异常或超时,那么服务A的接口进行降级逻辑,调用本地的一个方法,返回默认的数据。接口级别的降级是指,原有的逻辑无法正常执行,转而执行的一段备用的有损的逻辑。被流控的请求,可以报错返回错误信息,也可以走降级处理的逻辑。

2024-09-29 09:04:29 1017

原创 【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器

我们通过SpringAOP扫描被@Protected注解修饰的方法,给它们生成代理对象,并且通过SpringAOP的@Around注解定义了环绕增强逻辑,当请求被@Protected注解修饰的接口方法接收时,就会进入这里的增强逻辑,增强逻辑做的自然就是熔断、限流、降级等这些事情。当调用一个接口方法时,如果被流控,或者断路器处于打开状态,或者执行目标方法时超时或抛出异常,并且接口设置了降级回调,那么执行对应Fallback实现类的降级处理方法。限流也叫流控,也就是流量控制,作用是限制流入服务接口的流量大小。

2024-09-21 08:24:04 1434 1

原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(六)——spring-cloud-context关于配置刷新的公共逻辑

我们在上一篇文章《客户端监听配置变更并刷新的源码分析》中最后说到,nacos客户端监听到配置变更通知后,会发布一个RefreshEvent事件,触发spring-cloud-context关于配置刷新的公共逻辑。但是由于它不是nacos实现的逻辑,我们没有对这段逻辑进行分析,本篇文章将会分析spring-cloud-context关于配置刷新的公共逻辑。

2024-09-21 08:19:51 1089

原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(五)——客户端监听配置变更并刷新的源码分析

listener.receiveConfigInfo(contentTmp)里面会调用到innerReceive方法,就进入了在NacosContextRefresher的registerNacosListener方法创建的监听器实现的innerReceive方法。...@Override...// 发布一个RefreshEvent事件...});...这里的监听器的innerReceive方法被触发,发布一个RefreshEvent事件。

2024-09-14 09:34:33 1145

原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(四)——配置新增或修改源码分析

dump配置内容到磁盘文件是通过DumpService进行的,DumpService先把新增或修改的配置dump到磁盘文件,然后根据文件内容算出一个MD5值,再拿到算出的MD5值与缓存中该配置文件对应的MD5值进行比较,如果两MD5值不一致,说明修改后的配置内容与修改前不一致,也就是发生了配置变更,需要更新MD5值并通知客户端。ConfigCacheService的dump方法在服务端启动的时候也会调用,这个我们在上一篇文章《服务端启动与获取配置源码分析》已经分析过,这里就不再分析了。

2024-09-14 09:31:06 414

原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(三)——服务端启动与获取配置源码分析

ConfigCacheService的updateMd5方法首先从从一个ConcurrentHashMap中根据groupKey获取CacheItem,然后判断如果CacheItem等于空或者CacheItem中的md5值与刚算出的md5值不匹配则进入分支,由于是刚启动,因此CacheItem肯定等于空,所以会进入if分支。由于已经查询MySQL然后dump到磁盘成配置文件了,因此当接收到获取配置的RPC请求时,就不需要再去查询MySQL,而是读取磁盘的配置文件即可。

2024-09-07 10:12:47 1032

原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(二)——客户端启动源码分析

NacosPropertySourceLocator的loadNacosDataIfPresent()调用loadNacosPropertySource方法获取配置信息,返回NacosPropertySource,然后把NacosPropertySource放入CompositePropertySource。然后循环遍历每一个PropertySourceLocator,调用locate方法,返回的PropertySource对象放入CompositePropertySource中。

2024-09-07 10:11:39 861

原创 【深入理解SpringCloud微服务】深入理解nacos配置中心(一)——宏观理解nacos配置中心原理

nacos配置中心的作用就是在微服务架构中负责集中管理各个微服务工程的配置文件,原先散落到各个微服务本地的配置文件,现在都集中存储到nacos上,这样更方便管理和维护。nacos配置中心客户端以jar包的形式被各微服务引入,然后微服务启动的时候,会通过nacos配置中心客户端请求nacos服务端拉取该微服务对应的配置,然后把拉取到的配置加载到Environment中。nacos有一个控制台界面,可以在上面修改配置信息。

2024-08-31 11:12:59 854

原创 【深入理解SpringCloud微服务】深入理解微服务配置中心原理,并手写一个微服务配置中心

这里我们可以再回顾一下服务端的LongPollingService和客户端的LongPollingClient的关系。通过websocket建立了长连接建立连接后,会回调监听器RefreshListener发送对应的environment和serviceName,LongPollingService接收到后会保存其与Session的对应关系。

2024-08-31 11:10:45 1592

原创 【图解秒杀系列】秒杀技术点——缓存预热,库存预扣 & 异步下单,超时未支付库存回填

由于热点数据没有加载到缓存中,当秒杀开始时,大量请求由于缓存缺失,都涌向了数据库,此时数据库就会面临很大的压力。但是有时候用户超时了也没有进行支付,此时除了要告知用户比如“超时未支付,秒杀失败”等的消息外,还要把扣减的库存回填回去,如果缓存中还有售罄标志,那么还要把该标志修改为false,此时秒杀按钮再次从灰变成亮。“检查redis中的库存”,“以及扣减redis中的库存两个动作”,必须保证原子性,因此这里可以使用lua脚本的方式来处理。lua脚本在redis中执行可以保证脚本中的多个动作具有原子性。

2024-08-24 10:11:10 972

原创 【图解秒杀系列】秒杀技术点——多级缓存、分层过滤

但是,直接用HashMap做本地缓存有一个缺点,就是对于一些冷数据的删除是不方便的,如果不做删除的话该HashMap占用的空间会越来越大,因此我们还要自己维护数据的访问频率或者最近的访问时间,以便于冷数据的删除。分层过滤是秒杀系统中高效处理高并发请求的策略,分层过滤采用“漏斗”式设计,通过在不同层次上逐步过滤无效请求,确保只有有效请求能够到达系统后端,从而减轻系统压力,提高系统的处理能力和响应速度。一般而言,我们会把本地缓存的过期时间设置的短一点,而分布式缓存的过期时间设置的较长一点。

2024-08-24 10:09:13 996

原创 【架构师从入门到进阶】第一章:架构设计基础——第一节:架构设计的目的

本篇文章我们来学习架构设计的目的,我们从两个角度去分析,第一个就是架构设计的误区,然后再分析目的。

2024-08-18 11:47:51 666

原创 【深入理解SpringCloud微服务】Spring-Cloud-OpenFeign源码解析(下)——LoadBalancerFeignClient详解

由于LoadBalancerFeignClient里面使用到了RxJava ,因此我们要先了解一下RxJava ,RxJava 是一个在Java平台上实现响应式编程的库,用于处理异步数据流。我们看一下LoadBalancerFeignClient里面用到的RxJava的相关方法,其他的RxJava方法我们就不研究了,因为重点是LoadBalancerFeignClient的源码,而不是学习RxJava。// 创建一个负载均衡命令对象try {

2024-08-18 11:18:18 1030

原创 【深入理解SpringCloud微服务】Spring-Cloud-OpenFeign源码解析(上)

Feign对Ribbon和各种http客户端工具类(如OKHttp、HttpClient、HttpURLConnection等)进行了封装,使得开发者无需再手动调用RestTemplate发起http请求,而是以方法调用的方式向远处服务发起请求。当使用Feign之后,开发者要做的就是在接口以及接口方法上使用Feign的注解修饰,Feign就会扫描并给这些接口生成一个代理对象,当我们调用接口的方法时,实际上就是调用代理对象,底层就会通过Ribbon进行负载均衡,然后使用http客户端发起http请求。

2024-08-18 11:16:18 886

原创 【图解秒杀系列】秒杀技术点——秒杀按钮点亮、削峰

因此在生成的这个静态页面中,会加入一个特殊JavaScript,该JavaScript携带了秒杀是否开始的标识,该JavaScript不会被浏览器缓存,每次刷新页面都会请求一次,由于该JavaScript文件的体积很小,因此每次刷新页面都请求一次也不会对服务器造成什么压力。增加了答题或者验证码机制后,每个用户答题或输入验证码的速度都是不一样的,有的快有的慢,这就有效的把不同用户下单的请求在时间上错开了,很好的把一瞬间的请求均摊到一个相对较长的时间范围内,使得服务承受的并发压力大大降低。

2024-08-17 09:31:45 1074

原创 【图解秒杀系列】秒杀技术点——静态化

静态化就是指通过某种静态化技术,将原本需要动态渲染生成的HTML页面固定下来变成一个静态页面文件,后续请求该页面都直接返回该静态页面。首先要有模板和数据,然后根据给定的模板和数据,通过模板引擎,就能生成对应的静态HTML文件。生成的静态HTML页面,可以推到Nginx上缓存到Nginx本地。当用户请求访问对应的页面时,Nginx直接返回缓存在本地的静态页面,这样响应速度就大大提升。在秒杀场景中,商品详情页就可以进行静态化处理,提升商品详情页的访问速度。

2024-08-17 09:28:43 1049

原创 【深入理解SpringCloud微服务】深入理解微服务中的远程调用,并手写一个微服务RPC框架

我们可以定义一个注解(比如OpenFeign的@FeignClient注解),注解需要指定服务名(表示这个接口是请求哪个微服务的),然后通过Spring的ClassPathBeanDefinitionScanner扫描我们自定义的注解修饰的接口,然后生成BeanDefinition,注册到Spring容器中。用于修饰启动类,表示启动微服务RPC功能。获取到服务名后,然后要读取接口方法上的注解,解析注解上的url,从注解解析出来的url前面拼接上修饰接口的自定义注解的服务名,就形成了完成的请求地址。

2024-08-10 09:56:02 780

原创 【深入理解SpringCloud微服务】Ribbon源码解析

RibbonLoadBalancerClient首先调用getLoadBalancer(serviceId),根据服务名(serviceId就是服务名),取得对应的ILoadBalancer。RestTemplate发起的http请求会被LoadBalancerInterceptor的intercept方法拦截,LoadBalancerInterceptor的intercept方法从url中取出域名部分作为服务名serviceName,然后调用LoadBalancerClient的execute方法。

2024-08-10 09:54:40 1077

原创 【图解秒杀系列】秒杀技术点——浏览器缓存、CDN

CDN的全称是内容分发网络(Content Delivery Network),通过在全球各地部署大量的服务器节点,并且将内容缓存到这些节点上,当用户请求对应的内容时将用户请求引导到离用户最近的节点上,从而减少内容传输的距离,提升访问速度和缩短响应时间。CDN技术是提升秒杀系统架构性能的一种手段,它属于缓存中的一种,在秒杀链路的多级缓存中也属于其中一层缓存层(当然浏览器缓存也算是一层)。

2024-08-04 08:53:33 614

原创 【图解秒杀系列】秒杀场景介绍及其相关技术点

电商系统的秒杀是一种营销活动,在特定的时间点,以极低的价格,有限的商品数量,吸引大量用户抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。

2024-08-04 08:48:46 999

原创 【深入理解SpringCloud微服务】深入理解Ribbon原理并手写一个微服务负载均衡器

创建LoadBalancer前首先通过Java的SPI机制加载所有的负载均衡策略类LoadBalanceRule,再通过@Rule注解与配置文件的配置进行匹配,匹配出一个LoadBalanceRule。即使只有一个服务提供者,它的ip地址和端口好也是有可能会变的。由于有了负载均衡器,服务消费者请求服务提供者不再需要通过ip地址加端口号的方式,而是可以以服务名作为域名,负载均衡器会通过一定的负载均衡策略,选择服务名对应的微服务集群中的其中一个服务提供者节点,将请求地址中的服务名替换为该节点的ip地址端口号。

2024-07-27 21:23:22 983

原创 【深入理解SpringCloud微服务】深入理解nacos

因为一个Service可能会有多个服务实例,每个服务实例注册上来时,都会创建一个Client,那么这里记录一个Service对应的有哪些服务实例,Service就可以拿到对应的clientId集合,进而拿到所有的Client对象,而Client对象中有存放了对应的服务实例信息,这样就可以拿到对应的服务实例信息。而2.x版本的nacos由于换成了GRPC协议的长连接,服务端和客户端之间没有再次建立请求的额外开销,因此增加了一个服务端主动探活的操作,如果客户端有响应,那么还是不会进行服务下线的。

2024-07-27 21:19:17 888

原创 【深入理解SpringCloud微服务】深入理解Eureka核心原理

增量拉取返回的服务实例列表会合并到Eureka客户端的本地缓存中,然后根据本地缓存的服务实例列表计算一个hashCode,与Eureka服务端返回的hashCode进行比较,如果不一致,还要再进行一次全量拉取。当ApplicationResource接收到服务注册请求时,会把服务实例信息写入内存注册表,并失效掉读写缓存,然后把新注册上来的实例信息异步同步到集群中的其他Eureka节点。以上就是Eureka全部的核心原理,下面放一张源码图,对源码有兴趣的可以跟一跟,没有兴趣的可以直接忽略。

2024-07-20 11:25:05 1109

原创 【深入理解SpringCloud微服务】浅析微服务注册中心Eureka与nacos,手写实现一个微服务注册中心

最后,我们接入SpringBoot提供的自动装配机制,完成我们注册中心的自动配置,spring.factories文件配置指定我的配置类RegistryCenterServerConfig,然后我们的配置类RegistryCenterServerConfig通过@ComponentScan注解扫描RegistryCenterController、RegistryCenterService、定时任务类等一些核心类,定时任务使用Spring的@EnableScheduling和@Scheduled注解。

2024-07-20 11:22:58 990

原创 【图解大数据技术】流式计算:Spark Streaming、Flink

Flink 和 Spark Streaming 不一样,Flink 一开始设计就是为了做实时流式计算的。它可以监听消息队列获取数据流,也可以用于计算存储在 HDFS 等存储系统上的数据(Flink 把 这些静态数据当做数据流来进行处理)。然后 Flink 计算后生成的结果流,也可以发送到其他存储系统。

2024-07-13 10:06:08 1260

原创 【图解大数据技术】Spark

Spark与MapReduce一样,也是大数据计算框架。Spark相比MapReduce拥有更快的执行速度和更低的编程复杂度。Spark Core:封装了Spark的基本功能,比如RDD、任务调度等。Spark SQL:Spark SQL可以处理结构化数据,当我们遇到结构化数据的计算时,可以使用Spark SQL,它允许我们把数据集映射为表结构,然后像操作关系型数据库的库表一样操作Spark SQL的表。

2024-07-13 10:04:03 1042

原创 手写实现一个ORM框架

首先介绍一下ORM框架的相关知识。数据库表是行列格式的,而Java是面向对象的,我们需要通过操作JDBC的结果集ResultSet,一行行遍历,再一列一列的处理结果,在new一个对象去set对应的值,这就显得非常繁琐,也与Java的面向对象编程格格不入。ORM框架就可以解决这个问题,通过对象与关系型数据库建立一个映射关系,就可以省去操作JDBC的结果集ResultSet这一步繁琐的操作,直接把对库表的查询结果映射成对应的对象。

2024-07-06 18:18:10 889

原创 【图解大数据技术】Flume、Kafka、Sqoop

Flume是一个数据采集工具,多用于大数据技术架构下的日志采集。Flume的特点是高可靠,高可用,分布式,海里数据采集传输。Agent:一个Agent就是一个JVM进行,Agent中主要由Source、Channel、Sink三部分组成。Source:Source主要负责收集外部的数据到Agent中,以Event的形式存入Channel。Sink:Sink负责从Channel中批量删除Event并把它们写入指定的外部存储。

2024-07-06 18:15:16 1083 2

原创 【图解大数据技术】Hive、HBase

HBase是一个用于存储海量非结构化或半结构化数据的列示存储数据库,支持高性能写入,准实时查询。HBase底层基于HDFS实现了PB级别的海量数据存储。通过缓存和预写日志技术实现了高性能写入和低延迟查询。通过Zookeeper的监控通知HMaster故障转移实现了高可靠性。通HMaster接收RegionServer注册以及HMaster的RegionServer集群负载均衡能力实现高扩展性。

2024-06-29 21:41:43 1304

原创 【图解大数据技术】Hadoop、HDFS、MapReduce、Yarn

MapReduce是一个分布式离线计算框架,专门用于处理大数据场景中与实时性无关的一些离线计算任务。MapReduce的数据输入一般是HDFS,然后经过InputFormat进行输入格式化,变成格式;然后执行用户实现的Mapper类型的map方法,进行数据映射,映射处理的结果也是格式;然后执行一个shuffle过程,对映射结果进行按key进行分组分区,把同一区域的所有KV发送到同一个Reducer,由一个节点进行;Reducer对同一个key分组下的所有value进行聚合操作;

2024-06-29 21:38:35 1661

原创 【图解IO与Netty系列】Netty源码解析——ChannelPipeline中的责任链模式

AbstractChannelHandlerContext的invokeChannelRead方法里面,一般会进入if条件分支,拿到ChannelHandlerContext的ChannelHandler,因为是处理read事件,read事件是入站事件,所以是ChannelInboundHandler类型,然后调用ChannelInboundHandler的channelRead方法进行事件处理,ChannelInboundHandler的channelRead方法就是我们实现的处理逻辑。

2024-06-22 11:49:43 810

原创 【图解IO与Netty系列】Netty源码解析——事件循环

就是通过allocator分配一个ByteBuf,然后把Channel中的数据读取到ByteBuf中,然后调用pipeline.fireChannelRead(byteBuf)触发ChannelPipeline的处理,然后ChannelPipeline中的ChannelHandler就会处理byteBuf中的数据,这里的ChannelPipeline中的ChannelHandler就是我们定义的ChannelInitializer组装到ChannelPipeline中的ChannelHandler了。

2024-06-22 11:48:33 1286

原创 【图解IO与Netty系列】Netty源码解析——服务端启动

今天我们一起来学习Netty源码,对Netty有一个深入的认知,既能掌握其使用和原理,又能对它底层的设计有一个大概的认知。

2024-06-16 16:22:41 819

原创 【图解IO与Netty系列】Netty编解码器、TCP粘包拆包问题处理、Netty心跳检测机制

网络传输是以字节流的形式传输的,而我们的应用程序一般不会直接对字节流进行处理,而是把字节流解析成有一定结构的数据格式再去处理。因此我们在发送数据时,要对我们的数据进行编码,把它转换成二进制字节流的形式,然后在网络中进行传输,当我们接收到对方传输过来的二进制字节流时,又需要对其进行解码,解析成应用程序能够处理的数据格式。根据不同的协议或不同的功能,Netty提供了对应的编码器或解码器,有处理SSL或TLS协议的、有处理HTTP协议的、有做HTTP压缩的、有处理WebSocket协议的等等。

2024-06-16 16:20:31 940 2

原创 【图解IO与Netty系列】Netty核心组件解析

Selector就是NIO中的Selector,Selector是一个多路复用器,我们可以往Selector注册多个Channel,Selector可以帮我们监听注册在其上的Channel,当我们调用Selector的select()方法时,当前线程就阻塞,通过Selector监听注册在其上的Channel,等待关注的事件就绪。除了持有NIO的Channel以外,还保存了各自关注的事件类型,等真正把NIO的Channel注册到Selector上的时候,就可以直接设置对应的事件类型。

2024-06-10 16:09:02 831

原创 【图解IO与Netty系列】Netty快速入门

Netty是高性能的网络通信框架,底层对Java的NIO进行了封装,特点是简单易用易上手,又能为应用提供高性能的网络通信能力。在网络通信场景中,我们一般使用Netty进行开发而不是NIO,因为Java的NIO使用非常的复杂,代码不易于维护。并且在网络通信中,我们需要对协议编解码、断线重连、心跳检测等问题进行处理,这些在NIO中都是不具备的,需要我们手动编码实现。而Netty则对NIO进行了封装,使得我们无需编写复杂的NIO代码,又能实现高性能的网络通信。

2024-06-10 16:04:50 1024 1

原创 【图解IO与Netty系列】Reactor模型

Reactor模型是服务器端用于处理高并发网络IO请求的编程模型,与传统的一请求一线程的同步式编程模型不同的是,Reactor模型是基于事件驱动的响应式编程模型,可以一个线程处理多个请求,并且是异步处理,在高并发场景下,性能大大的提升。传统的同步式编程模型如下:服务端接收到请求后,从线程池中拿出一个线程(比如Tomcat里的线程池),经过Controller、Service、Dao的一顿处理,最后返回响应结果给客户端。这种同步处理请求的方式效率并不高,可以应对一些并发量不高的场景。

2024-06-01 20:23:27 1017

原创 【图解IO与Netty系列】Java世界里的NIO

由于Socket编程有以上种种缺点,从JDK1.4开始就推出了NIO的编程模型。NIO是非阻塞式IO操作,性能比起过去的原生Socket编程在性能上有很大提升。但是要注意的是,Java的NIO与Linux的NIO不是一个东西,Java的NIO底层使用的其实是IO多路复用。

2024-06-01 20:20:05 844

原创 【图解IO与Netty系列】IO多路复用

于是就有了NIO,NIO是同步非阻塞式IO,在客户端未发送数据前,服务端用户线程线程调用read()函数不会阻塞,而是马上返回一个error,用户线程可以先干点别的事情,然后再次尝试read(),如果此时数据就绪,那么read()函数会阻塞,用户线程把内核空间的数据拷贝到用户空间。于是就是有了IO多路复用。epoll_create创建一个epoll实例,epoll实例使用一个红黑树结构保存注册进来的socket文件描述符,然后使用一个链表保存就绪的socket文件描述符,此时epoll实例还是空的。

2024-05-26 14:45:17 1331

空空如也

空空如也

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

TA关注的人

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