rabbitmq学习

1. rabbitmq介绍

rabbitmq是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件

1.1 特性

  • 可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性
  • 灵活的分发消息策略。这应该是rabbitmq的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有: 简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式
  • 支持集群。多台rabbitmq服务器可以组成一个集群,形成一个逻辑Broker
  • 多种协议。rabbitmq支持多种消息队列协议,比如 STOMP、MQTT 等等
  • 支持多种语言客户端。rabbitmq几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等
  • 可视化管理界面。rabbitmq提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker
  • 插件机制。rabbitmq提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件

1.2 概念

  1. Broker: 简单来说就是消息队列服务器实体
  2. Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列。
  3. Queue: 消息队列载体,每个消息都会被投入到一个或多个队列。
  4. Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
  5. Routing Key: 路由关键字,exchange根据这个关键字进行消息投递。
  6. vhost: 虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
  7. producer: 消息生产者,就是投递消息的程序。
  8. consumer: 消息消费者,就是接受消息的程序。
  9. channel: 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

1.3 Exchanges

1. 简介

rabbitmq 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。 实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反,生产者只能将消息发送到交换机(exchange)
,交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。 交换机必须确切知道如何处理收到的消息。是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。

2. 交换机类型

1. Direct Exchange

处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键
“abc”,则只有被标记为“abc”的消息才被转发,不会转发abc.def,也不会转发dog.ghi,只会转发abc。

2. Fanout Exchange

不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。

3. Topic Exchange

将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.” 只会匹配到“abc.def”。

4. Headers Exchanges

不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到rabbitmq时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic
的路由键都需要要字符串形式的。

1.4 消息持久化

消息可能丢失的步骤

  1. 生产者到Broker过程中丢失消息

解决方法: 开启发布确认

  • 单个发布确认
  • 批量发布确认
  • 批量异步发布确认
  1. Broker宕机丢失消息

解决方法: 消息持久化

  1. Broker到消费者过程中丢失消息

解决方法: 消息应答

1.5 消息幂等性

  • 利用redis原子性进行消息去重处理

1.6 死信的条件

  • 消息TTL过期
  • 消息队列已满
  • 消息被拒绝

1.7 拓展

1. rabbitmq用户角色

用户角色可分为五类:超级管理员、监控者、策略制定者、普通管理者以及其他

  1. 超级管理员(administrator)
    可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户、策略(policy)进行操作
  2. 监控者(monitoring)
    可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数、内存使用情况、磁盘使用情况等)
  3. 策略制定者(policymaker)
    可登陆管理控制台(启用management plugin的情况下),同时可以对policy进行管理,但无法查看节点的相关信息
  4. 普通管理者(management)
    仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理
  5. 其他 无法登陆管理控制台,通常就是普通的生产者和消费者 了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理
1
2
3
4
5
# 设置用户角色的命令为:
./rabbitmqctl set_user_tags User Tag
# User为用户名,Tag为角色名(对应于上面的 administrator、monitoring、policymaker、management或其他自定义名称)
# 也可以给同一用户设置多个角色,例如:
./rabbitmqctl set_user_tags myName monitoring policymaker

2. 用户权限

  1. 用户权限指的是用户对 exchange、queue 的操作权限,包括配置权限、读写权限。 配置权限会影响到 exchange,queue 的声明和删除。
  2. 读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作 例如: 将queue绑定到某exchange上,需要具有queue的写权限,以及exchange的读权限。 向exchange发送消息需要具有exchange的写权限。 从queue里取数据需要具有queue的读权限。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 设置用户角色的命令为:
# 设置用户权限
./rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP
# 如:设置guest用户权限
./rabbitmqctl set_permissions -p / guest '.*' '.*' '.*'
# 查看(指定VHostPath)所有用户的权限信息
./rabbitmqctl list_permissions [-p VHostPath]
# 列出虚拟主机上的所有权限
./rabbitmqctl list_permissions -p /
# 查看指定用户的权限信息
./rabbitmqctl list_user_permissions User
# 列出guest用户权限
./rabbitmqctl list_user_permissions guest
# 清除用户的权限
./rabbitmqctl clear_permissions [-p VHostPath] User

3. vhost 操作

1
2
3
./rabbitmqctl delete_vhost /
./rabbitmqctl add_vhost /
./rabbitmqctl list_vhosts

其他

nacos安装

环境准备

  • nacos安装包
  • 三台linux服务器

1. 单机版安装

2. 集群安装

1. 参考文档

注意如果使用高版本jdk可能需要改某些配置 解决方案

2. 更改配置

1
2
3
4
vi startup.sh

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=jdk安装路径
# 然后注释掉下面三行

2. 做成系统服务

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
ExecStart=sh /usr/local/nacos/bin/startup.sh -p embedded
ExecReload=sh /usr/local/nacos/bin/shutdown.sh
ExecStop=sh /usr/local/nacos/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

springcloud学习

1. 什么是微服务

  • 微服务是一种架构风格
  • 一个应用拆分为一组小型服务
  • 每个服务运行在自己的进程内,也就是可独立部署和升级
  • 服务之间使用轻量级HTTP交互
  • 服务围绕业务功能拆分
  • 可以由全自动部署机制独立部署
  • 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术

2. springcloud组件说明

服务注册中心

名称 建议使用
Eureka ×
Zookeeper
Consul
Nacos

服务调用

名称 建议使用
Ribbon
LoadBalancer
Feign ×
OpenFeign

服务降级

名称 建议使用
Hystrix ×
resilience4j
sentinel

服务网关

名称 建议使用
Zuul ×
Zuul2
gateway

服务配置

名称 建议使用
Config ×
Nacos

服务总线

名称 建议使用
Bus ×
Nacos

java引用类型

java引用类型

  • 强引用

    只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了

  • 软引用

    软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等

  • 弱引用

    弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收

  • 虚引用

    虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收

jdk安装

环境准备

1. 将下载好的jdk上传到服务器

2. 解压

1
tar -zxvf jdk-17_linux-x64_bin.tar.gz

3. 创建java安装目录

1
mkdir /usr/java

4. 将解压好的文件移到java安装目录

1
mv /home/wx/Downloads/jdk-17.0.1/* /usr/java/

5. 配置环境变量

1
2
3
4
5
6
7
8
vim /etc/profile
# 末尾添加
export JAVA_HOME=/usr/java
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
# 立即生效
source /etc/profile

jmeter学习

下载地址

配置环境变量

  • 新建系统变量 JMETER_HOME = Jmeter安装路径[不能含中文]
  • PATH中添加%JMETER_HOME%\bin

入门请求

  1. 添加线程组

  2. 配置请求

  3. 查看结果数

组件介绍

测试计划

描述一个性能测试,包括本次测试的所有功能

线程组

  • 线程数

    表示用户数量

  • Ramp-Up时间(秒)

    表示用户数量

  • 循环次数

    表示用户数量

使用踩坑

  • jmeter beanshell引用了java文件,获取返回的汉字(utf-8格式),在jmeter中一直乱码
  • 解决:保存java文件为ANSI编码格式
  • 原因:未知,先记录,以后再说。

java并发编程

整体分类

1. 为了并发安全

1. 互斥同步

1. 各种锁

  • synchronized
  • ReentrantLock
  • ReadWriteLock

2. 同步工具类

  • Collections.synchronize()
  • Vector

2. 非互斥同步

3. 结合了互斥同步和非互斥同步

4. 无同步方案

  - synchronized

2. 管理线程提高效率

3. 线程协作

git命令大全

基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
git init                                                  # 初始化本地git仓库(创建新仓库)
git config --global user.name "xxx" # 配置用户名
git config --global user.email "xxx@xxx.com" # 配置邮件
git config --global color.ui true # git status等命令自动着色
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git config --global --unset http.proxy # remove proxy configuration on git
git clone git+ssh://git@192.168.53.168/VT.git # clone远程仓库
git status # 查看当前版本状态(是否修改)
git add xyz # 添加xyz文件至index
git add . # 增加当前子目录下所有更改过的文件至index
git commit -m 'xxx' # 提交
git commit --amend -m 'xxx' # 合并上一次提交(用于反复修改)
git commit -am 'xxx' # 将add和commit合为一步
git rm xxx # 删除index中的文件
git rm -r * # 递归删除
git log # 显示提交日志
git log -1 # 显示1行日志 -n为n行
git log -5
git log --stat # 显示提交日志及相关变动文件
git log -p -m
git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容
git show dfb02 # 可只用commitid的前几位
git show HEAD # 显示HEAD提交日志
git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
git tag # 显示已存在的tag
git tag -a v2.0 -m 'xxx' # 增加v2.0的tag
git show v2.0 # 显示v2.0的日志及详细内容
git log v2.0 # 显示v2.0的日志
git diff # 显示所有未添加至index的变更
git diff --cached # 显示所有已添加index但还未commit的变更
git diff HEAD^ # 比较与上一个版本的差异
git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异
git diff origin/master..master # 比较远程分支master上有本地分支master上没有的
git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容
git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义(用于push/pull/fetch)
git branch # 显示本地分支
git branch --contains 50089 # 显示包含提交50089的分支
git branch -a # 显示所有分支
git branch -r # 显示所有原创分支
git branch --merged # 显示所有已合并到当前分支的分支
git branch --no-merged # 显示所有未合并到当前分支的分支
git branch -m master master_copy # 本地分支改名
git checkout -b master_copy # 从当前分支创建新分支master_copy并检出
git checkout -b master master_copy # 上面的完整版
git checkout features/performance # 检出已存在的features/performance分支
git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支
git checkout v2.0 # 检出版本v2.0
git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出
git checkout -- README # 检出head版本的README文件(可用于修改错误回退)
git merge origin/master # 合并远程master分支至当前分支
git cherry-pick ff44785404a8e # 合并提交ff44785404a8e的修改
git push origin master # 将当前分支push到远程master分支
git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支
git push --tags # 把所有tag推送到远程仓库
git fetch # 获取所有远程分支(不更新本地分支,另需merge)
git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支
git pull origin master # 获取远程分支master并merge到当前分支
git mv README README2 # 重命名文件README为README2
git reset --hard HEAD # 将当前版本重置为HEAD(通常用于merge失败回退)
git rebase
git branch -d hotfixes/BJVEP933 # 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支)
git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933
git ls-files # 列出git index包含的文件
git show-branch # 图示当前分支历史
git show-branch --all # 图示所有分支历史
git whatchanged # 显示提交历史对应的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818
git ls-tree HEAD # 内部命令:显示某个git对象
git rev-parse v2.0 # 内部命令:显示某个ref对于的SHA1 HASH
git reflog # 显示所有提交,包括孤立节点
git show HEAD@{5}
git show master@{yesterday} # 显示master分支昨天的状态
git log --pretty=format:'%h %s' --graph # 图示提交日志
git show HEAD~3
git show -s --pretty=raw 2be7fcb476
git stash # 暂存当前修改,将所有至为HEAD状态
git stash list # 查看所有暂存
git stash show -p stash@{0} # 参考第一次暂存
git stash apply stash@{0} # 应用第一次暂存
git grep "delete from" # 文件中搜索文本“delete from”
git grep -e '#define' --and -e SORT_DIRENT
git gc
git fsck

git安装

环境准备

1. 将下载好的git上传到服务器

2. 为服务器安装git依赖

1
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

3. 编译安装

1
2
3
4
# 进入到解压目录
cd git-2.34.1/
make prefix=/usr/local/git all
make prefix=/usr/local/git install

4. 配置环境变量

1
2
3
4
5
vim /etc/profile
# 末尾添加
export PATH=/usr/local/git/bin:$PATH
# 立即生效
source /etc/profile
|