SPI机制
这几天在学习Dubbo对其中的SPI机制很感兴趣,于是决定进一步了解一下。(本文基于dubbo3.0.4)
SPI机制SPI (Service Provider Interface),主要用于扩展的作用。
假如有一个框架有一个接口,他有自己默认的实现类,但是在代码运行的过程中,你不想用他的实现类或者想扩展一下他的实现类的功能,但是此时你又不能修改别人的源码,那么此时该怎么办?
这时spi机制就有了用武之地。一般框架的作者在设计这种接口的时候不会直接去new这个接口的实现类,而是在Classpath路径底下将这个接口的实现类按作者约定的格式写在一个配置文件上,然后在运行的过程中通过java提供的api,从所有jar包中读取所有的这个指定文件中的内容,获取到实现类,用这个实现类,这样,如果你想自己替换原有的框架的实现,你就可以按照作者规定的方式配置实现,这样就能使用你自己写的实现类了。
java的spi机制java中最常见的spi机制应用就是数据库驱动的加载,java其实就是定义了java语言跟数据库交互的接口,但是具体的实现得交给各大数据库厂商来实现,那么java怎么知道你的数据库厂商的 ...
Dubbo源码——生产者
源码解读本文基于dubbo2.7.8。
Dubbo的启动dubbo中的服务,之所以可以暴露/引入,都是基于xml文件的配置。
以下是一段配置信息
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ...
RPC和HTTP
概述RPC(即Remote Procedure Call,远程过程调用),主要是基于TCP/IP协议;而HTTP服务主要是基于HTTP协议的。我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹啦!下面来具体说一说RPC服务和HTTP服务。
架构设计一个完整的RPC架构里面包含了四个核心的组件,分别是Client 、Server、Client Stub、Server Stub,这个Stub大家可以理解为存根。分别说说这几个组件:
客户端(Client),服务的调用方。
服务端(Server),真正的服务提供者。
客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法。
RPC主要是用在大型企业里面,因为大型企业里面系统繁多,业务线复杂,而且效率优势非常重要的一块,这个时候RPC的优势就比较明显了。实际的开发当中是这么做的,项目一般使用maven来管理。比如我们有一个处理 ...
Dubbo学习笔记
Dubbo的基本应用什么是DubboDubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架
致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
Dubbo的发展历史2011/10/27: 阿里巴巴巴宣布 Dubbo 开源。
2012/10/23: 发布最后一个版本 2.5.3 并停止维护更新。
2017/07/31: 起死回生,官方宣布开启重新更新,并会得到重点维护.
2017/09/07: 发布起死回生的第一个版本:dubbo-2.5.4。
2018/01/08:
1、Dubbo 团队透露 Dubbo 3.0 宣布正式开工
2、发布了 dubbo-2.6.0 版本,主要合并了由当当网开源的 dubbox 项目分支。PS:dubbo停止维护期间,当当网基于 dubbo 开源了dubbox。
2018/01/22: Dubbo Spring Boot 版正式发布:dubbo-spring-boot-starter v1 ...
进程之间的通信方法
进程和线程的关系OS以按照进程为单位分配资源,调度时,调度的是进程中的某一个线程
线程是OS调度的最小单位,进程是OS分配资源的最小单位
以线程的方式实现并发性
创建进程会分配资源,创建线程时不一定会分配资源
同一个进程的线程间共享进程资源,进程间的资源彼此不可见
进程之间通讯需要同步或互斥手段的辅助,线程间可以直接读写。
进程之间的通信方式管道、信号、消息队列、共享内存、信号量、socket。其中前五种主要用于一台主机之中的各个进程之间的通信,socket套接字通信主要用于网络之中不同主机之间的通信。
管道管道分为命名管道和无名管道,在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,都可以看成一种特殊的文件,具有固定的读端和写端,也可以使用普通的read、write 等函数。
并不属于其他任何文件系统,并且只存在于内存中;无名管道一般使用fork函数实现父子进程的通信,命名管道用于没有血缘关系的进程也可以进程间通信;面向字节流、自带同步互斥机制、半双工,单向通信,两个管道实现双向通信。
缺点
半双工通信,一条管道只能一个进程写,一个进程读。
一个进程写完后,另一个进程才能 ...
Lambda&Stream
Lambda表达式Java8新引入的新特性 Lambda表达式。Lambda表达式是一种用于取代匿名类,把函数行为表述为函数式编程风格的一种匿名函数。Lambda表达式的执行结果是函数式接口的一个匿名对象。
是一套关于函数(f(x))定义、输入量、输出量的计算方案
语法格式概述(parameters) -> { statements; }//实例(int a, int b) -> {return a + b;}
parameters :函数的参数列表
statements; :执行语句
-> :使用指定参数去完成某个功能
(parameters) -> expression//实例(int a, int b) -> a + b
parameters :函数的参数列表
expression :表达式
-> :使用指定参数去完成某个功能
特点
可选的大括号{}
函数体只包含一个语句,不需要大括号
// 1.函数体只有一个语句,省略大括号(String msg) -> System.out.pr ...
MQ常见问题
有几百万消息持续积压几小时,怎么办?几千万条数据在 MQ 里积压了七八个小时,从下午 4 点多,积压到了晚上 11 点多。一般情况下都是线上故障了,这个时候虽然可以修复 consumer 的问题,让它恢复消费速度,但是要傻傻的等待几个小时消费完毕。
一个消费者一秒是 1000 条,一秒 3 个消费者是 3000 条,一分钟就是 18 万条。所以如果你积压了几百万到上千万的数据,即使消费者恢复了,也需要大概 1 小时的时间才能恢复过来。
一般这个时候,只能临时紧急扩容了,具体操作步骤和思路如下:
先修复 consumer 的问题,确保其恢复消费速度,然后将现有 consumer 都停掉。
新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量。
然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue。
接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当 ...
ZGC
概述ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括:
停顿时间不超过10ms;
停顿时间不会随着堆的大小,或者活跃对象的大小而增加;
支持8MB~4TB级别的堆(未来支持16TB)。
从设计目标来看,我们知道ZGC适用于大内存低延迟服务的内存管理和回收。本文主要介绍ZGC在低延时场景中的应用和卓越表现,文章内容主要分为四部分:
GC之痛:介绍实际业务中遇到的GC痛点,并分析CMS收集器和G1收集器停顿时间瓶颈;
ZGC原理:分析ZGC停顿时间比G1或CMS更短的本质原因,以及背后的技术原理;
ZGC调优实践:重点分享对ZGC调优的理解,并分析若干个实际调优案例;
升级ZGC效果:展示在生产环境应用ZGC取得的效果。
CMS和G1很多低延迟高可用Java服务的系统可用性经常受GC停顿的困扰。
GC停顿指的是垃圾回收期间的STW,当STW时所有的应用线程都会停止活动,等待GC停顿结束。
CMS新生代的Young GC、G1和ZGC都基于标记-复制算法,但算法具体实现的不同就导致了巨大的性能差异。
标记-复制算法应 ...
MQ保证消息的顺序性
概述消息的有序性指的是一个生产者生产的消息消费顺序和生产顺序一致,例如使用binlog+mq进行数据同步的时候,对于单条记录的增加、和修改和删除应该保持有序,消费消息时如果消息变成删除、修改和删除,则导致同步数据不一致。对于最简单的消息模型,一个生产者+一个消息队列+一个消费者,由于队列具有先进先出(FIFO,first in first out)特性,这样的消息模型消息时有序的。
消息从生产到消费有两个传输阶段,第一个阶段是从生产者到消息队列,第二个节点是从消息队列推送到消费端,为了使用保证消息MQ中消息有序,需要在两阶段进行控制。
实例比如通过mysql binlog进行两个数据库的数据同步,由于对数据库的数据操作是具有顺序性的,如果操作顺序搞反,就会造成不可估量的错误。比如数据库对一条数据依次进行了 插入->更新->删除操作,这个顺序必须是这样,如果在同步过程中,消息的顺序变成了删除->插入->更新,那么原本应该被删除的数据,就没有被删除,造成数据的不一致问题。
实例一问题描述一个queue,有多个consumer去消费,这样就会造成顺序的错误,consu ...
HTTP详解
HTTPHTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。
超文本:超越了普通文本的文本(文字、图片、视频等信息)
传输:HTTP 是一个在计算机里专门用来在两点之间传输数据的约定和规范
协议:两点之间的一种规范和约束
HTTP 不是用于从互联网服务器传输超文本到本地浏览器的协议,也可以是服务器到服务器,所以采用两点之间的描述会更准确。
优缺点特点
语义上的自由,处理规定的基本格式之外,其余的各个部分都没有严格的限制;并且不仅可以传输文本,还能传输图片、视频等信息
HTTP是基于TCP/IP的,因此TCP所具有的可靠性HTTP也具有。
每次 http 请求都是独立、无关的,默认不需要保留状态信息——无状态。(这里的状态是指通信过程的上下文信息)
请求和应答一一对应
缺点
无状态 所谓的优点和缺点还是要分场景来看的,对于 HTTP 而言,最具争议的地方在于它的无状态。
在需要长连接的场景中,需要保存大量的上下文信息,以免传输大量重复的信息,那么这时候无状态就是 http 的缺点了。
但与此同时,另外一些应用仅仅只是为了获取一些数据 ...