SpringBoot-扩展点
参考文献
SpringBoot—扩展接口
SpringBoot扩展点
ApplicationContextInitializer
BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor
InstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor
BeanFactoryAware
ApplicationContextAwareProcessor
BeanNameAware
InitializingBean
FactoryBean
SmartInitializingSingleton
CommandLineRunner
DisposableBean
ApplicationListener
ApplicationContextInitializer
123456package org.springframework.context;@FunctionalInterfacepublic interface Application ...
Netty-实现基于WebSocket+Protobuf的消息推送系统
参考文献
项目结构
该项目主要分两个部分message-server和message-client
message-client: 基于Netty实现的WebSocket客户端,具有与message-server交互的功能.
message-server: 基于SpringBoot结合Netty实现的WebSocket服务端.
核心代码
消息格式定义
12345678910111213141516171819202122232425262728syntax = "proto3";package protocol;option optimize_for = SPEED;option java_package = "cn.holelin.messagepushnetty.protocol";option java_outer_classname = "MessageProtocol";// 消息格式message MessageProto{ // 消息的唯一Id可以用 UUID 表示 string mes ...
Netty(二)-Netty粘包半包
参考文献
粘包现象
粘包现象指的是发送方在一次发送中,将多个数据包粘在一起发送,接收方在接收数据时可能会将多个数据包看作一个数据包进行处理,导致数据解析错误的情况.这种现象通常出现在TCP协议中,由于TCP是面向流的协议,它会将应用层传递的数据流拆分成多个数据包进行传输,而接收方并不知道这些数据包的边界,因此可能会将多个数据包看作一个数据包进行处理.
发送 abc def,接收 abcdef
粘包产生的原因
应用层缓冲区:接收方 ByteBuf 设置太大(Netty 默认 1024),即数据包大小小于应用层缓冲区,多个数据包黏在一起.
滑动窗口:假设发送方 256 bytes 表示一个完整报文,但由于接收方处理不及时且窗口大小足够大,这 256 bytes 字节就会缓冲在接收方的滑动窗口中,当滑动窗口中缓冲了多个报文就会粘包
Nagle 算法:会造成粘包
发送方发送速率过快:如果发送方发送数据的速率过快,接收方可能无法及时处理所有的数据包,就会导致多个数据包被合并成一个数据包发送,从而产生粘包现象.
网络拥塞:如果网络拥塞,数据包的传输可能会受到阻碍,TCP协议为了减少网络传输的 ...
Netty-Netty编解码
参考文献
Netty实战
黑马Netty
什么是编解码器
每个网络应用程序都必须定义如何解析在两个节点之间来回传输的原始字节,以及如何将其和目标应用程序的数据格式做相互转换.这种转换逻辑由编解码器处理,编解码器由编码器和解码器组成,它们每种都可以将字节流从一种格式转换为另一种格式.
如果将消息看作是对于特定的应用程序具有具体含义的结构化的字节序列—它的数据.那么编码器是将消息转换为适合于传输的格式(最有可能的就是字节流);而对应的解码器则是将网络字节流转换回应用程序的消息格式.因此,编码器操作出站数据,而解码器处理入站数据
Netty编码器
Netty提供的编码器:
MessageToByteEncoder: 将指定类型的Java对象转换为ByteBuf对象,常用于自定义协议的编码.
ByteToMessageEncoder: 将ByteBuf对象转换为指定类型的Java对象,常用于自定义协议的解码.
MessageToMessageEncoder: 将一种类型的Java对象编码为另一种类型的Java对象,常用于协议转换或数据转换的场景
比较推荐的做法是使用 ...
Netty-概览
参考文献
新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析
Netty实战
Netty架构图
Netty源码结构
12345678910111213141516171819202122232425 Transport Services Protocol Support+----------------------------------------------+---------------------------------------------------------+| io.netty.transport | io.netty.codec || io.netty.transport.epoll | io.netty.codec.dns ...
OSS工具-rclone
参考文献
rclone
Install
rclone
安装
使用一键安装脚本
1sudo -v ; curl https://rclone.org/install.sh | sudo bash
使用二进制文件安装
1234567891011121314# 获取二进制压缩包,并解压curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zipunzip rclone-current-linux-amd64.zipcd rclone-*-linux-amd64# 将rclone命令放入全局命令目录,并赋予权限sudo cp rclone /usr/bin/sudo chown root:root /usr/bin/rclonesudo chmod 755 /usr/bin/rclone# 安装manpagesudo mkdir -p /usr/local/share/man/man1sudo cp rclone.1 /usr/local/share/man/man1/sudo mandb
配置
rc ...
SpringBoot-注解@Scheduled
参考文献
@Scheduled
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Repeatable(Schedules.class)public @interface Scheduled { String CRON_DISABLED = ScheduledTaskRegistrar.CRON_DISABLED; // 该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义. /** * A cron-like expression, extending the usual UN*X definition to include trigger ...
RabbitMQ-配置SSL
参考文献
TLS Support
RabbitMQ使用TLS支持SSL加密处理
https://docs.oracle.com/cd/E19509-01/820-3503/ggfen/index.html
Java Keytool Essentials: Working with Java Keystores
https://github.com/securitysushi/rabbitmq-ssl-example
运维侧配置
使用TSL工具生成证书
1234567git clone https://github.com/rabbitmq/tls-gen tls-gencd tls-gen/basic# private key passwordmake PASSWORD=bunniesmake verifymake infols -l ./result
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626 ...
JVM-Java语法糖
参考文献
不了解这12个语法糖,别说你会Java!
语法糖
语法糖的存在主要是方便开发人员使用,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖
Java支持的语法糖
switch 支持 String 与枚举
对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byte。short,char(ackii码是整型)以及int
泛型
通常情况下,一个编译器处理泛型有两种方式:Code specialization和Code sharing。
C++和C#是使用Code specialization的处理机制,而Java使用的是Code sharing的机制。
Code sharing方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除(type erasue)实现的。
也就是说,对于Java虚拟机来说,他根本不认识Map<String, String> map这样的语法。需要在编译阶 ...
解决方案-网关
参考文献
网关系统就该这么设计(万能通用),稳的一批!