SpringBoot获取有特定注解的Bean
前言
这里发一个案例,获取 RestController
注解的所有bean
。
代码
1 | import org.springframework.context.ApplicationListener; |
这里发一个案例,获取 RestController
注解的所有bean
。
1 | import org.springframework.context.ApplicationListener; |
RBAC是Role Based Access Control的缩写,是基于角色的访问控制。一般都是分为用户(user),
角色(role),权限(permission)三个实体,角色(role)和权限(permission)是多对多的
关系,用户(user)和角色(role)也是多对多的关系。用户(user)和权限(permission)
之间没有直接的关系,都是通过角色作为代理,才能获取到用户(user)拥有的权限。
在终端(黑框框)输入如下命令:
1 | bash <(curl -sL https://raw.githubusercontent.com/hijkpw/scripts/master/centos_install_v2ray.sh) |
成功后输出:
1 | v2ray运行状态:正在运行 |
防火墙
1 | firewall-cmd --permanent --add-port=8888/tcp |
ss -ntlp | grep v2ray
命令可以查看v2ray是否正在运行。如果输出为空,大概率是被selinux限制了,解决办法如下:
setenforce 0
;systemctl restart v2ray
服务器的 /etc/v2ray/config.json
1 | { |
\1. 查看v2ray配置/运行状态:bash <(curl -sL https://raw.githubusercontent.com/hijkpw/scripts/master/centos_install_v2ray.sh) info
;
\2. v2ray管理命令:启动:systemctl start v2ray
,停止:systemctl stop v2ray
,重启:systemctl restart v2ray
;
\3. 更改端口、alterid最简单的办法:重新运行一键脚本;
\4. 更新v2ray到最新版:bash <(curl -L -s https://install.direct/go.sh)
\5. 卸载v2ray: bash <(curl -sL https://raw.githubusercontent.com/hijkpw/scripts/master/centos_install_v2ray.sh) uninstall
下载地址 https://github.com/v2ray/v2ray-core/tags
1 | wget https://install.direct/go.sh |
go.sh 需要配置地址 LOCAL为对应v2ray-linux64.zip
详细配置
1 | PROXY='' |
安装
1 | sudo bash go.sh |
其它令名
1 | systemctl enable v2ray # 设置开机自启 |
查看v2ray服务运行端口:
1 | sudo netstat -tunlp | grep v2ray |
客户端 /etc/v2ray/config.json
1 | { |
Java 自定义序列化时的原理:
记录自己在Linux上打包APK的过程。
ArchLinux 下直接可以安装 sudo pacman -S android-sdk
其它发行版百度可以解决;
1 | sdkmanager "build-tools;26.0.0" |
1 | cordova platform rm android |
gulp build:android
是自定义脚本
主要执行三步操作:
‘cordova-build:android’ 打包
‘zipalign’ 签名
‘apksigner:sign’ 签名
已有 Angular
项目,使用 Cordova
打包成 APP
。
Angular version = 11.2.10
Cordova version = 10.0.0
Cordova
项目Angular
项目名称相同gradle-6.5-all.zip timtout
1 | Downloading https://services.gradle.org/distributions/gradle-6.5-all.zip failed: timeout |
直接浏览器下载,然后放入路径
1 | /home/maxzhao/.gradle/wrapper/dists/gradle-6.5-all/2oz4ud9k3tuxjg84bbf55q0tn |
GRADLE_USER_HOME
可以修改面上的路径。
gradle
使用 阿里云镜像1 | buildscript { |
备用
1 | maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } |
当前主要记录问题的发现过程以及解决过程,其中包含关键性的代码(也包含错误代码)。
主线任务外的分析过程省略,但会展示部分的分析结果。
有一个文件服务,这个文件服务可以对接多种存储,所以我们封装了上传、下载文件的方法。
上传、下载文件是没什么问题的,问题出现在了使用 与 标签上。
标签的 src
指向音频(视频)文件的下载地址。
备注:如果这里不是通过下载地址返回文件流,下面的叙述就可以不用看了。
1 | public class FileSystemController { |
此时会发现,所有的音频(视频)文件流 src
都是播放不了的。
如果仔细探究当前代码,会发现当前会返回”多余的结果”,由此猜测:这些”多余的结果”导致无法直接播放音频(视频),图片也是一样的道理。
第二个版本对音频(视频)文件做了分片处理
1 | public class FileSystemController { |
50KB
时,会出现异常情况,比如:全是杂音、播放出错;经过长时间的测试,发现了不少现象:
app
与文件服务在同一台设备上);50KB
时,会出现杂音、播放出错、时长不够、重复播放片段;这些问题的出现,主要在app
与文件服务是否在统一服务器上;
app
与文件服务部署在同一台服务器上;app
与文件服务部署在不同服务器上;针对这个相同服务器与不同服务器的请求进行分析,得出几种结论:
header
中的range
为 bytes=0-
;range 0-1
请求当前文件是否存在。range 0-3000
请求当前文件(3000
是文件大小,也就是header
中的ContentLength
)。range 0-1
请求当前文件是否存在。——请求正常返回range 0-3000
请求当前文件。——请求错误range 588-2563
分片请求当前文件。——请求正常返回range 2563-3000
分片请求当前文件。——请求正常返回经过一番风雨发现:
分片操作不对,在分片时,需要根据分片的大小,读取文件不同的片段。
改动后的代码:
1 | public class FileSystemController { |
这里会把当前苹果设备请求的分片大小,写到输出流中。
苹果设备在测试情况2中,会发送多次请求获取文件:
range 0-1
请求当前文件是否存在。——请求正常返回range 0-3000
请求当前文件。——请求错误range 588-2563
分片请求当前文件。——请求正常返回range 2563-3000
分片请求当前文件。——请求正常返回这里的问题主要体现在文件分片的逻辑错误,在苹果设备外的其它设备上,是体现不出当前分片效果的。
为什么要做一个IM
?这个想法是从一个聊天项目开始,公司原来的聊天项目已破败不堪,继续优化不如重构。经过一番了解,决定构建一个即时通讯,并在此基础上扩展聊天功能。
目前网络上的IM
案例数不胜数,参考网络中众多的案例并结合自身业务需要,来构建属于自己的IM
系统。
举个例子:
我们年会有红包抽奖活动,有999红包10个 ,888红包20个,88红包50个,8红包1000个,我们需要实时看到每种红包剩余数量。
整体项目构建目标:
IM
)。IM-Chat
)在移动端,长连接是未来趋势,并且比Http
请求的数据量更小(像WebSocket
,连接只需要一个 headers
)。
WS
HTML5
TCP
/HTTPS
Android
/IOS
Android/IOS
离线推送后台管理系统:指的是IM
全局管理系统,包括租户管理、租户的应用管理等。
应用管理系统:指的是IM
租户管理当前租户应用的系统。
应用:指的是租户创建的IM
应用,IM
允许跨应用之间的通信,IM-Chat
则不允许跨应用添加好友。
如今高度信息化的互联网时代,生活中Instant Messaging
与我们息息相关,例如微信、钉钉等以 IM
系统为核心的产品。像一些游戏、社交软件都离不开 IM
。
IM
从早起的 QQ
、飞信等发展到现在,软件架构也不断的在迭代,从早期的CS、P2P演变到现在,后台已经成为了一个复杂的分布式系统,涉及网络通讯、移动端、安全、存储、检索等技术。
IM
系统中最核心的是消息系统,消息系统的核心功能有消息的同步、存储和检索;
下面就基于社区比较火的 Timeline
模型来构建消息系统(不依赖 TableStore
)。
主要区别就是 现代架构下,消息是先存储后同步,消息不会丢失,多端同步、消息检索都是全量消息存储带来的好处。
现在架构下最大的挑战就是消息管理和索引。
Timeline
模型Timeline
模型是针对消息数据场景所新创的一个数据模型,它的特色在于能够满足消息数据场景对消息保序、海量消息存储、实时同步的特殊需求。
Timeline
的构成主要包括:
Timeline ID
:唯一标识Timeline的ID。Timeline Meta
:Timeline
的元数据,元数据内可包含任意键值对属性。Message Sequence
:消息队列,承载该Timeline下的所有消息。消息在队列里有序保存,并且根据写入顺序分配自增的ID。一个消息队列可承载的消息个数无上限,在消息队列内部可根据消息ID随机定位某条消息,并提供正序或者反序扫描。Message Entry
:消息体,包含消息的具体内容,可以包含任意键值对。消息同步可以基于 Timeline
实现,搭配 ack
机制,无障碍拉取各端消息。
消息存储可以基于 Timeline
实现,持久化所有数据。
消息检索一般基于消息内容和消息类型来灵活检索。
消息存储要求每个会话都对应一个 Timeline
,消息根据会话顺序排序,然后持久化存储。
消息同步模型一般有读扩散(也叫拉模式)和写扩散(也叫推模式)两种不同的方式。
Timeline
中保存了这个会话的全量消息。读扩散的消息同步模式下,每个会话中产生的新的消息,只需要写一次到其用于存储的 Timeline 中,接收端从这个 Timeline
中拉取新的消息。优点是消息只需要写一次,相比写扩散的模式,能够大大降低消息写入次数,特别是在群消息这种场景下。但其缺点也比较明显,接收端去同步消息的逻辑会相对复杂和低效。接收端需要对每个会话都拉取一次才能获取全部消息,读被大大的放大,并且会产生很多无效的读,因为并不是每个会话都会有新消息产生。Timeline
来专门用于消息同步,通常是每个接收端都会拥有一个独立的同步 Timeline
(或者叫收件箱),用于存放需要向这个接收端同步的所有消息。每个会话中的消息,会产生多次写,除了写入用于消息存储的会话 Timeline
,还需要写入需要同步到的接收端的同步 Timeline
。在个人与个人的会话中,消息会被额外写两次,除了写入这个会话的存储 Timeline
,还需要写入参与这个会话的两个接收者的同步 Timeline
。而在群这个场景下,写入会被更加的放大,如果这个群拥有 N 个参与者,那每条消息都需要额外的写 N 次。写扩散同步模式的优点是,在接收端消息同步逻辑会非常简单,只需要从其同步 Timeline
中读取一次即可,大大降低了消息同步所需的读的压力。其缺点就是消息写入会被放大,特别是针对群这种场景。Timeline
模型不会对选择读扩散还是写扩散做约束,而是能同时支持两种模式,因为本质上两种模式的逻辑数据模型并无差别,只是消息数据是用一个 Timeline
来支持多端读还是复制到多个 Timeline 来支持多端读的问题。
IM
消息系统用,通常选择写扩散,消息一般写入一次,频繁读取,典型的读多写少的场景。大大增加了读的性能,用空间换时间。但是对于万人大群,读扩散又是一个好的选择。
如图是一个典型的消息系统架构,架构中包含几个重要组件:
Timeline
进行消息存储,存储的消息建立索引来实现消息检索。对于在线的设备,可以由消息服务器主动推送至在线设备端。对于离线设备,登录后会主动向服务端同步消息。每个设备会在本地保留有最新一条消息的顺序 ID
,向服务端同步该顺序 ID
后的所有消息。
TableStore
消息系统最核心的两个库是消息同步库和消息存储库,两个库对数据库有不同的要求:
消息同步库 | 消息存储库 | |
---|---|---|
数据模型 | Timeline模型 | Timeline模型 |
写能力 | 高并发写,十万级TPS | 高并发写,少量读,万级TPS |
读能力 | 高并发范围读,十万级TPS | 少量范围读,千级TPS |
存储规模 | 保存一段时间内的同步消息,TB级。保留千万级的Timeline 规模。 |
保存全量消息,百TB级。保留亿级的Timeline 规模。 |
总结下来,对数据库的要求有如下几点:
Timeline
模型的功能要求:不要求关系模型,能够实现队列模型,并能够支持生成自增的SeqId
。阿里云表格存储(TableStore
)是基于LSM
存储引擎的分布式NoSQL
数据库,支持百万TPS
高并发读写,PB
级数据存储,数据支持TTL
,能够很好的满足以上需求,并且支持自增列,能够非常完美的设计和实现Timeline的物理模型。
消息同步库 | 消息存储库 | |
---|---|---|
数据模型 | MongoDB | MySQL |
写能力 | 高并发写,万级TPS | 高并发写,少量读,千级TPS |
读能力 | 高并发范围读,万级TPS | 少量范围读,千级TPS |
存储规模 | 保存一段时间内的同步消息,GB级。 | 保存全量消息,GB级。 |
在写能力与读能力上,基于目前所用服务器的性能标准,在目标上与TableStore
存储有巨大差距。