02 2020 档案
摘要:AQS是并发编程的一个最基本组件,是一个抽象同步器。 网上有很多详细介绍AQS的博文,在这里我就不仔细介绍了,主要写一些重要的内容。 AQS中重要的几个属性: 由于一个共享资源同一时间可以被一条线程持有,也可以被多个线程持有,因此AQS中存在两种模式, 和`独占模式`。 共享模式是共享状态值stat
阅读全文
摘要:在多线程情景下,如果不会某一共享变量采取一些同步机制,很可能发生数据不安全现象,比如购买车票时,当多个人购买时,不加锁就会产生多人买同一张票的现象,显然这是不可取的。所以要有一种同步机制,在某一时刻只能有一个线程处理该共享变量。 同步器的加锁 我将自己实现的同步器成为RoadAQS. 主要变量如下:
阅读全文
摘要:什么是线程池 线程池实际上就是一个线程缓存集合,负责对线程进行统一分配、调优和调度。 线程是稀缺资源,它的创建与销毁是一个相对来说相对偏重且资源消耗的操作,而java线程依赖于内核线程,创建线程需要进行系统操作系统切换,为避免资源过度消耗需要重用线程执行多个线程。 线程池的好处 重用存在的线程,减少
阅读全文
摘要:在1.7和1.8版本中,计算size()方法有写不同。先介绍1.7版本的实现。 1.7版本 在1.7版本中,有一个重要的类 ,利用它来实现分段锁 刚一开始不加锁,前后计算两次所有segment里面的数量大小和,两次结果相等,表明没有新的元素加入,计算的结果是正确的。如果不相等,就对每个segment
阅读全文
摘要:ConcurrentHashMap解决了HashMap的线程不安全问题,在分析之前先介绍一个将HashMap线程安全的方法。利用 调用内部类 内部主要有两个变量,一个普通变量Map,还有一个互斥锁mutex。通过构造方法将外部的Map传入进去,如果没有要传入的mutex,则将引用 赋值给 ,就产生了
阅读全文
摘要:在最近一段时间里,通过搜集有关资料加上自己的理解,设计了一款轻量级RPC,起了一个名字 lightWeightRPC 。它拥有一个RPC常见的基本功能。主要功能和特点如下: 利用Spring实现依赖注入与参数配置 利用Netty来实现客户端与服务端的远程通信 利用Hessian来实现序列化 设置Zo
阅读全文
摘要:在本版本中引入了SPI机制,关于Java的SPI机制与Dubbo的SPI机制在以前的文章中介绍过。 传送门: "Dubbo的SPI机制与JDK机制的不同及原理分析" 因为设计的RPC框架是基于Spring的,时常会遇到依赖注入问题。Spring中也有SPI机制,但是它有有个缺点,就是在利用SPI机制
阅读全文
摘要:在前两个版本中,每次发起请求一次就新建一个netty的channel连接,如果在高并发情况下就会造成资源的浪费,这时实现 异步请求 就十分重要,当有多个请求线程时,需要设计一个 线程池 来进行管理。除此之外,当前方法过于依赖注册中心,在高并发情况下对注册中心造成了压力;另外如果注册中心出现宕机等情况
阅读全文
摘要:在上一个版本中利用netty实现了简单的一对一的RPC,需要手动设置服务地址,限制性较大。 在本文中,利用zookeeper作为服务注册中心,在服务端启动时将本地的服务信息注册到zookeeper中,当客户端发起远程服务调用时,先从zookeeper中获取该服务的地址,然后根据获得的这个地址来利用n
阅读全文
摘要:什么是RPC RPC (Remote Procedure Call Protocol), 远程过程调用,通俗的解释就是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样,不需要了解底层网络技术的协议。 简单的整体工作流程 请求端发送一个调用的数据包,
阅读全文
摘要:在dubbo中,关于注册中心Registry的有关实现封装在了dubbo registry模块中。提供者(Provider)个消费者(Consumer)都是通过注册中心进行资源的调度。当服务启动时,provider会调用注册中心的register方法将自己的服务通过url的方式发布到注册中心,而co
阅读全文
摘要:在网络传输中,怎么确保通道连接的可用性是一个很重要的问题,简单的说,在网络通信中有客户端和服务端,一个负责发送请求,一个负责接收请求,在保证连接有效性的背景下,这两个物体扮演了什么角色,心跳机制能有效的保证连接的可用性,那它的机制是什么,下文中将会详细讲解。 网络层的可用性 首先讲一下TCP,在du
阅读全文
摘要:在上文中介绍了基础类AbstractRegistry类的解释,在本篇中将继续介绍该包下的其他类。 FailbackRegistry 该类继承了AbstractRegistry,AbstractRegistry中的注册订阅等方法,实际上就是一些内存缓存的变化,而真正的注册订阅的实现逻辑在Failbac
阅读全文
摘要:从今天开始,将会逐步介绍关于DUbbo的有关知识。首先先简单介绍一下DUbbo的整体概述。 概述 Dubbo是SOA(面向服务架构)服务治理方案的核心框架。用于分布式调用,其重点在于分布式的治理。 简单的来说,可以把它分为四个角色。服务提供方(Provider)、服务消费方(Consumer)、注册
阅读全文
摘要:在上一篇文章 Dubbo之服务暴露分析 中介绍了当远程暴露时,如果有注册中心,需要在服务暴露后再将服务注册到注册中心。该篇将介绍该功能的有关步骤。 注册的起点 在 方法包含了服务导出,注册,以及数据订阅等逻辑。其中服务注册先调用 方法。 可以看出,服务注册主要包括两部分, 获取注册中心实例 和 向注
阅读全文
摘要:Dubbo的服务暴露是一个重要的特性,了解其机制很重要。之前有很多人写了有关的源代码分析,在本文中不再重新分析。官方文档中的一篇写的就很好,本文主要是有关内容进行补充与总结。 传送门: "服务导出" 为什么要服务暴露 服务暴露分为远程暴露和本地暴露。在远程服务暴露中会将服务信息上传到注册中心。这时客
阅读全文
摘要:Dubbo的服务消费主要包括两个部分。第一大步是 类的 方法调用 的`refer Invoker`实例,这是服务消息的关键。第二大步是把Invoker通过动态代理转换成实现用户接口的动态代理引用。这里的Invoker承载了网络连接、服务调用和重试等功能。 服务暴露起点 在消费者的配置文件中存在这个代
阅读全文