自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

男儿当自强

人生来平凡,因奋斗进取而不凡。

  • 博客(749)
  • 资源 (1)
  • 收藏
  • 关注

转载 Kafka、RabbitMQ、RocketMQ 之间的区别是什么 ?

Kafka采用拉取(Pull)方式消费消息,吞吐量相对更高,适用于海量数据收集与传递场景,例如日志采集和集中分析。RabbitMQ在吞吐量方面略有逊色,但支持更多的消息队列功能。RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。以下从性能、数据可靠性、服务可用性、功能等方面给出具体的对比分析,供用户选型参考。性能消息中间..

2021-10-18 09:50:33 4412

转载 jms、amqp、mqtt区别与联系

消息传递作为基本通信机制已经在全世界成功运用。无论是人与人、机器与人还是机器与机器之间,消息传递一直都是唯一常用的通信方式。在双方(或更多)之间交换消息有两种基本机制。同步消息传递 异步消息传递同步消息传递在这种情况下使用,当消息发送者希望在某个时间范围内收到响应,然后再进行下一个任务。基本上就是他在收到响应前一直处于“阻塞”状态。异步消息意味着发送者并不要求立即收到响应,而且也不会阻塞整个流程。响应可有可无,发送者总会执行剩下的任务。上面提到的技术,当两台计算机上的程序相互通信的时候,就广

2021-10-15 16:35:27 471

转载 Dubbo底层通信原理

Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。dubbo除了可以提供服务之外,还可以实现软负载均衡。它还提供了两个功能Monitor 监控中心和调用中心。这两个是可选的,需要单独配置。常用场景:Dubbo采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况Dubbo原理 1. 节..

2021-10-14 16:43:43 1146

原创 DubboAdmin和配置中心

一 部署dubbo-admin 下载代码:git clone https://github.com/apache/dubbo-admin.git 在dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址 如果无法连接zookeeper,需要添加超时时间timeout # centers in dubbo2.7, if you want to add parameters, please add...

2021-10-14 13:45:59 355 2

转载 Dubbo 多注册中心注册及引用

在 Dubbo 中把同一个服务注册到多个注册中心上Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。另外,注册中心是支持自定义扩展的1。多注册中心注册比如:中文站有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:/.

2021-10-13 17:57:46 649

原创 Dubbo 配置http协议

一服务提供者在服务提供者中,需要添加 注释为http协议支持 的依赖jar包,修改启动类的启动方式,添加provider.xml配置<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="h.

2021-10-13 16:20:20 2391

原创 Dubbo 超时机制和集群容错机制

配置服务调用超时时间后,当服务消费者调用服务生产者服务时达到超时时间,服务消费者会报超时异常; 集群的容错策略有多种,失败重试、快速重试以及并行调用等多种策略,默认是失败重试策略,默认重试两次,重试次数可以通过retries配置修改;快速失败,此时不进行重试;并行调用,同时调用多个服务提供者上的服务,有一个成功返回,即服务调用成功。package com.tech.controller;import com.tech.UserService;import or...

2021-10-12 18:02:01 258

原创 zookeeper ACL权限控制

ACL权限控制,可分离开发和测试环境,不同的环境访问相应的节点,可以控制不同IP的服务访问相关的节点。# 创建一个节点并查询它的ACL[zk: localhost:2181(CONNECTED) 17] create /test 1Created /test[zk: localhost:2181(CONNECTED) 18] getAcl /test'world,'anyone: cdrwa任何用户都有cdrwa权限c: 创建d: 删除r: 读取w: 写入a:...

2021-10-09 15:12:48 451

原创 Zookeeper的watcher机制

通过给zookeeper节点添加监听事件,当事件触发时会通知应用程序,如通过get/stat -w监听当前节点信息变更,当更新节点或者删除节点时会触发事件;通过ls -w监听当前节点的子节点数量信息变更,当添加或者移除当前节点子节点时会触发事件。事件的触发是一次性的,触发后需要再次注册才能继续监听事件。一 get/stat监听节点变更# 创建测试节点[zk: localhost:2181(CONNECTED) 20] create /test 1Created /test# 注册监听

2021-10-09 11:36:16 307

原创 Zookeeper的session机制

Zookeper客户端与服务端建立连接时,会维护一个session,在建立连接过程中session状态是connecting,在建立连接后session状态是connected,建立连接后,客户端不断的给服务端发送心跳包,当在一定时间内,服务端检测不到客户端的心跳包,认为session已经过期失效,session状态是closed,session失效后会移除在该session下创建的临时节点。# 创建临时节点[zk: localhost:2181(CONNECTED) 2] create -e /t

2021-10-09 10:33:28 710

原创 Zookeeper 基础命令总结

zookeeper下载版本apache-zookeeper-3.6.3-bin.tar.gz,在下载时候要选择xxx-bin.tar.gz才是安装包,不带bin的是源码包。一 zkCli连接服务器# -server指定目标服务器地址,不写-server 默认连接本机2181端口./zkCli.sh -server 127.0.0.1:2181二 帮助文档连接服务器成功后输入 h 显示帮助信息[zk: 127.0.0.1:2181(CONNECTED) 0]...

2021-10-08 18:07:06 189

转载 SOA、ESB、微服务的关系梳理

1、SOA是一种理念,它的主要特性--面向服务的分布式计算,服务间松散耦合,支持服务的封装,服务注册和自动发现,以服务契约方式定义服务交互方式。但是,SOA并没有定义出具体的实现方式,目前有两套SOA理念的实现方式:中心化和去中心化,这两套架构并没有优劣之分,还是要针对企业的根本诉求。2、SOA中心化的实现方式就是ESB,ESB的根本诉求是为了解决异构系统之间的连通性,通过协议转换、消息解析、消息路由把服务提供者的数据传送到服务消费者。所以,ESB是中心化的,很重,有一定的逻辑,但它的确可以解决一些公用

2021-09-29 14:08:25 529

原创 ByteBuf的三种缓冲区创建

package com.tech.netty.bytebuf;import io.netty.buffer.ByteBuf;import io.netty.buffer.CompositeByteBuf;import io.netty.buffer.Unpooled;/** * @author lw * @since 2021/9/27 */public class ByteBufTest { public static void main(String[] args) thr.

2021-09-27 11:21:05 429

原创 使用Netty提供的解码器解决TCP粘包和拆包问题

解决粘包和拆包问题: 发送端需要使用tcp_nodelay来关闭nagle算法,有数据就发送; 接收端,需要在应用层来解决问题,可用的方式: 固定消息长度,比如不足的位数补0,接收端使用FixedLengthFrameDecoder; 使用换行符、自定义分隔符给消息添加边界; 将消息拆分为消息头和消息体,消息头中指定了消息长度等信息,接收端使用LengthFieldBas...

2021-09-24 16:40:36 402

原创 事件在ChannelHandler的传播顺序

pipeline是由ChannelHandlerContext组成的双向链表,事件在入站处理器上是从前往后传播,在出站处理器上是从后往前传播。入站处理器上下文,通过fireXXX方法,将事件从当前处理器传递到下个处理器对应方法;如果是由pipeline或者channel调用fireXXX方法,将事件从队列的首部开始传递。...

2021-09-24 09:52:47 264

转载 Netty ChannelOption.SO_BACKLOG配置

ChannelOption.SO_BACKLOG对应的是tcp/ip协议,listen函数中的backlog参数,用来初始化服务端可连接队列。函数:// backlog 指定了内核为此套接口排队的最大连接个数;// 对于给定的监听套接口,内核要维护两个队列: 未连接队列和已连接队列listen(int socketfd,int backlog)backlog 用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的...

2021-09-23 13:44:57 1533

转载 TCP三次握手第三次握手时ACK丢失怎么办

当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server; 如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。 Server重发SYN+ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5。 如果重发指定

2021-09-23 11:00:13 573

转载 TCP 协议(序号和确认号)

接下来的内容是学习后续内容的基础,必须先讲清楚。为了方便你回忆 TCP 首部,这里再次把这个图贴出来,以便对照。图1 TCP 首部1. 序号序号占用 4 字节,即 32 位。它的范围是[0,232−1],也就是说一共有 4 294 967 296 个序号。TCP 协议中的序号,指的是报文段序号。字节序号TCP 连接中,为传送的字节流(数据)中的每一个字节按顺序编号。也就是说,在一次 TCP 连接建立的开始,到 TCP 连接的断开,你要传输的所有数据的每一个字节都要编号。这...

2021-09-17 18:03:37 11247 1

转载 TCP三次握手、四次挥手过程及原理

CP 协议简述TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。同时由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式,所以需要四次挥手关闭连接。TCP包首部网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结

2021-09-17 16:47:53 434

原创 使用Netty编写一个Echo程序

Echo服务程序:实现客户端发送消息给服务器,服务器将收到的消息返回给客户端。Echo服务程序可以用于程序调试和检测。package com.tech.netty.echo;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.nio.NioEventLo

2021-09-17 12:33:52 147

转载 Linux中select poll和epoll的区别

在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并发的场景下,nginx越来越收到欢迎。一.select 下面是select的函数接口:C代码intselect(intn,fd_...

2021-09-16 10:01:28 180

转载 select、poll和epoll

问题:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程数?我们都知道系统创建进程是需要消耗大量资源的,所以这样就会导致系统资源不足的情况。那么有没有一种方式可以让一个进程同时为多个客户端端提供服务?接下来要讲的IO复用技术就是对于上述问题的最好解答。对于IO复用,我们可以通过一个例子来很好的理解它。(例子来自于《TCP/IP网络编程》)某教室有10名学生和1名老师,这些学生上课会不停的提问,所以一个老师处理不了这么多的问题。那么学校为每个学生都配一名老师,也就

2021-09-15 17:23:41 229

转载 select、poll和epoll之间的区别

在深入理解select、poll和epoll之间的区别之前,首先要了解什么是IO多路复用模型。IO多路复用简单来说,IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备就绪,它就通知该进程去进行IO操作。详细的描述可以参考IO模型。select、poll和epoll都是提供I/O多路复用的解决方案。select函数int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *ex

2021-09-15 16:16:43 112

原创 Linux IO基础原理及五种IO模型

一 Linux IO基础原理 应用程序的IO读写,依赖于底层操作系统的IO读写,它是通过操作系统的两大系统调用Read/Write实现的。在Linux操作系统中设置了唯一的一个内核缓冲区,并未每个上层应用程序设置看一个用户缓冲区,当应用程序进行数据读取时,内核将数据从内核缓冲区复制到用户缓冲区,当应用程序进行数据写入时,内核将数据从用户缓冲区复制到内核缓冲区,设置缓冲区的目的是减少性能消耗,因为直接对外部设备进行IO读写会造成操作系统中断,操作系统频繁访问外部设备会,会造成不必要的性能开...

2021-09-15 10:17:43 618

转载 Linux 五种IO模型详细图解

一、IO 简述IO (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作,通常用户进程中的一个完整IO分为两阶段:用户进程空间<–>内核空间、内核空间<–>设备空间(磁盘、网络等)。IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者。LINUX中进程无法直接操作I/O设备,其必须通过系统调用请求kernel来协助完成I/O动作;内核会为每个I/O设备维护一个缓冲区。对于一个输入(读取到内存)操作来说,进程IO系统调用后,

2021-09-14 10:02:18 416

转载 详解IO模型

一、IO基础原理1、操作系统的IO应用程序进行IO的读写,依赖于底层操作系统的IO读写,是通过操作系统的两大系统调用read、write来实现的。应用程序调用操作系统的read、write接口,完成数据在应用程序的进程缓冲区和操作系统的内核缓冲区之间的交互。 操作系统设置数据缓冲区的目的,是为了提升性能。外部设备的直接读写,涉及操作系统的中断。发生系统中断时,需要保存之前的进程数据和状态等信息,而结束中断之后,还需要恢复之前的进程数据和状态等信息。操作系统如果频繁...

2021-09-13 15:36:50 1170

原创 BIO编程及其特点分析

服务端:监听端口,监听客户端发送的消息,返回服务器时间给客户端。package com.tech.netty.bio;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * @author lw * @since 2021/9/13 */public class BioServer { private static final int PORT = 808

2021-09-13 13:56:01 125

原创 基于Netty实现简单的RPC框架

Dubbo采用Netty作为基础通信组件,模仿Dubbo实现简单版的RPC框架。服务消费者和服务提供者约定接口和协议,用于远程调用和TCP请求验证。服务提供者作为NettyServer端,需要对接口进行实现,对于满足约定协议的TCP请求进行处理,调用约定接口中的相应方法进行响应。服务消费者作为NettyClient端,需要给公共接口创建代理对象,调用接口方法时,在代理对象中来发起TCP请求,等待服务端的响应返回结果,从而实现RPC调用。总体设计:关键代码:pub...

2021-09-09 15:04:17 144

转载 JDK动态代理-Proxy.newProxyInstance

java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口、目标接口的类加载器以及InvocationHandler便可为目标接口生成代理类及代理对象。// 方法 1: 该方法用于获取指定代理对象所关联的InvocationHandlerstatic InvocationHandler getInvocationHandler(Object proxy) // 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象static Class getP

2021-09-08 17:28:04 1084

转载 你真的了解Netty中@Sharable?

一、前言Netty 是一个可以快速开发网络应用程序的基于事件驱动的异步 网络通讯 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的应用还是比较广泛的,比如阿里巴巴开源的 Dubbo 和 Sofa-Bolt等 框架底层网络通讯都是基于 Netty 来实现的。Netty的设计是精妙的,其中每个设计点都值得我们去深思,本节我们来看看Netty中@Sharable的设计哲学二、Netty基础快速回顾如果你熟悉netty请直接看第三节io.netty.channel.Chan

2021-09-08 15:42:51 243

转载 netty handler的线程安全性与@Sharable

1. Bootstrap中直接添加sb.childHandler(new MySimpleChannelInboundHandler())这个childHandler都是同一个实例,也就说会导致不同的channel用了同一个handler2.netty的一大好处就是每一个channel都有自己绑定的eventloop和channelHandler,这样可以保证代码串行执行,不必考虑并发同步的问题。3.只要写个类继承ChannelInitializer就行了,ChannelInit...

2021-09-08 15:37:49 1946

原创 Netty 使用异步线程池执行耗时任务

一 任务队列 这种方式运行任务队列线程和事件循环线程是同一个线程,并没有使用新的线程。 Netty的事件循环EventLoop是一个不断循环着执行读取就绪事件、处理事件、运行任务队列这三个操作的一个线程。事件循环关联了一个任务队列,用于存放耗时较长的业务处理操作。事件循环线程先读取就绪事件,如果任务队列为空则用阻塞一定时间的方式读取,如果任务队列非空,则使用非阻塞的方式读取,读取就绪事件。读取后进行处理事件,记录处理事件花费的时间,在任务队列中不断取出任务执行,默认花费在任...

2021-09-07 11:04:54 2191

转载 Netty源码分析:NioEventLoop启动以及其IO操作和Task任务的处理

在上篇博文分析服务端启动的过程中,我们遇到了如下的代码片段, if (eventLoop.inEventLoop()) { register0(promise); } else { try { eventLoop.execute(new OneTimeTask() { @Override ...

2021-09-07 10:37:31 673

原创 DelayQueue延时队列

DelayQueue是一个实现了BlockingQueue接口的类,它也是阻塞队列,但是他还具有一些独特的功能,那就是在获取元素时,需要检测元素是否到达延时时间,如果没有到达延时时间是无法获取到元素的。 队列里的元素需要实现Delay接口,这个接口有一个方法是getDelay,当这个方法返回0或者负数,说明元素已经到达了延时时间,在获取元素时可以正常获取,否则无法获取。Delay接口继承了Comparable接口,重写它的compareTo方法,可以对队列中的元素排序,通常...

2021-09-06 15:12:33 284

原创 ChannelPipeline 调用 handler 的过程分析

pileline channelhandlercontext handler关系每一个通道Socket都关联了一个Pipeline,用于业务处理,管道是由ChannelHandlerContext组成的双向,每个ChannelHandlerContext包装了一个Handler进行业务处理,它采用了责任链设计模式,对拦截的事件和数据在管道中相应的handler进行传播。根据数据的传播方向分为两种操作:入站操作:数据从Socket流向Pipeline; 出站操作:数据从Pipeline流向So.

2021-09-03 15:44:46 238

原创 TCP 拆包和粘包问题及解决方案

TCP是面向流的,TCP消息没有边界,TCP根据缓冲区的实际情况,可能会将一个大的数据包拆分成多个小的数据包进行发送,也可能会将多个小的数据包封装成一个大的数据包进行发送,这就是拆包和粘包。 粘包产生的原因:(1)待发送数据的长度小于待发送缓冲区的大小,多个数据可能会被一次发送;(2)消息接收端没有及时读取接收缓冲区中的数据; 拆包产生的原因:(1)待发送数据的长度大于待发送缓冲区剩余空间的大小;...

2021-09-01 10:49:53 186

原创 TCP粘包和拆包

TCP粘包和拆包 TCP是个“流”协议,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况。(1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;(...

2021-08-31 14:05:39 63

原创 其他解码器

ReplayingDecoder 是ByteToMessageDecoder类型,不需要判断可读字节数直接进行读取之前用的解码器:package com.tech.netty.netty.inboundleandoutboudle;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.handler.codec.ByteToMessageDecoder;..

2021-08-30 15:46:11 110

原创 Netty出入站机制与编解码器

从Socket读取数据到客户端/服务器为入站操作,入站操作管道中事件传播顺序是从前往后;将客户端/服务器数据写入到Socket为出站操作,出站操作管道中事件传播顺序是从后往前。编码器为出站处理器,将业务数据进行编码,使用编码器收到的数据类型必须与处理的类型一致,否则encode方法不会被调用;解码器为入站处理器,对编码后的数据进行解码为我们的业务数据,解码器需要判断ByteBuf中可读取的字节数是否足够。出入站操作:接下来实现通过自定义编码器解码器实现字节码和Long类型的转换...

2021-08-27 18:21:32 257

转载 阿里的Easyexcel读取Excel文件(最新版本)

 本篇文章主要介绍一下使用阿里开源的Easyexcel工具处理读取excel文件,因为之前自己想在网上找一下这个简单的立即上手的博客,发现很多文章的教程都针对比较旧的版本的Easyexcel,没有使用新版本的方法,导致很多方法都标志过期了或者运行时报错,所以本篇博客主要是使用最新版的Easyexcel去读取excel文件,顺便说一下目前新版本的特性。优化目前读取excel文件不再需要指定ExcelTypeEnum,即excel的版本,会自动处理 之前创建ExcelReader都是自己new,现在是

2021-08-25 17:45:36 3274

rocketmq-console.zip

RocketMQ控制台,下载后对资源解压,修改Pom中RocketMQ版本修改配置文件中RocketMQ nameServer地址,用Maven编译,运行target目录下的jar即可

2021-11-09

空空如也

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

TA关注的人

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