技术文档收录
ASCII
Tcpdump
IPV4保留地址段
深入理解以太网网线原理 - 三帛的世界
Linux
WireGuard 一键安装脚本 | 秋水逸冰
SSH Config 那些你所知道和不知道的事 | Deepzz's Blog
Linux 让终端走代理的几种方法
ubuntu 20.04 server 版设置静态 IP 地址 - 链滴
Linux 挂载 Windows 共享磁盘的方法 - 技术学堂
将 SMB/CIFS 网络硬盘永久的挂载到 Ubuntu 上 - 简书
linux 获取当前脚本的绝对路径 | aimuke
[Linux] Linux 使用 / dev/urandom 生成随机数 - piaohua's blog
Linux 生成随机数的多种方法 | Just Do It
Linux 的 Centos7 版本下忘记 root 或者普通用户密码怎么办?
Git 强制拉取覆盖本地
SSH 安全加固指南 - FreeBuf 网络安全行业门户
Linux 系统安全强化指南 - FreeBuf 网络安全行业门户
Linux 入侵排查 - FreeBuf 网络安全行业门户
sshd_config 配置详解 - 简书
SSH 权限详解 - SegmentFault 思否
CentOS 安装 node.js 环境 - SegmentFault 思否
如何在 CentOS 7 上安装 Node.js 和 npm | myfreax
几款 ping tcping 工具总结
OpenVpn 搭建教程 | Jesse's home
openvpn 一键安装脚本 - 那片云
OpenVPN 解决 每小时断线一次 - 爱开源
OpenVPN 路由设置 – 凤曦的小窝
OpenVPN 设置非全局代理 - 镜子的记录簿
TinyProxy 使用帮助 - 简书
Ubuntu 下使用 TinyProxy 搭建代理 HTTP 服务器_Linux_运维开发网_运维开发技术经验分享
Linux 软件包管理工具 Snap 常用命令 - 简书
linux systemd 参数详解
Systemd 入门教程:命令篇 - 阮一峰的网络日志
记一次 Linux 木马清除过程
rtty:在任何地方通过 Web 访问您的终端
02 . Ansible 高级用法 (运维开发篇)
终于搞懂了服务器为啥产生大量的 TIME_WAIT!
巧妙的 Linux 命令,再来 6 个!
77% 的 Linux 运维都不懂的内核问题,这篇全告诉你了
运维工程师必备:请收好 Linux 网络命令集锦
一份阿里员工的 Java 问题排查工具单
肝了 15000 字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收
作业调度算法(FCFS,SJF,优先级调度,时间片轮转,多级反馈队列) | The Blog Of WaiterXiaoYY
看了这篇还不会 Linux 性能分析和优化,你来打我
2019 运维技能风向标
更安全的 rm 命令,保护重要数据
求你了,别再纠结线程池大小了!
Linux sudo 详解 | 失落的乐章
重启大法好!线上常见问题排查手册
sudo 使用 - 笨鸟教程的博客 | BY BenderFly
shell 在手分析服务器日志不愁? - SegmentFault 思否
sudo 与 visudo 的超细用法说明_陈发哥 007 的技术博客_51CTO 博客
ESXI 下无损扩展 Linux 硬盘空间 | Naonao Blog
Linux 学习记录:su 和 sudo | Juntao Tan 的个人博客
使用者身份切换 | Linux 系统教程(笔记)
你会使用 Linux 编辑器 vim 吗?
在 Windows、Linux 和 Mac 上查看 Wi-Fi 密码
linux 隐藏你的 crontab 后门 - 简书
Linux 定时任务详解 - Tr0y's Blog
linux 的 TCP 连接数量最大不能超过 65535 个吗,那服务器是如何应对百万千万的并发的?_一口 Linux 的博客 - CSDN 博客_tcp 连接数多少正常
万字长文 + 28 张图,一次性说清楚 TCP,运维必藏
为什么 p2p 模式的 tunnel 底层通常用 udp 而不是 tcp?
记一次服务器被入侵挖矿 - tlanyan
shell 判断一个变量是否为空方法总结 - 腾讯云开发者社区 - 腾讯云
系统安装包管理工具 | Escape
编译代码时动态地链接库 - 51CTO.COM
甲骨文 Oracle Cloud 添加新端口开放的方法 - WirelessLink 社区
腾讯云 Ubuntu 添加 swap 分区的方法_弓弧名家_玄真君的博客 - CSDN 博客
Oracle 开放全部端口并关闭防火墙 - 清~ 幽殇
谁再说不熟悉 Linux 命令, 就把这个给他扔过去!
即插即用,运维工程师必会正则表达式大全
Shell脚本编写及常见面试题
Samba 文件共享服务器
到底一台服务器上最多能创建多少个 TCP 连接 | plantegg
SSH 密钥登录 - SSH 教程 - 网道
在 Bash 中进行 encodeURIComponent/decodeURIComponent | Harttle Land
使用 Shell 脚本来处理 JSON - Tom CzHen's Blog
Docker
「Docker」 - 保存镜像 - 知乎
终于可以像使用 Docker 一样丝滑地使用 Containerd 了!
私有镜像仓库选型:Harbor VS Quay - 乐金明的博客 | Robin Blog
exec 与 entrypoint 使用脚本 | Mr.Cheng
Dockerfile 中的 CMD 与 ENTRYPOINT
使用 Docker 配置 MySQL 主从数据库 - 墨天轮
Alpine vs Distroless vs Busybox – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
再见,Docker!
docker save 与 docker export 的区别 - jingsam
如何优雅的关闭容器
docker 储存之 tmpfs 、bind-mounts、volume | 陌小路的个人博客
Dockerfile 中 VOLUME 与 docker -v 的区别是什么 - 开发技术 - 亿速云
理解 docker 容器的退出码 | Vermouth | 博客 | docker | k8s | python | go | 开发
【Docker 那些事儿】容器监控系统,来自 Docker 的暴击_飞向星的客机的博客 - CSDN 博客
【云原生】Docker 镜像详细讲解_微枫 Micromaple 的博客 - CSDN 博客_registry-mirrors
【云原生】Helm 架构和基础语法详解
CMD 和 Entrypoint 命令使用变量的用法
实时查看容器日志 - 苏洋博客
Traefik 2 使用指南,愉悦的开发体验 - 苏洋博客
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
【云原生】镜像构建实战操作(Dockerfile)
Docker Compose 中的 links 和 depends_on 的区别 - 编程知识 - 白鹭情
Python
Pipenv:新一代Python项目环境与依赖管理工具 - 知乎
Python list 列表实现栈和队列
Python 各种排序 | Lesley's blog
Python 中使用 dateutil 模块解析时间 - SegmentFault 思否
一个小破网站,居然比 Python 官网还牛逼
Python 打包 exe 的王炸 - Nuitka
Django - - 基础 - - Django ORM 常用查询语法及进阶
[Python] 小知識:== 和 is 的差異 - Clay-Technology World
Window
批处理中分割字符串 | 网络进行时
Windows 批处理基础命令学习 - 简书
在Windows上设置WireGuard
Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
windows 重启 rdpclip.exe 的脚本
中间件
Nginx 中的 Rewrite 的重定向配置与实践
RabbitMQ 的监控
RabbitMq 最全的性能调优笔记 - SegmentFault 思否
为什么不建议生产用 Redis 主从模式?
高性能消息中间件——NATS
详解:Nginx 反代实现 Kibana 登录认证功能
分布式系统关注点:仅需这一篇,吃透 “负载均衡” 妥妥的
仅需这一篇,妥妥的吃透” 负载均衡”
基于 nginx 实现上游服务器动态自动上下线——不需 reload
Nginx 学习书单整理
最常见的日志收集架构(ELK Stack)
分布式之 elk 日志架构的演进
CAT 3.0 开源发布,支持多语言客户端及多项性能提升
Kafka 如何做到 1 秒处理 1500 万条消息?
Grafana 与 Kibana
ELK 日志系统之通用应用程序日志接入方案
ELK 简易 Nginx 日志系统搭建: ElasticSearch+Kibana+Filebeat
记一次 Redis 连接池问题引发的 RST
把 Redis 当作队列来用,你好大的胆子……
Redis 最佳实践:业务层面和运维层面优化
Redis 为什么变慢了?常见延迟问题定位与分析
好饭不怕晚,扒一下 Redis 配置文件的底 Ku
rabbitmq 集群搭建以及万级并发下的性能调优
别再问我 Redis 内存满了该怎么办了
Nginx 状态监控及日志分析
uWSGI 的安装及配置详解
uwsgi 异常服务器内存 cpu 爆满优化思路
Uwsgi 内存占用过多 - 简书
Nginx 的 limit 模块
Nginx 内置模块简介
Redis 忽然变慢了如何排查并解决?_redis_码哥字节_InfoQ 写作社区
领导:谁再用 redis 过期监听实现关闭订单,立马滚蛋!
Nginx 限制 IP 访问频率以及白名单配置_问轩博客
Nginx $remote_addr 和 $proxy_add_x_forwarded_for 变量详解
Caddy 部署实践
一文搞定 Nginx 限流
数据库
SqlServer 将数据库中的表复制到另一个数据库_MsSql_脚本之家
SQL Server 数据库同步,订阅、发布、复制、跨服务器
sql server 无法删除本地发布 | 辉克's Blog
SQLite全文检索
SQL 重复记录查询的几种方法 - 简书
SQL SERVER 使用订阅发布同步数据库(转)
Mysql 查看用户连接数配置及每个 IP 的请求情况 - 墨天轮
优化 SQL 的 21 条方案
SQL Server 连接时好时坏的奇怪问题
MS SQL 执行大脚本文件时,提示 “内存不足” 的解决办法 - 阿里云开发者社区
防火墙-iptables
iptables 常用规则:屏蔽 IP 地址、禁用 ping、协议设置、NAT 与转发、负载平衡、自定义链
防火墙 iptables 企业防火墙之 iptables
Linux 防火墙 ufw 简介
在 Ubuntu 中用 UFW 配置防火墙
在 Ubuntu20.04 上怎样使用 UFW 配置防火墙 - 技术库存网
监控类
开箱即用的 Prometheus 告警规则集
prometheus☞搭建 | zyh
docker 部署 Prometheus 监控服务器及容器并发送告警 | chris'wang
PromQL 常用命令 | LRF 成长记
prometheus 中使用 python 手写 webhook 完成告警
持续集成CI/CD
GitHub Actions 的应用场景 | 记录干杯
GithubActions · Mr.li's Blog
工具类
GitHub 中的开源网络广告杀手,十分钟快速提升网络性能
SSH-Auditor:一款 SHH 弱密码探测工具
别再找了,Github 热门开源富文本编辑器,最实用的都在这里了 - srcmini
我最喜欢的 CLI 工具
推荐几款 Redis 可视化工具
内网代理工具与检测方法研究
环境篇:数据同步工具 DataX
全能系统监控工具 dstat
常用 Web 安全扫描工具合集
给你一款利器!轻松生成 Nginx 配置文件
教程类
Centos7 搭建神器 openvpn | 运维随笔
搭建 umami 收集个人网站统计数据 | Reorx’s Forge
openvpn安装教程
基于 gitea+drone 完成小团队的 CI/CD - 德国粗茶淡饭
将颜色应用于交替行或列
VMware Workstation 全系列合集 精简安装注册版 支持 SLIC2.6、MSDM、OSX 更新 16.2.3_虚拟机讨论区_安全区 卡饭论坛 - 互助分享 - 大气谦和!
在 OpenVPN 上启用 AD+Google Authenticator 认证 | 运维烂笔头
Github 进行 fork 后如何与原仓库同步:重新 fork 很省事,但不如反复练习版本合并 · Issue #67 · selfteaching/the-craft-of-selfteaching
卧槽,VPN 又断开了!!- 阿里云开发者社区
Grafana Loki 学习之踩坑记
zerotier 的 planet 服务器(根服务器)的搭建踩坑记。无需 zerotier 官网账号。
阿里云 qcow2 镜像转 vmdk,导入 ESXi - 唐际忠的博客
Caddy 入门 – 又见杜梨树
【Caddy2】最新 Caddy2 配置文件解析 - Billyme 的博客
Web 服务器 Caddy 2 | Haven200
手把手教你打造高效的 Kubernetes 命令行终端
Keras 作者:给软件开发者的 33 条黄金法则
超详细的网络抓包神器 Tcpdump 使用指南
使用 fail2ban 和 FirewallD 黑名单保护你的系统
linux 下 mysql 数据库单向同步配置方法分享 (Mysql)
MySQL 快速删除大量数据(千万级别)的几种实践方案
GitHub 上的优质 Linux 开源项目,真滴牛逼!
WireGuard 教程:使用 Netmaker 来管理 WireGuard 的配置 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Tailscale 基础教程:Headscale 的部署方法和使用教程 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Nebula Graph 的 Ansible 实践
改进你的 Ansible 剧本的 4 行代码
Caddy 2 快速简单安装配置教程 – 高玩梁的博客
切换至 Caddy2 | 某不科学的博客
Caddy2 简明教程 - bleem
树莓派安装 OpenWrt 突破校园网限制 | Asttear's Blog
OpenVPN 路由设置 – 凤曦的小窝
个性化编译 LEDE 固件
盘点各种 Windows/Office 激活工具
[VirtualBox] 1、NAT 模式下端口映射
VirtualBox 虚拟机安装 openwrt 供本机使用
NUC 折腾笔记 - 安装 ESXi 7 - 苏洋博客
锐捷、赛尔认证 MentoHUST - Ubuntu 中文
How Do I Use A Client Certificate And Private Key From The IOS Keychain? | OpenVPN
比特记事簿: 笔记: 使用电信 TR069 内网架设 WireGuard 隧道异地组网
利用 GitHub API 获取最新 Releases 的版本号 | 这是只兔子
docsify - 生成文档网站简单使用教程 - SegmentFault 思否
【干货】Chrome 插件 (扩展) 开发全攻略 - 好记的博客
一看就会的 GitHub 骚操作,让你看上去像一位开源大佬
【计算机网络】了解内网、外网、宽带、带宽、流量、网速_墩墩分墩 - CSDN 博客
mac-ssh 配置 | Sail
如何科学管理你的密码
VirtualBox NAT 端口映射实现宿主机与虚拟机相互通信 | Shao Guoliang 的博客
CentOS7 配置网卡为静态 IP,如果你还学不会那真的没有办法了!
laisky-blog: 近期折腾 tailscale 的一些心得
使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书 · Ruby China
acme 申请 Let’s Encrypt 泛域名 SSL 证书
从 nginx 迁移到 caddy
使用 Caddy 替代 Nginx,全站升级 https,配置更加简单 - Diamond-Blog
http.proxy - Caddy 中文文档
动手撸个 Caddy(二)| Caddy 命令行参数最全教程 | 飞雪无情的总结
Caddy | 学习笔记 - ijayer
Caddy 代理 SpringBoot Fatjar 应用上传静态资源
使用 graylog3.0 收集 open××× 日志进行审计_年轻人,少吐槽,多搬砖的技术博客_51CTO 博客
提高国内访问 github 速度的 9 种方法! - SegmentFault 思否
VM16 安装 macOS 全网最详细
2022 目前三种有效加速国内 Github
How to install MariaDB on Alpine Linux | LibreByte
局域网内电脑 - ipad 文件共享的三种方法 | 岚
多机共享键鼠软件横向测评 - 尚弟的小笔记
VLOG | ESXI 如何升级到最新版,无论是 6.5 还是 6.7 版本都可以顺滑升级。 – Vedio Talk - VLOG、科技、生活、乐分享
远程修改 ESXi 6.7 管理 IP 地址 - 腾讯云开发者社区 - 腾讯云
几乎不要钱自制远程 PLC 路由器方案
traefik 简易入门 | 个人服务器运维指南 | 山月行
更完善的 Docker + Traefik 使用方案 - 苏洋博客
MicroSD·TF 卡终极探秘 ·MLC 颗粒之谜 1 三星篇_microSD 存储卡_什么值得买
macOS 绕过公证和应用签名方法 - 走客
MiscSecNotes / 内网端口转发及穿透. md at master · JnuSimba/MiscSecNotes
我有特别的 DNS 配置和使用技巧 | Sukka's Blog
SEO:初学者完整指南
通过 OpenVPN 实现流量审计
OpenVPN-HOWTO
OpenVPN Server · Devops Roadmap
Linux 运维必备的 13 款实用工具, 拿好了~
linux 平台下 Tomcat 的安装与优化
Linux 运维跳槽必备的 40 道面试精华题
Bash 脚本进阶,经典用法及其案例 - alonghub - 博客园
推荐几个非常不错的富文本编辑器 - 走看看
在 JS 文件中加载 JS 文件的方法 - 月光博客
#JavaScript 根据需要动态加载脚本并设置自定义参数
笔记本电脑 BIOS 修改及刷写教程
跨平台加密 DNS 和广告过滤 personalDNSfilter · LinuxTOY
AdGuard Home 安装及使用指北
通过 Amazon S3 协议挂载 OSS
记一次云主机如何挂载对象存储
本文档发布于https://mrdoc.fun
-
+
首页
高性能消息中间件——NATS
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.tuicool.com](https://www.tuicool.com/articles/Ej6Vf2F) 前 言 这段时间我的主要工作内容是将公司系统中使用的 RabbitMQ 替换成 NATS,而此之前我对 Nats 一无所知。经过一段时间紧张的学习和开发之后我顺利的完成了任务, 并对消息中间件有了更深的了解。在此感谢同事钟亮在此过程中对我的帮助。NATS 属于比较小众的一款中间件产品,中文资料基本上是没有的,故写以记之,为想学习 Nats 的同学提供一点帮助。 ![](https://img0.tuicool.com/jieqArI.png!web) 原创作者:万里 在介绍 NATS 之前先了解下什么是分布式系统和消息中间件 对于分布式系统的定义,一直以来我都没有找到或者想到特别简练而又合适的定义,这里引用一下 Distributed System Concepts and Design (Thrid Edition) 中的一句话 A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages, 从这句话我们可以看到几个重点,一是组件分布在网络计算机上,二是组件之间仅仅通过消息传递来通信并协调行动。消息中间件维基百科给出的定义为 Message-oriented middleware(MOM) is software infrastructure focused on sending and receiving messages between distrubuted systems, 意思就是面向消息的系统(消息中间件)是在分布式系统中完成消息的发送和接收的基础软件 ![](https://img2.tuicool.com/j6raQfn.png!web) 消息中间件常被提及的好处即异步和解耦,市面上常常被使用到的中间件有 RabbitMQ, ActiveMQ, Kafka 等,他们的关注度和使用率都非常的高,并且使用起来也非常的方便。公司的 WiseCloud 产品就集成了 RabbitMQ。而在下一个版本的更新中将会使用 NATS 来替换 RabbitMQ。使用 NATS 的好处比较多首先就是其性能非常好,下面引用官网的性能对比图: ![](https://img1.tuicool.com/QnI3Mzb.png!web) NATS 介绍 NATS 是一个开源、轻量级、高性能的分布式消息中间件,实现了高可伸缩性和优雅的 Publish/Subscribe 模型,使用 Golang 语言开发。NATS 的开发哲学认为高质量的 QoS 应该在客户端构建,故只建立了 Request-Reply,不提供 1. 持久化 2. 事务处理 3. 增强的交付模式 4. 企业级队列。 NATS 消息传递模型 NATS 支持各种消息传递模型,包括: 发布订阅(Publish Subscribe) 请求回复(Request Reply) 队列订阅(Queue Subscribers ) 提供的功能: 纯粹的发布订阅模型(Pure pub-sub) 服务器集群(Cluster mode server) 自动精简订阅者(Auto-pruning of subscribers) 基于文本协议(Text-based protocol) 多服务质量保证(Multiple qualities of service - QoS) 发布订阅(Publish Subscribe) NATS 将 publish/subscribe 消息分发模型实现为一对多通信,发布者在 Subject 上发送消息,并且监听该 Subject 在任何活动的订阅者都会收到该消息 ![](https://img1.tuicool.com/7nemuer.png!web) java: ``` //publish Connection nc = Nats.connect("nats://127.0.0.1:4222"); nc.publish("subject", "hello world".getBytes(StandardCharsets.UTF_8)); ``` ``` //subscribe Subscription sub = nc.subscribe("subject"); Message msg = sub.nextMessage(Duration.ofMillis(500)); String response = new String(msg.getData(), StandardCharsets. UTF_8); ``` 或者是基于回调的 subscribe ``` //subscribe Dispatcher d = nc.createDispatcher(msg - >{ String response = new String(msg.getData(), StandardCharsets.UTF_8) //do something }) d.subscribe("subject"); ``` 请求响应(Request Reply) NATS 支持两种请求响应消息:点对点或多对多。点对点涉及最快或首先响应。在一对多的消息交换中,需要限制请求响应的限制 在 Request Reply 过程中,发布请求发布带有响应主题的消息,期望对该 subject 做出响应操作 ![](https://img0.tuicool.com/be6zUzj.png!web) java: ``` // publish Connection connection = Nats.connect("nats://127.0.0.1:4222"); String reply = "replyMsg"; //请求回应方法回调 Dispatcher d = connection.createDispatcher(msg -> System.out.println("reply: " + JSON.toJSONString(msg)); }) d.unsubscribe(repl , 1); //订阅请求 d.subscribe(reply); //发布请求 connection.publish("requestSub", reply, "request".getBytes(StandardCharsets. UTF_8)); ``` ``` //subscribe Connection nc = Nats.connect("nats://127.0.0.1:4222"); //注册订阅 Dispatcher dispatcher = nc.createDispatcher(msg -> { System.out.println(JSON.toJSONString(msg)); nc.publish(msg.getReplyTo(), "this is reply".getBytes(StandardCharsets.UTF_8)); }); dispatcher.subscribe("requestSub"); ``` 队列订阅 & 分享工作(Queue Subscribers & Sharing Work) NATS 提供称为队列订阅的负载均衡功能,虽然名字为 queue(队列) 但是并不是我们所认为的那样。他的主要功能是将具有相同 queue 名字的 subject 进行负载均衡。使用队列订阅功能消息发布者不需要做任何改动,消息接受者需要具有相同的对列名 ![](https://img1.tuicool.com/77j2Izy.png!web) ``` // Subscribe Connection nc = Nats.connect(); Dispatcher d = nc.createDispatcher(msg -> { //do something System.out.println("msg: " + new String(msg.getData(),StandardCharsets.UTF_8)); }); d.subscribe("queSub", "queName"); ``` Nats-Spring 集成 NATS 虽说是一个性能非常好的消息中间键,但是和 Spring 的集成不是很好。这里提供两个集成的思路 * CloudFoundry-Community/java-nats * Wanlinus/nats-spring java-nats 这是一个由 CloudFoundry 主导的一个 NATS java 客户端。提供了区别于官方的 nats 客户端,支持注解配置,对 Spring 有比较好的支持,但是此项目已经有 1 年多没有更新且不支持 NATS Streaming。相应用法参考 Github, 这里不做详细讲解. nats-spring 由于开源社区只提供一个简单的 NATS Client, 缺少对注解和 Spring 的支持, 所以我基于官方 jnats 客户端写了一个 SpringBoot 的兼容插件. 主要是为了兼容 spring boot amqp 开发模式,尽量使用注解解决问题开发出来的,所以使用方法类似于在代码中使用 @RabbitListener. 具体使用方法如下 {{git clone [https://github.com/wanlinus/nats-spring.git](https://github.com/wanlinus/nats-spring.git) cd nats-spring mvn clean install}}} ``` <dependency> <groupId>cn.wanlinus</groupId> <artifactId>nats-spring</artifactId> <version>1.0.0.RELEASE</version> </dependency> ``` application.yml ``` spring: nats: urls: - nats://127.0.0.1:4222 ``` ``` @EnableNats @SpringBootApplication public class NatsDemo2Application { public static void main(String[] args) { SpringApplication.run(NatsDemo2Application.class, args); } } @Component public class Foo{ @NatsSubscribe("haha") public void message(Message message) { System.out.println(message.getSubject() + " : " + new String(message.getData())); } ``` } NATS Streaming 介绍 NATS 由于不能保证消息的投递正确性和存在其他的缺点, NATS Streaming 就孕育而生. 他是一个由 NATS 提供支持的数据流系统, 采用 Go 语言编写, NATS Streaming 与核心 NATS 平台无缝嵌入,扩展和互操作. 除了核心 NATS 平台的功能外, 他还提供了以下功能: NATS Streaming 特征 增强消息协议 (Enhanced message protocol) 消息 / 事件持久化 (Message/event persistence) 至少一次数据传输 (At-least-once-delivery) Publisher 限速 (Publisher rate limiting) Subscriber 速率匹配 (Rate matching/limiting per subscriber) 按主题重发消息 (Historical message replay by subject) 持续订阅 (Durable subscriptions) 基本用法 在使用 NATS Streaming 之前首先要启动服务器, 在这里我选择使用 docker 容器 ``` # 4222 client默认连接端口 ``` 8222 Web 端口 ----------- 6222 集群通信端口 ----------- $ docker run -d -p 4222:4222 -p 8222:8222 -p 6222:6222 nats-streaming STREAM: Starting nats-streaming-server[test-cluster] version 0.11.0 STREAM: ServerID: bzkKJL3jI4KW9Hqb0bC1Ae STREAM: Go version: go1.11 Starting nats-server version 1.3.0 Git commit [not set] Starting http monitor on 0.0.0.0:8222 Listening for client connections on 0.0.0.0:4222 Server is ready STREAM: Recovering the state... STREAM: No recovered state STREAM: Message store is MEMORY STREAM: ---------- Store Limits ---------- STREAM: Channels: 100 * STREAM: --------- Channels Limits -------- STREAM: Subscriptions: 1000 * STREAM: Messages : 1000000 * STREAM: Bytes : 976.56 MB * STREAM: Age : unlimited * STREAM: Inactivity : unlimited * STREAM: ---------------------------------- java: ``` // 第一个参数表示clusterId,在启动NATS Streaming容器的时候确定 // 第二个参数表示clientID,连接客户端的唯一标识符 StreamingConnectionFactory cf = new StreamingConnectionFactory ("test-cluster", "bar"); //设置Nats服务器地址和端口,默认是nats://127.0.0.1:4222 cf.setNatsConnection(Nats.connect("nats://127.0.0.1:4222")); StreamingConnection sc = cf.createConnection(); ``` Publish: sc.publish("foo", "Hello World".getBytes()); Subscribe: ``` sc.subscribe("foo", msg -> { System.out.println(new String(msg.getData(), StandardCharsets.UTF_8)); }, new SubscriptionOptions.Builder() .durableName("aa") .deliverAllAvailable().build()); ``` 在使用 NATS Streaming 的时候需要注意订阅主题不支持通配符, 在订阅消息时传入 MessageHandler 函数是接口实现和 SubscriptionOptions 对象. MessageHandler 提供消息回调处理, SubscriptionOptions 用于设置订阅选项, 比如设置 Queue, durableName, ack 等。 Streaming-Spring 集成 作为一款优秀的消息中间件, 却没有对 Spring 做集成, 这是非常的可惜的事情. 所以为了在工作中方便的使用他, 我开发了一个很小的插件. 虽然还有很大的改进空间,不过在公司的项目中却能够很好的运行. 他开发思路和 nats-spring 差不多,所以使用方式也是大同小异,具体如下: {{git clone [https://github.com/wanlinus/na ... g.git](https://github.com/wanlinus/nats-streaming-spring.git) cd nats-streaming-spring mvn clean install}}} ``` <dependency> <groupId>cn.wanlinus</groupId> <artifactId>nats-streaming-spring</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency> ``` application.yml ``` spring: nats: streaming: nats-url: nats://127.0.0.1:4222 cluster-id: test-cluster ``` ``` @EnableNatsStreaming @SpringBootApplication public class StreamingDemoApplication { public static void main(String[] args) { SpringApplication.run(StreamingDemoApplication.class, args); } //发布消息只需要注入StreamingConnection @Autowired private StreamingConnection sc; public void sendMsg(){ sc.publish("foo", "publish message".getBytes()) } } @Service public class A { @Subscribe(value = "foo", durableName = "dname", queue = "queue") public void asd(Message message) throws IOException { System.out.println(new String(message.getData(), StandardCharsets.UTF_8)); } ``` } 两个插件由于是为了结合项目所写的,所以里面有些部分并不通用。后续的开发中我将会继续进行抽象和改进。 原文链接: [https://mp.weixin.qq.com/s/lOKjyYQgcFT9xKR4Zulb6A](https://mp.weixin.qq.com/s/lOKjyYQgcFT9xKR4Zulb6A) 关于睿云智合 深圳睿云智合科技有限公司成立于 2012 年,总部位于深圳,并分别在成都、深圳设立了研发中心,北京、上海设立了分支机构,核心骨干人员全部为来自金融、科技行业知名企业资深业务专家、技术专家。早期专注于为中国金融保险等大型企业提供创新技术、电子商务、CRM 等领域专业咨询服务。 自 2016 年始,在率先将容器技术引进到中国保险行业客户后,公司组建了专业的容器技术产品研发和实施服务团队,旨在帮助中国金融行业客户将容器创新技术应用于企业信息技术支持业务发展的基础能力改善与提升,成为中国金融保险行业容器技术服务领导品牌。 此外,凭借多年来在呼叫中心领域的业务经验与技术积累,睿云智合率先在业界推出基于开源软交换平台 FreeSwitch 的微服务架构多媒体数字化业务平台,将语音、视频、webchat、微信、微博等多种客户接触渠道集成,实现客户统一接入、精准识别、智能路由的 CRM 策略,并以容器化治理来支持平台的全应用生命周期管理,显著提升了数字化业务处理的灵活、高效、弹性、稳定等特性,为帮助传统企业向 “以客户为中心” 的数字化业务转型提供完美的一站式整体解决方案。
Jonny
2022年5月2日 14:50
667
0 条评论
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
如遇文档失效,可评论告知,便后续更新!
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期