这篇文章是 RPC 系列的第一篇,打算写一个系列的文章,简单介绍下 Duboo2, Dubbo3, gRPC 及 RScoket 的使用方法及差异。在 Alligator 项目中借鉴了其中的一些思想,基于 TCP, Websocket 及 MQ,实现了一个简单的 RPC。RPC 涉及到内容比较多,这里选取了两个方面做为切入点:1)通信模式,包括 request-response, request-stream, stream-response, stream-stream, send-oneway; 2)协议,主要是协议字段,通过这些字段可以大概猜测出其实现方式。

阅读全文 »

在项目开发中,有时需要用到 Mysql 来验证功能,使用 Docker 部署 Mysql 便是一个比较方便快捷的选择,在本文中主要是安装 Mysql 5.7,其它版本可以自行选择。

阅读全文 »

1. 概述

在系统中,Protocol Buffer 的使用有两种方式:1)定义 .proto 文件,生成相应的 Bean 对象及序列化的代码;2)根据现有的 Java Bean 对象,动态生成对应的 schema, 使用工具类完成对象的序列化。这两种方式的优缺点也比较明显,.proto 文件支持向前、向后兼容,后者使用简单,引用工具类,便可支持序列化操作,缺点是存在代码兼容性问题。

阅读全文 »

1. 概览

在 Alligator 系统中,网关与业务系统之间是通过 MQ 进行通信。为了简化开发成本,基于 MQ, 实现了一套 RPC 调用,其封装了超时、同步调用及异步调用等功能,调用模型如下图所示: mq-rpc-model

  • 使用两个 MQ 队列来存储信息,分别是请求及响应信息;
  • 在请求端维护一个 request id,在响应信息中带上 request id,从而将请求与响应对应起来;
  • 在请求端为每一个请求设置一个超时任务,避免长时间未响应结果。
阅读全文 »

1.概述

在操作系统中内存管理的基本单位是 page, page 大小一般是 4k。为了满足不同场景,分配不同大小的内存,操作系统提供了丰富的内存管理方法。从分层的角度来说,可以用下面的层次图来表示。 netty-memory-management-level

  1. 在内核空间,Buddy 系统提供了 page 级的内存分配,可以实现较大连续内存的分配,最小的分配单位是 page;
  2. 在内核空间,Buddy 最小分配单位是 4k ,即一个 page。为了避免内存空间的浪费(小于 4K 的空间也会分配一个 page),slab 提供了小内存空间的分配机制;
  3. 在用户空间,一般是通过 Buddy 分配一个大内存,在这个大内存里面,使用特定的数据来管理内存的分配,满足不同场景下内存的使用,典型的分配算法有:ptmalloc,tcmalloc 及 jemalloc。
阅读全文 »

1. 概述

EventLoop 是 Reactor 模式中的执行者,首先它持有 Selector 对象,监听多路 SocketChannel 的网络 I/O 事件,并对 I/O 事件分发处理。同时,它持有一个 Thread 对象,除了监听网络 I/O 事件, EventLoop 也可以执行提交的任务,包括定时任务,总结来说,EventLoop 具有如下三大功能:

  1. 负责监听 SocketChannel 对象的 I/O 事件;
  2. 处理分发 I/O 事件;
  3. 执行任务,包括定时任务。
阅读全文 »

1. 概述

ChannelPipeline 可以理解为一个 ChannelHandler 列表,而 ChannelHandler 是一个能够独立处理 channel 入站 (inbound) 事件或出站 (outbound) 操作的处理器。ChannelPipeline 实现了 "Intercepting Filter" 模式,它给用户提供了事件处理及 ChannelHandler 之间交互的能力,用户可以根据业务场景定义 ChannelHandler,以类似插件的方式添加到 ChannelPipeline 中。

阅读全文 »
0%