Netty网络编程(1)JavaNIO-2[Netty]
根据黑马程序员Netty教程学习所做笔记
Channel由java.nio.channels 包定义的。Channel 表示IO 源与目标打开的连接。
Channel 不同于传统的“流”。Channel 本身不能直接访问数据,Channel 只能与Buffer 进行交互
Channel就像是铁轨,Buffer就像是车厢,车厢中保存着数据
FileChannel
获取
不能直接打开 FileChannel,必须通过 FileInputStream、FileOutputStream 或者 RandomAccessFile 来获取 FileChannel,它们都有 getChannel 方法
通过 FileInputStream 获取的 channel 只能读
通过 FileOutputStream 获取的 channel 只能写
通过 RandomAccessFile 是否能读写根据构造 RandomAccessFile 时的读写模式决定
r w rw
读取
会从 channel 读取数据填充 ByteBuffer,返回值表示读到了多少字节,-1 表示到达了文件的末尾
1int readBytes = channel.read(buffer);
写入
写入的正确姿势如下, SocketChannel
1234567ByteBuffer buffer = ...;buffer.put(...); // 存入数据buffer.flip(); // 切换读模式while(buffer.hasRemaining()) { channel.write(buffer);}
在 while 中调用 channel.write 是因为 write 方法并不能保证一次将 buffer 中的内容全部写入 channel
关闭
channel 必须关闭,不过调用了 FileInputStream、FileOutputStream 或者 RandomAccessFile 的 close 方法会间接地调用 channel 的 close 方法
位置
获取当前位置
1long pos = channel.position();
设置当前位置
12long newPos = ...;channel.position(newPos);
设置当前位置时,如果设置为文件 ...
RabbitMQ流量削峰
本篇内容主要讲的就是错峰流控的问题
这个方面典型的使用场景就是秒杀业务用于流量削峰场景。
官方文档 https://rabbitmq.mr-ping.com/
那么,为什么是RabbitMQ?
几种常见MQ的对比:
RabbitMQ
ActiveMQ
RocketMQ
Kafka
公司/社区
Rabbit
Apache
阿里
Apache
开发语言
Erlang
Java
Java
Scala&Java
协议支持
AMQP,XMPP,SMTP,STOMP
OpenWire,STOMP,REST,XMPP,AMQP
自定义协议
自定义协议
可用性
高
一般
高
高
单机吞吐量
一般
差
高
非常高
消息延迟
微秒级
毫秒级
毫秒级
毫秒以内
消息可靠性
高
一般
高
一般
关于Erlang
Erlang - 维基百科,自由的百科全书 (wikipedia.org)
Erlang(/ˈɜːrlæŋ/)是一种通用的并发函数式程序设计语言。Erlang也可以指Erlang/OTP的通称,开源电信平台(OTP)是Erlang的常用执行环境及一系列标准组件。
Erlang 执行环境为专有以下要求的系统设计:
分布式运算
高故障容许度
软性即时运算
高可用性、不停运作的应用
热插拔,可以修改程序而不必停机
Erlang是运作于虚拟机的解释型语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)[4]开发的原生代码编译器,自R11B-4版本开始,Erlang也支持脚本方式执行。在编程范型上,Erlang属于多重典范编程语言,涵盖函数式、并行及分布式。循序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言。
简单提一下,本篇文章的背景是在线接口项目,业务场景有较高的并发需求,因此需要做一些限流 (限流通过springcloud gateway的Ratelimiter实现,原理是令牌桶算法),削峰等,类似于天行数据TianAPI - 开发者API数据平台
因此业务上对消息的延迟要求较高,并且rabbitmq较为适合中小型项目,刚好之前学过一点rabbitmq,因此这里使用rabbitmq也算是水到渠成
RabbitMQ入门 | dhx_'blog
简单介绍rabbitmq
R ...
Netty网络编程(1):JavaNIO基础-1[Netty]
根据黑马程序员Netty教程学习所做笔记
IO与NIO
Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以用于替代标准的Java IO API。
NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。
NIO
IO
面向流(Stream Oriented)
面向缓冲区(Buffer Oriented)
阻塞IO(Blocking IO)
非阻塞IO(Non Blocking IO)
选择器(Selectors
对于传统的IO流,如果我们想要把磁盘文件或者网络文件中的数据读取到程序中,需要建立一个用于传输数据的管道,
原来我们传输数据面对的直接就是管道里面一个个字节数据的流动(例如我们弄了一个 byte 数组,来回进行数据传递),
传统的 IO 它面对的就是管道里面的一个数据流动,因此我们说传统的的 IO 是面向流的。
IO流还有一个特点就是,它是单向的。
如果我们想把目标地点的数据读取到程序中来,我们需要建立一个管道,这个管道我们称为输入流。
如果我们想把程序中的数据想要写到目标地点去,我们也要再建立一个管道,这个管道我们称为输出流。
那么对于NIO (Non Blocking IO)
NIO的设计还是为了数据传输。对于channel,如果说之前的文件流类似于水流,那么channel就类似于铁路。对于铁路本身,他是不能直接传输数据的,需要我们配备上火车车厢,而channel的作用就是连接初始地点以及目标地点。因此注意通道本身不能传输数据,要想传输数据必须要有缓冲区。如果你想要把数据写入到文件中,那么就可以先把部分的数据写入到缓冲区中, 通过通道把这部分数据运输到目标的文件,反之亦然。因此说现在的面向缓冲区的传输方式是双向的。
通过下面的代码示例,可以帮助你更好的理解两者的区别。
使用IO流
12345678910111213141516static String fileName = "test.txt";static String resultFileName = "result.txt";static void readFile(){ try( FileInputStream fis = new File ...
应用层[计算机网络]
2.应用层
2.1 应用层协议原理
应用层对应用程序的通信提供服务。
应用层协议定义:
应用进程交换的报文类型,请求还是响应?
各种报文类型的语法,如报文中的各个字段及其详细描述。
字段的语义,即包含在字段中的信息的含义。
进程何时、如何发送报文,以及对报文进行响应的规则。
应用层的功能
对应的协议
文件传输,访问和管理
FTP
电子邮件
SMTP,POP3
虚拟终端
HTTP
查询服务和远程作业登录
网络应用模型
客户/服务器(C/S)模型
即客户(client)/服务器(server)模型。
服务器
一直运行
固定的IP地址和周知的端口号(约定)
扩展性:服务器场数据中心进行扩展扩展性差
客户端
主动与服务器通信
与互联网有间歇性的连接)
可能是动态IP地址
不直接与其它客户端通信
P2P模型
peer-to-peer
(几乎)没有一直运行的服务器
peer-to-peer简称P2P,即点对点技术。又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。
简单的说,P2P直接将人们联系起来,让人们通过互联网直接交互。P2P使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。
P2P就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载。
任意端系统之间可以进行通信
每一个节点既是客户端又是服务器
自扩展性-新peer节点带来新的
服务能力,当然也带来新的服务请求
参与的主机间歇性连接且可以改变地址
难以管理(缺点)
例子:Gnutella,迅雷
P2P的优势是在使用中对于运营者来说能解决带宽消耗大的问题,而对于用户来说是体验的提升。
除了在电视直播方面,其实P2P技术的应用还有很多领域,可以说只要有大文件分发传输的地方,都可以用到P2P技术。
常见的有:大型端游的分发更新、网吧游戏更新、科研数据资料、出版社的图文资料、视频的分发传输等等。
C/S和P2P体系结构的混合体
当然还有混合体,比如 Napster 是一种 p2p 的文件分发系统。它是美国西北大学一个本科生开发的,用于在校园网中分发免费的 MP3 音乐。
它的工作原理是什么呢?
注册、目录查询是 CS 的,文件下载是 ...
计算机网络概述[网络]
1.计算机网络概述
1、什么是Internet?
1.1 从具体构成角度
零件的角度
节点
主机及其上运行的应用程序
路由器、交换机等网络交换设备
边:通信链路
接入网链路:主机连接到互联网的链路
主干链路:路由器间的链路
协议
1.2 从网络互联设备的角度
协议控制发送 、接收消息
如TCP、IP、HTTP、FTP、PPP
Internet:"网络的网络“
松散的层次结构,互联的ISP
公共的Internet VS 专用的intranet
Internet 标准
RFC: Request for comments
IETF: Internet Engineering Task Force
1.3 协议
定义了在两个或多个通信实体(对等层的实体)之间交换的报文格式和次序,以及在报文传输和/或接受或其他事件方面所采取的动作;
1.4 从服务的角度
使用通信设施进行通信的分布式应用
Web、VoIP、email、分布式游戏、电子商务、社交平台……
通信基础设施为apps提供编程接口(通信服务)
将发送和接收数据的apps与互联网连接起来
为app应用提供服务类型、类似于邮政服务
无连接不可靠服务
面向连接的可靠服务
2、网络边缘
2.1 补充
网络结构
主机
应用程序
网络核心
互连着的路由器
网络的网络
接入网、物理媒体
有线或者无线通信链路
2.2 网络边缘
端系统(主机)
运行应用程序
如Web、email
在“网络的边缘”
客户/服务器模式
客户端向服务器请求、接受服务
如Web浏览器 / 服务器:email客户端 / 服务器
对等(peer-peer) 模式
很少(甚至没有)专门的服务器
如 Gnutella、KaZaA,Emule
每个节点既是服务器也是客户端,互相请求、分布式系统,无客户 / 服务器模式的缺陷如迅雷等。
2.3 网络边缘:采用网络设施的面向连接服务
目标:在端系统之间传输数据
握手:在数据传输之前做好准备
人类协议中:你好、你好
两个通信主机为连接建立状态
TCP-传输控制协议(Transmission Control Protocol)
Internet上面面向连接的服务
TCP服务
可靠的、按顺序地传送数 ...
使用jwt及Redis实现双token单点登录
使用jwt + Redis实现单点登录
结构设计
使用Redis存储JWT令牌,并为每个用户保存两个键值对:一个是访问令牌,一个是刷新令牌。
键(key)的格式为:access_token:userId 或 refresh_token:userId,其中userId是用户的唯一标识符。
例如,如果userId为123,则其访问令牌的键为access_token:123。
值(value)是JWT令牌本身,是一个字符串类型的值。
所有的键值对都设置了相同的过期时间,以确保在一定时间内自动清除失效的令牌。
分别生成了访问令牌和刷新令牌。访问令牌用于验证用户身份并访问受保护的资源,而刷新令牌用于获取新的访问令牌。
这里设置过期时间为 1 Day
引入依赖
123456789<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
JWT token结构
JWT 主要由三部分组成:头部、载荷和签名。
头部(Header) JWT 头部通常由两部分组成:令牌的类型(即 JWT)以及所使用的签名算法。例如:
1234{ "alg": "HS256", "typ": "JWT"}
上述头部指定了使用 HMAC-SHA256 算法进行签名,并且令牌的类型为 JWT。
载荷(Payload) JWT 载荷包含要传输的数据,可以包含注册的声明(建议但不强制),用户自定义的声明以及一些预定义的声明。
12345678910{ exp, // 过期时间,这个过期时间必须要大于签发时间 iat, // 签发时间 [data, ...
lc-go(1)
目的是通过写lc来提交对golang语法的熟悉程度
题目
344. 反转字符串
难度简单740
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。
本题比较简单, 需要注意的就是GO里面没有while关键字, 通过for来循环
123456789func reverseString(s []byte) { i:=0 j:=len(s)-1 for i<j { s[i],s[j]=s[j],s[i] i++ j-- }}
376. 摆动序列
难度中等889
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 **摆动序列 。**第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。
例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。
相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。
给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。
本题的关键点在于题目的要求的是求序列的长度, 因此我们不需要统计全部, 只需要两个up , down变量分别统计 最后一个元素为上升/下降的序列的长度 ,
然后通过前一个变量来判断当前的元素应该放到升/降序列中 , 最后返回两个序列的最大长度即可
注意math.Max( ) 的参数为float64类型
事实上math package中的绝大多数方法的参数的类型都是float64 详细参考 math package - math - Go Packages
123456789101112func wiggleMaxLength(nums []int) int { up := 1 down := 1 for i := 1; i & ...
go快速入门
考虑到java竞争过于激烈 , 很多情况会造成不必要的内卷, 因此打算扩充知识面, 简单学习go语言 , 为日后做打算
[toc]
环境搭建
Downloads - The Go Programming Language (google.cn)
这里我的系统是windows10 , 因此选择OS 为 Windows的压缩包 , 下载解压到磁盘
这里放到了D盘
接下来来配置环境变量 , 直接搜索
指定go的bin目录 , 点击确定
同时我们还需要配置GOROOT以及GOPATH
GOPATH顾名思义就是我们go的工作目录 , 如果不配置的话就会需要反复下载依赖 , 非常麻烦
接下来我们还需要进行一些配置
我们打开windowsPowerShell , 输入
$env:GO111MODULE = "on"
$env:GOPROXY "http://goproxy.cn"
输入go env检测我们是否设置成功
前者是设置 模块管理 , 后者是设置 代理
使用go mod管理需要 科学上网
gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance – up to 40 times faster. If you need smashing performance, get yourself some Gin. (github.com)
git clone 下载gin
goroot就是go安装的根目录,gopath就是go项目所在的路径,高版本go项目已经不再依赖gopath来管理项目,使
用go mod:来管理项目。
win+R cmd 输入go version , 出现了版本信息表明语言环境搭建成功
配置vscode
jetbrains也有go语言对应的ide , goland , 不过考虑到jb家的ide普遍占用过高, 因此这里暂时先用vscode进行语言层面的学习, 等到日后进行go项目开发再去使用ide。
在vscode商店搜索go , 选中下载量最高的那个插件下载 ,
其实多下载几个也没什么事, 根据个人选 ...
利用AOP进行日志统计
日志级别
TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
AOP+注解
下面给出一个简单的日志示例
AOP面向切面编程包含三步
定义切面
切面逻辑
织入 (spring帮助我们完成)
首先定义SysLog注解如下
123456@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface SysLog { String value() default "";}
接着我们定义AOP类
123456789101112131415161718192021222324252627282930@Aspect@Component@Slf4jpublic class SysLogAOP { // 定义切面 @Pointcut("@annotation(com.danxiaocampus.api.common.annotation.SysLog)") public void logPointcut(){ } @Around(value= "logPointcut()") public Object run(ProceedingJoinPoint joinPoint) throws Throwable { Object[] args = joinPoint.getArgs(); Signature signature = joinPoint.getSignature();//方法签名 Method method = ( (MethodSignature)signature ).getMethod(); //这个方法才是目标对象上有注解的方法 Method realMethod = joinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), method.getParameterTypes()); Annotation[] annotations = realMethod.getAnnotations(); ...
在云服务器部署Alist实现文件站点
AList
Alist是一款非常强大的开源个人文件管理软件 , 一个支持多种存储,支持网页浏览和 WebDAV 的文件列表程序,由 gin 和 Solidjs 驱动。
官网 Home | AList Docs (nn.ci)
centos 7 安装
curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install快速安装
仅适用于 Linux amd64/arm64 平台。
安装
1curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install
复制
更新
1curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s update
复制
卸载
1curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s uninstall
复制
默认安装在 {/opt/alist} 中
如果下载失败 , 参考官方文档手动安装手动安装 | AList文档 (nn.ci)
123sudo firewall-cmd --add-port=5244/tcp --permanent # 开放5244端口firewall-cmd --reload # 重新加载防火墙firewall-cmd --list-all # 查看端口是否开放成功
如果出现上面的结果, 说明5244端口开发成功
接着我们访问
即可见到下面的界面
如果没有显示登录账户以及密码, 我们cd /opt/alist
然后输入./adlist admin 即可获得账户以及密码 , 登录进去就可以看到主页
添加阿里云盘open
接着我们访问/@manage/settings/0 , 进入alist的后台界面
点击存储 , 选择添加
这里我们选择阿里云盘OPEN, 阿里云盘 Open | AList文档 (nn.ci)
填入我们指定的信息即可
注意需要通过Get Aliyundrive Refresh Token | AList Docs (nn.ci) 来获取阿里云盘的refresh_token
绑定结束之后 , 记得需要在阿里云盘中添加指定的目录 , 这里我的目录为alist
接着我们访问主页 , 即可看到刚刚我们添加的 ...

![Netty网络编程(1)JavaNIO-2[Netty]](https://dhx-blog.oss-cn-beijing.aliyuncs.com/dhx/e017d5fed2K88RY.jpg)

![Netty网络编程(1):JavaNIO基础-1[Netty]](https://dhx-blog.oss-cn-beijing.aliyuncs.com/dhx/36831cc403Yf9A3.jpg)
![应用层[计算机网络]](https://dhx-blog.oss-cn-beijing.aliyuncs.com/dhx/wallhaven-5wr3m7.jpg)








