[TOC]前言一、变量1.1 概述程序在运行过程中,数据保存在内存当中。在代码中,可以通过以下两种方式到内容中访问具体的数据:直接引用该数据的内存地址访问数据通过创建变量将数据的内存地址保存起来,然后通过引用变量名去访问数据和后者相比前者的可读性差,并且容易出错,所以在程序中通常会通过定义一个简短有意义的名称来用于对数据的访问。简言之,变量就是一块存放(可变)数据的内存空间,引用变量名就可以到该内存空间上访问(查找or修改)数据。组成变量由内存地址,数据类型和值组成:内存地址:给出了变量在内存中存储的起始地址,一般占用4或8字节(32位、64位机器)。数据类型:定义了变量占用内存的大小。...
[TOC]前言在执行GO语言时需要先安装一个SDKGo 安装包下载Windows系统只需要下载对应版本的以.msi后缀结尾的文件即可。安装完成后自动加入环境变量,不需要手动配置。安装过程很简单本文就不在赘述。安装完成后打开cmd查看是否安装成功go version一、第一个GO程序需求:在控制台输出"Hello World!"package main // 声明 main 包 import "fmt" // 导入 fmt 包,打印字符串时需要用到 func main() { // 声明 main 主函数 fmt.Println("...
[TOC]前言在开始本篇之前先上一张表情包:GO语言的吉祥物是一只地鼠(gopher)。一、简介Go语言又称为Golang是Google于2009年正式发布的一款开源的静态编译型编程语言,Go拥有构建简单、可靠和高效的特性。主要目标是“兼具Python 等动态语言的开发速度和C/C++等编译型语言的性能与安全性”,旨在不损失应用程序性能的情况下降低代码的复杂性。很多公司,特别是中国的互联网公司,即将或者已经完成了使用 Go 语言改造旧系统的过程。经过 Go 语言重构的系统能使用更少的硬件资源获得更高的并发和I/O吞吐表现。充分挖掘硬件设备的潜力也满足当前精细化运营的市场大环境。Go语言的...
[TOC]一、NIO启动流程Netty底层是NIO,从对NIO的组件封装开始进行分析。本次对Netty的分析主要是在源码中找到下方NIO的方法,来看看netty中对下面的代码是怎样进行处理的//1 netty 中使用 NioEventLoopGroup (简称 nio boss 线程)来封装线程和 selector //可以同时监听多个channel上的读和写事件 Selector selector = Selector.open(); //2 创建 NioServerSocketChannel,同时会初始化它关联的 handler,以及为原生 ssc 存储 config NioSe...
[TOC]一、概述RPC的目的,让分布式或者微服务系统中不同服务之间的调用(远程调用)像本地调用一样简单,调用者感知不到远程调用的逻辑。二、目的客户端向服务端发送请求,调用HelloService接口中的sayHello方法,最后服务端将结果返回给客户端HelloService接口public interface HelloService { String sayHello(String name); }HelloServiceImpl接口实现类public class HelloServiceImpl implements HelloService { @Overrid...
[TOC](1) CONNECT_TIMEOUT_MILLIS属于 SocketChannal 的参数用在客户端建立连接时,如果在指定毫秒内无法连接,会抛出 timeout 异常注意:Netty 中不要用成了SO_TIMEOUT 主要用在阻塞 IO,而 Netty 是非阻塞 IO示例import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOpti...
[TOC]一、概念序列化最终的目的是为了对象可以跨平台存储和进行网络传输,而一般进行跨平台存储和网络传输的方式就是 IO,而 IO 支持的数据格式就是字节数组。将对象转成字节数组的时候需要制定一种规则,这种规则就是序列化机制。序列化和反序列化概述序列化:就是把对象转化为可传输的字节序列过程;反序列化:就是把字节序列还原为对象的过程。二、常见序列化方式序列化只是定义了拆解对象的具体规则,那这种规则肯定也是多种多样的,比如现在常见的序列化方式有:JDK 原生、JSON、ProtoBuf、Hessian、Kryo等。JDK原生作为一个成熟的编程语言,JDK自带了序列化方法。只需要类实现了Ser...
[TOC]一、聊天室业务介绍用户管理接口/** * 用户管理接口 */ public interface UserService { /** * 登录 * @param username 用户名 * @param password 密码 * @return 登录成功返回 true, 否则返回 false */ boolean login(String username, String password); }会话管理接口import io.netty.channel.Channel; /** * 会话管理接口 ...
[TOC]一、@Sharable概述表示可以将带注释的 ChannelHandler 的同一个实例多次添加到一个或多个 ChannelPipelines 中,而不会出现竞争条件。如果未指定此注解,则每次将其添加到管道时都必须创建一个新的处理程序实例,因为它具有成员变量等非共享状态。(这个是Netty的官方给的说明)简单的理解:@Sharable是用来修饰ChannelHandler的ChannelHandler单例模式下需要添加多个ChannelPipelines 也就是要拦截多个Channel,就需要使用到@Sharable来修饰ChannelHandler二、示例验证在Netty中添...
[TOC]一、网络协议基本要素魔数魔数是通信双方协商的一个暗号,通常采用固定的几个字节表示。魔数的作用是防止任何人随便向服务器的端口上发送数据。服务端在接收到数据时会解析出前几个固定字节的魔数,然后做正确性比对。如果和约定的魔数不匹配,则认为是非法数据,可以直接关闭连接或者采取其他措施以增强系统的安全防护。魔数的思想在压缩算法、Java Class 文件等场景中都有所体现,例如 Class 文件开头就存储了魔数 0xCAFEBABE,在加载 Class 文件时首先会验证魔数的正确性。协议版本号随着业务需求的变化,协议可能需要对结构或字段进行改动,不同版本的协议对应的解析方法也是不同的。所...