Netty

朋友国企干了5年java,居然不知道Dubbo是做什么呢?我真信了

你说的曾经没有我的故事 提交于 2020-08-18 12:20:32
点赞再看,养成习惯,微信搜一搜【 三太子敖丙 】关注这个喜欢写情怀的程序员。 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 前言 接下来一段时间敖丙将带大家开启紧张刺激的 Dubbo 之旅!是的要开始写 Dubbo 系列的文章了,之前我已经写过一篇架构演进的文章,也说明了微服务的普及化以及重要性,服务化场景下随之而来的就是服务之间的通信问题,那服务间的通信脑海中想到的就是 RPC,说到 RPC 就离不开咱们的 Dubbo。 这篇文章敖丙先带着大家来 总览全局 ,一般而言熟悉一个框架你要先知道这玩意是做什么的,能解决什么痛点,核心的模块是什么,大致运转流程是怎样的。 你要一来就扎入细节之中无法自拔,一波 DFS 直接被劝退的可能性高达99.99%,所以本暖男敖丙将带大家先过一遍 Dubbo 的简介、总体分层、核心组件以及大致调用流程 。 不仅如此我还会带着大家过一遍如果要让你 设计一个 RPC 框架你看看都需要什么功能 ?这波操作之后你会发现嘿嘿 Dubbo 怎么设计的和我想的一样呢?真是英雄所见略同啊! 而且我还会写一个简单版 RPC 框架实现,让大家明白 RPC 到底是如何工作的。 如果看了这篇文章你要还是不知道 Dubbo 是啥,我可以要劝退了。 我们先来谈一谈什么叫 RPC

Netty集成ProtoBuf开发私有协议

久未见 提交于 2020-08-18 06:26:46
Netty集成ProtoBuf开发私有协议 私有协议 广义上区分,通信协议可以分为公有协议和私有协议。由于私有协议的灵活性,它往往会在某个公司或者组织内部使用,按需定制,也因为如此,升级起来会非常方便,灵活性好。绝大多数的私有协议传输层都基于TCP/IP,所以利用Netty的NIO TCP协议栈可以非常方便地进行私有协议的定制和开发。 通信模型 (1) Netty协议栈客户端发送握手请求消息,携带节点ID等有效身份认证信息; (2) Netty 协议栈服务端对握手请求消息进行合法性校验,包括节点ID有效性校验、节点重复登录校验和IP地址合法性校验,校验通过后,返回登录成功的握手应答消息: (3)链路建立成功之后,客户端发送业务消息; (4)链路成功之后,服务端发送心跳消息; (5)链路建立成功之后,客户端发送心跳消息; (6)链路建立成功之后,服务端发送业务消息; (7)服务端退出时,服务端关闭连接,客户端感知对方关闭连接后,被动关闭客户端连接。 ProtoBuf数据格式 syntax = "proto3"; option java_package = "com.fy.protobuf"; option java_outer_classname="CustomMessageData"; message MessageData{ int64 length = 1; Content

Netty 中的粘包和拆包

谁说我不能喝 提交于 2020-08-17 18:09:20
Netty 底层是基于 TCP 协议来处理网络数据传输。我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 “包” 的概念呢? TCP是四层协议不负责数据逻辑的处理,但是数据在TCP层 “流” 的时候为了保证安全和节约效率会把 “流” 做一些分包处理,比如: 发送方约定了每次数据传输的最大包大小,超过该值的内容将会被拆分成两个包发送; 发送端 和 接收端 约定每次发送数据包长度并随着网络状况动态调整接收窗口大小,这里也会出现拆包的情况; Netty 本身是基于 TCP 协议做的处理,如果它不去对 “流” 进行处理,到底这个 “流” 从哪到哪才是完整的数据就是个迷。我们先来看在 TCP 协议中有哪些步骤可能会让 “流” 不完整或者是出现粘滞的可能。 1. TCP 中可能出现粘包/拆包的原因 数据流在TCP协议下传播,因为协议本身对于流有一些规则的限制,这些规则会导致当前对端接收到的数据包不完整,归结原因有下面三种情况: Socket 缓冲区与滑动窗口 MSS/MTU限制 Nagle算法 1. Socket缓冲区与滑动窗口 对于 TCP 协议而言,它传输数据是基于字节流传输的。应用层在传输数据时,实际上会先将数据写入到 TCP 套接字的缓冲区,当缓冲区被写满后,数据才会被写出去。每个TCP Socket 在内核中都有一个发送缓冲区(SO_SNDBUF

「从零单排canal 04」 启动模块deployer源码解析

偶尔善良 提交于 2020-08-17 17:08:41
基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal 本文将对canal的启动模块deployer进行分析。 Deployer模块(绿色部分)在整个系统中的角色如下图所示,用来启动canal-server. 模块内的类如下: 为了能带着目的看源码,以几个问题开头,带着问题来一起探索deployer模块的源码。 CanalServer启动过程中配置如何加载? CanalServer启动过程中涉及哪些组件? 集群模式的canalServer,是如何实现instance的HA呢? 每个canalServer又是怎么获取admin上的配置变更呢? 1.入口类CanalLauncher 这个类是整个canal-server的入口类。负责配置加载和启动canal-server。 主流程如下: 加载canal.properties的配置内容 根据canal.admin.manager是否为空判断是否是admin控制,如果不是admin控制,就直接根据canal.properties的配置来了 如果是admin控制,使用PlainCanalConfigClient获取远程配置

Gateway --Spring Cloud 五

一曲冷凌霜 提交于 2020-08-17 16:02:38
Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul。 网关通常在项目中为了简化前端的调用逻辑,同时也简化内部服务之间互相调用的复杂度; 具体作用就是转发服务,接收并转发所有内外部的客户端调用; 其他常见的功能还有权限认证,限流控制等等。 Spring Cloud Gateway使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架 作用: 1.反向代理 2.鉴权 3.流量控制 4.熔断 5.日志监控 … 三大核心概念 Route(路由) 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由 Predicate(断言) 参考的是java8的java.util.function.Predicate 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由 Filter(过滤) 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。 Gateway工作流程:路由转发+执行过滤器链 入门配置 1.建module:gateway-gateway9527 2.pom <!--新增gateway--> <dependency>

使用gpg插件发布jar包到Maven中央仓库 完整实践

ⅰ亾dé卋堺 提交于 2020-08-17 05:30:38
本文记录了在maven环境下使用gpg插件将 jar 包部署到中央仓库并快速检验和更新的完整实践过程。相对于网上其他教程使用oss-parent作为父工程的方法,这种方法入侵度低,自由度高,也是官方推荐使用的。实践过程解决了gpg验证以及javadoc注解不规范的问题。 先行知识 1 项目基础配置 首先需要注意项目的 groupId,下文注册sonatype账号时也需要填写 groupId ,两者最好一致,并确保你拥有该域名所有权,我推荐用GitHub个人主页作为对应地址。格式为 com.github.username。首先需要注意项目的 groupId,下文注册sonatype账号时也需要填写 groupId ,两者最好一致,并确保你拥有该域名所有权,我推荐用GitHub个人主页作为对应地址。格式为 com.github.username。 本文以如下配置为例: <groupId>com.github.linshenkx</groupId> <artifactId>rpc-netty-spring-boot-starter</artifactId> <version>1.0.0.RELEASE</version> 2 Maven发布相关网址 在整个发布过程中,有以下3个关键网址,注意前2个共用一个账号。 工单管理: https://issues.sonatype.org

线程隔离浅析

不打扰是莪最后的温柔 提交于 2020-08-17 02:28:14
前言 随着微服务的流行,单体应用被拆分成一个个独立的微进程,可能一个简单的请求,需要多个微服务共同处理,这样其实是增加了出错的概率,所以如何保证在单个微服务出现问题的时候,对整个系统的负面影响降到最低,这就需要用到我们今天要介绍的线程隔离。 线程模型 在介绍线程隔离之前,我们先了解一下主流容器,框架的线程模型,因为微服务是一个个独立的进程,之间的调用其实就是走网络io,网络io的处理容器如tomcat,通信框架如netty,微服务框架如dubbo,都很好的帮我们处理了底层的网络io流,让我们可以更加的关注于业务处理; Netty Netty是基于java nio的高性能通信框架,使用了 主从多线程模型 ,借鉴 Netty系列之 Netty线程模型 的一张图片如下所示: 主线程负责认证,连接,成功之后交由从线程负责连接的读写操作,大致如下代码: EventLoopGroup bossGroup = new NioEventLoopGroup( 1 ); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); b. group (bossGroup, workerGroup); 主线程是一个单线程,从线程是一个默认为cpu*2个数的线程池

Java 开发者的编程噩梦,为什么你的代码总有 bug??

99封情书 提交于 2020-08-17 02:26:11
文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。 很多 Java 初学者在开始编程时会出现一些问题,这些问题并不是指某个特定领域的问题,也不是指对某个业务不熟悉而导致的问题,而是对基础知识不够熟悉导致的问题。而就是这些问题让我们编写了一些不够健壮的代码。 这篇文章会列举几种编程初学者常常出现的一些问题,我相信这些问题多多少少也曾困扰着现在或曾经的你。如果觉得文章不错,不妨点赞分享,让更多人跳过这些开发中的坑。 随处可见的 Null 值 我见过很多的代码会把 Null 值作为返回值,当你预期是一个字符串时,意外得到了一个 Null 值;当你预期得到一个 List 时,意外又得到了一个 Null 值,如果你不进行处理,那么你还会意外得到 NullPointerException . 就像下面这样。 // 情况1 String userTag = getUserTag ( ) ; if ( userTag . equals ( "admin" ) ) { // NullPointerException // ... } // 情况2 List < String > carList = getCarList ( ) ; for ( String car : carList ) { //

Netty-开发WebSocket服务器

删除回忆录丶 提交于 2020-08-16 14:54:18
Netty-开发http服务器 WebSocket协议 单一的TCP连接,采用全双工模式通信; 对代理、防火墙和路由器透明; 无头部信息、 Cookie 和身份验证; 无安全开销: 通过“ping/pong”帧保持链路激活: 服务器可以 主动传递消息给客户端,不再需要客户端轮询。 WebSocket协议应用背景 协同编辑/编程 点击流数据 股票基金报价 体育实况更新 多媒体聊天 基于位置的应用 在线教育 ···· 上述应用场景都有一个特点:实时更新,http协议由于是半双工通信,实现实时更新需要轮询,增加网络开销,而WebSocket就是为了解决这一痛点的。 WebSocket协议建立 建立WebSocket连接时,需要通过客户端或者浏览器发出握手请求,请求消息: 为了建立一个WebSocket连接,客户端浏览器首先要向服务器发起一个HTTP请求,这个请求和通常的HTTP请求不同,包含了一些附加头信息,其中附加头信息“Upgrade:WebSocket"表明这是一个申请协议升级的HTTP请求。服务器端解析这些附加的头信息,然后生成应答信息返回给客户端,客户端和服务器端的WebSocket连接就建立起来了,双方可以通过这个连接通道自由地传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动关闭连接。 请求消息中的“Sec-WebSocket-Key"是随机的

Elasticsearch 7.4(Windows 系统) 指定单独JDK版本

随声附和 提交于 2020-08-16 11:44:50
我用的最新版本Elasticsearch 7.4,下图是官网的介绍,说解压包里已经有最合适的jdk包了,我们只需要修改指向,让它启动时用这个包就行了,网上搜出了好多文章是修改"bin/elasticsearch",可能是因为他们是linux系统,我是用的windows系统,没生效,看了下修改了另一个文件"bin/elasticsearch-env.bat"文件,成功启动。 修改bin/elasticsearch-env.bat 改变下面这一块的语义就行了 我是修改了JAVA_HOME的值,直接增加了下面一句话 rem 配置自己的jdk set JAVA_HOME=F:/elasticsearch/elasticsearch-7.3.0/jdk linux系统也可以用这个方法,找到 elasticsearch-env 这个文件 大概在39 - 40 行 将JAVA_HOME换成刚刚配置的ES_JDK 启动ES 到这里我们又看到另一个警告 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. 这是提醒你 cms 垃圾收集器在 jdk9 就开始被标注为