Netty

「从零单排canal 05」 server模块源码解析

旧巷老猫 提交于 2020-08-09 01:49:59
基于1.1.5-alpha版本,具体源码笔记可以参考我的github: https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal 本文将对canal的server模块进行分析,跟之前一样,我们带着几个问题来看源码: CanalServer有几种使用方式? 控制台Admin、客户端client是如何与CanalServer交互的? CanalServerWithNetty和CanalServerWithEmbedded究竟有什么关系? Canal事件消费的特色协议,异步流式api(get/ack/rollback协议)的设计是如何实现的? server模块内的结构如下: 主要分为了三个包: admin包: 这个包的CanalAdmin接口定义了canalServer上暴露给canal-admin控制台使用的一些服务接口。 上一篇deployer模块解析中提到的CanalAdminController就是实现了CanalAdmin接口(把这个接口的实现放在deployer模块是挺奇怪的)。Admin包中使用了netty作为服务端(CanalAdminWithNetty类中实现),接受控制台Admin的请求,返回当前canalServer的一些运行状态。 server包: server模块的核心包

Redis的三个框架:Jedis,Redisson,Lettuce

久未见 提交于 2020-08-08 19:51:25
Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html redisson 官网地址:https://redisson.org/ redisson git项目地址:https://github.com/redisson/redisson lettuce 官网地址:https://lettuce.io/ lettuce git项目地址:https://github.com/lettuce-io/lettuce-core 概念:   Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持,   Redisson:实现了分布式和可扩展的Java数据结构。   Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。 优点:   Jedis:比较全面的提供了Redis的操作特性   Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列   Lettuce:主要在一些分布式缓存框架上使用比较多 可伸缩: Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行

Java高并发教程:Reactor反应器模式

☆樱花仙子☆ 提交于 2020-08-08 19:21:36
Java高并发教程:Reactor反应器模式 Reactor反应器模式   到目前为止, 高性能网络编程都绕不开反应器模式 。很多著名的服务器软件或者中间件都是基于反应器模式实现的,如Nginx、Redis、Netty。   反应器模式是 高性能网络编程的必知、必会的模式 。 Reactor简介   反应器模式 由Reactor反应器线程 、 Handlers处理器 两大角色组成:   (1)Reactor反应器线程的职责: 负责响应IO事件,并且分发到Handlers处理器 。   (2)Handlers处理器的职责: 非阻塞 的执行业务处理逻辑。   从上面的反应器模式定义,看不出这种模式有什么神奇的地方。当然,从简单到复杂,反应器模式也有很多版本。根据前面的定义,仅仅是最为简单的一个版本。 多线程OIO的致命缺陷   在Java的OIO编程中,最初和最原始的网络服务器程序,是用一个while循环,不断地监听端口是否有新的连接。如果有,就调用一个和处理函数来完成,示例代码如下: @Test public void client() throws IOException { Socket client = new Socket("127.0.0.1", 9999); Writer writer = new OutputStreamWriter(client

浅谈tcp socket的backlog参数

∥☆過路亽.° 提交于 2020-08-08 12:28:26
最近看netty源码碰到 ChannelOption.SO_BACKLOG 参数,通过跟踪代码发现其实是用于设置底层tcp socket的backlog参数,由于不了解这个参数,有必要彻底的理解一下。 底层 backlog参数主要用于底层方法 int listen(int sockfd, int backlog) , 在解释backlog参数之前,我们先了解下tcp在内核的请求过程,其实就是tcp的三次握手: 1、client发送SYN到server,将状态修改为SYN_SEND,如果server收到请求,则将状态修改为SYN_RCVD,并把该请求放到syns queue队列中。 2、server回复SYN+ACK给client,如果client收到请求,则将状态修改为ESTABLISHED,并发送ACK给server。 3、server收到ACK,将状态修改为ESTABLISHED,并把该请求从syns queue中放到accept queue。 在linux系统内核中维护了两个队列:syns queue和accept queue syns queue 用于保存半连接状态的请求,其大小通过/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默认值是512,不过这个设置有效的前提是系统的syncookies功能被禁用。互联网常见的TCP SYN

从Netty入门案例中看懂Netty工作模型

那年仲夏 提交于 2020-08-08 05:12:51
Netty工作模型 最近在学习Netty,遂记录下一些学习心得。文章中的内容是在学习了李林峰老师的《netty权威指南》以及尚硅谷的Netty视频后的一些感想以及对netty内容的学习记录。 单Reactor多线程模型中,只有一个selector,负责accept,read,write事件的维护 Netty主要基于 主从Reactors多线程模型 ,顾名思义,使用一个主Selector,和一个从Selector 主Selector 只负责客户端的连接,即accept事件。 从Selector 负责客户端的读写。即read和write事件。 代码示例 以服务端代码为例,相关的解释都写在了注释里 //Server 代码 public class EchoServer { public void bind(int port) throws Exception{ /** * bossGroup 和workerGroup包含的子线程(NioEventLoop)的个数 * 默认实际 cpu核数 * 2 */ EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workGroup = new NioEventLoopGroup(); try{ /** * step1. * 创建server端的启动对象 *

zookpeer常见面试题

早过忘川 提交于 2020-08-08 04:31:53
1.ZAB 协议是什么? ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广播协议。 ZAB 协议包括两种基本的模式: 崩溃恢复和消息广播 。 当整个 zookeeper 集群刚刚启动或者 Leader 服务器宕机、重启或者网络故障导致不存在过半 的服务器与 Leader 服务器保持正常通信时,所有进程(服务器)进入崩溃恢复模式; 首先 选举产生新的 Leader 服务器,然后集群中 Follower 服务器开始与新的 Leader 服务器进行数 据同步,当集群中超过半数机器与该 Leader 服务器完成数据同步之后,退出恢复模式进入 消息广播模式, Leader 服务器开始接收客户端的事务请求生成事物提案来进行事务请求处 理。 2.Znode 有哪几种类型 PERSISTENT- 持久节点 除非手动删除,否则节点一直存在于 Zookeeper 上 EPHEMERAL- 临时节点 临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与 zookeeper 连接断 开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。 PERSISTENT_SEQUENTIAL- 持久顺序节点 基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整 型数字。 EPHEMERAL_SEQUENTIAL- 临时顺序节点

netty 入门

安稳与你 提交于 2020-08-08 02:35:36
文档 使用手册 近期公司通过 TCP 连接的的方式接了一个硬件设备,用了最基础的 ServerSocket 类,参考的oracle的 文档 。 实现的比较简单,放在 github 上,不过这里应该用 Netty 才是正解。所以,过一下 Netty 的入门文档。 本文 demo 序言 问题 我们一般会用Http客户端库来调用web服务,获取数据。如果一个东西是出于一般性目的设计出来的,那么他在某些方面可能就不是最合适的。比如获取大文件,收发邮件,展示实时的金融数据,游戏数据传输等。为了实现这些需求,需要一个为其高度优化的特定协议。还有一个无法避免的问题是你可能需要调用老系统的数据,但是他的协议又是特定。重点来了,如何在不牺牲 可靠性 和 性能 的前提下 快速 实现这么一个系统。 解决方案 用Netty。用Netty。用Netty。重要的事情说3遍。 Netty是一个 异步 事件驱动 网络框架 ,可以用来快速开发易维护,高性能,可扩展的服务端/客户端。换句话说他简化了TCP和UDP 等服务的网络开发。 容易开发或者快速开发并不意味着他会牺牲可维护性或者是面临性能问题。Netty吸取了大量用于实现FTP,SMTP,HTTP协议的经验,并且仔细小心谨慎的设计。所以,他在易于开发,追求性能,确保稳定性和灵活性上并没有对任何一点有所妥协。 有人可能会说别的框架他们也这么说自己

win7安装使用neo4j

核能气质少年 提交于 2020-08-07 10:24:18
1、打开官网下载地址: https://neo4j.com/download/ ,点击“Download”进入下载页面,填写相关信息后点击“Download Desktop”下载,要把右侧出现的拷贝下来。 2、安装过程,略。安装成功后,双击桌面快捷图标,打开neo4j,界面如下: 3、点击“Add Database”->"Create a local graph"(如果提示输入key,把之前保存的key复制过来)。 graph name就是图数据库的名称,这里只能输入密码,不能输入用户名,用户名默认是neo4j。 4、点击“create”创建graph成功。点击新建好的graph的“start”,略等一会启动成功,点击“open”按钮,打开“Neo4j Browser”: 5、上图的效果,和在浏览器地址栏输入localhost:7474的效果是一样的,在顶部的输入框里,就可以按照官网的例子进行操作了,比如打开名为“movie”的graph :play movie graph 下边后出现8页操作提示,根据提示一步一步操作就可以了。 6、java连接neo4j: pom.xml分别引入bolt连接的jar包和http连接的jar包: <dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java

netty

吃可爱长大的小学妹 提交于 2020-08-07 07:21:39
最近在学习netty练习下,先附上写的代码吧 注意不要使用5.0的版本了,官方直接废弃了,可以自己搜索下。因此只用4版本的。 <!-- https://mvnrepository.com/artifact/io.netty/netty-all --> < dependency > < groupId >io.netty</ groupId > < artifactId >netty-all</ artifactId > < version >4.1.50.Final</ version > </ dependency > 服务端的代码实现: private static int port = 8080 ; public static void main ( String [] args) { // boss 线程池负责接受请求 NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // work 线程池负责处理请求 NioEventLoopGroup workGroup = new NioEventLoopGroup(); // 创建 ServerBootstrap ServerBootstrap serverBootstrap = new ServerBootstrap(); //

新特性:这招牛逼,Spring Boot 2.3.0 如何优雅停机?

半腔热情 提交于 2020-08-07 07:06:46
原文: https://mp.weixin.qq.com/s/uvNkdcmwkd6lcSRDhjPUJQ 1.什么是优雅停机 先来一段简单的代码, 如下: @RestController public class DemoController { @GetMapping("/demo") public String demo() throws InterruptedException { // 模拟业务耗时处理流程 Thread.sleep(20 * 1000L); return "hello"; } } 当我们流量请求到此接口执行业务逻辑的时候, 若服务端此时执行关机 (kill), spring boot 默认情况会直接关闭容器(tomcat 等), 导致此业务逻辑执行失败。在一些业务场景下:会出现数据不一致的情况, 事务逻辑不会回滚。 2.graceful shutdown 在最新的 spring boot 2.3 版本, 内置此功能, 不需要再自行扩展容器线程池来处理, 目前 spring boot 嵌入式支持的 web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于 Servlet 的 web 应用程序都支持优雅停机功能。我们来看下如何使用: 当使用 server.shutdown=graceful 启用时, 在