2102王海涛随堂笔记

rabbitmq 虚拟机

安装docker环境

  1. 克隆 centos-8-2105: rabbitmq

  2. 设置ip:

    1. ./ip-static
    2. ip: 192.168.64.140
    3. ifconfig
    
         
         
  3. mobaxterm 上传 docker 离线安装文件到 /root/ 目录

    • 课前资料\devops课前资料\docker\docker-install 文件夹
  4. 按照笔记安装docker

    • https://wanght.blog.csdn.net/article/details/117327543

启动 docker 容器

  1. 下载 docker 镜像

    docker pull rabbitmq:management
    docker images
    
         
         
  2. 启动运行容器

docker run \
-d \
--name rabbit \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:management

docker ps

  1. 浏览器访问 http://192.168.64.140:15672/

rabbitmq 容器不可访问:

# 重启网络服务
systemctl restart NetworkManager

# 重启 docker 系统服务
systemctl restart docker

# 重启容器
docker restart rabbit

订单流量削峰

导入项目:

  1. 课前资料\elasticsearch\pd-商城项目案例.zip
    pd-web 目录解压缩到 rabbitmq 工程目录
  2. 导入maven项目,选择 pd-web 下的 pom.xml
  3. file — project structures ,配置jdk
  4. sqlyog ,右键点连接 — 从sql转储文件导入
    选择 pd-web 项目目录中的 pd.sql
  5. 如果用 wht6.cn:3309,修改 application.yml 配置
  6. 右键点击 RunPdApp 类,启动项目
  7. 配置启动项,设置 working directory,设置成 pd-web 模块的目录

修改pd-web,发送订单到rabbitmq
8. 添加依赖: starter-rabbitmq
9. yml配置 rabbitmq 连接信息
10. 在启动类中(或自定义自动配置类)准备队列的参数
11. OrderServiceImpl
1. 添加 AmqpTemplate 用来发送消息的封装工具
2. 在 saveOrder() 方法中发送消息
3. 把 saveorder() 中的数据库代码都注释掉

动态配置刷新

2,3,4,9项目基础配置

  1. 添加依赖:
    • rabbitmq
    • bus
  2. yml 配置rabbitmq连接
    • 09修项目修改 application.yml
    • 2,3,4 修改 config目录的三个文件,推送到远程仓库
  3. 09项目中使用 actuator 暴露 bus-refresh 刷新端点

sleuth + zipkin 链路跟踪

2,3,4,6 添加 sleuth 链路跟踪日志

zuul, iu5y4y4y45, iu5y4y4y45, true
order, iu5y4y4y45, i65h5j5j5j5j, true
user, iu5y4y4y45, ujjhg34t45y5u6, true
item, iu5y4y4y45, uju65j54354yu, true

只需要添加 sleuth 依赖,0配置

2,3,4,6 添加 zipkin 客户端依赖和rabbitmq配置

  1. 2,3,4,6 添加 zipkin 客户端依赖
  2. 6 添加 rabbitmq 依赖和连接配置
  3. 2,3,4,6 配置日志的发送方式: rabbit
    • 06项目直接修改 application.yml
    • 2,3,4项目修改config文件夹的文件,并推送

选择正确的网卡,注册 IP 地址

选择网卡
在 bootstrap.yml 中配置

spring:
  cloud:
    inetutils:
      ignored-interfaces: # 忽略的网卡
        - VM.*
      preferred-networks: # 要是用的网卡的网段
        - 192\.168\.0\..+

 
 

注册 IP 地址,而不注册主机名
application.yml

eureka:
  instance:
    prefer-ip-address: true # 使用ip进行注册
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} # 界面列表中显示的格式也显示ip

账户

  1. 实体类 Account
  2. AccountMpper 接口
  3. AccountMapper.xml
  4. AccountService
  5. AccountController

seata server

registry.conf
配置 seata server 向注册中心注册

file.conf
配置 seata server 运行过程中存储的日志的存储位置

seata-server.bat
配置使用的内存

订单添加 seata at 事务

  1. 父项目添加 seata 依赖
  2. 配置
    • application.yml — 事务组的组名
    • registry.conf — 注册中心地址,获得事务协调器的地址
    • file.conf — 事务组对应使用的协调器
  3. 数据源代理 — 提供自动事务处理代码
  4. 业务方法添加事务注解
    • @Transactinal — 控制本地事务
    • @GlobalTransactional — 启动全局事务

库存和账户添加 seata at 事务

  1. 三个配置文件
    • application.yml — 事务组的组名
    • registry.conf — 注册中心地址
    • file.conf — 事务组对应的协调器
  2. 数据源代理
  3. 业务方法添加 @Transactional 控制本地事务

订单中,打开库存和账户的远程调用

TCC 事务

AT - 对业务无侵入,全自动事务,80%情况下都可以使用AT事务
TCC - 对业务有侵入,两阶段代码都需要自己来实现

订单添加 TCC 事务

  1. 添加 seata 依赖
  2. 三个配置文件,和 AT 事务相同
  3. 修改 Mapper 添加 TCC 的数据库操作
  4. 添加 TCC 操作接口和实现
  5. TCC三个方法,添加 @Transactional
  6. 修改业务代码,在业务中手动调用TCC第一阶段方法
  7. 业务方法添加 @GlobalTransactional

库存添加 TCC 事务
8. 三个配置文件
9. 修改 Mapper 添加 TCC 的数据库操作
10. 添加 TCC 操作接口和实现,添加 @Transactional
11. 修改业务代码,在业务中手动调用TCC第一阶段方法

账户添加 TCC 事务
12. 三个配置文件
13. 修改 Mapper 添加 TCC 的数据库操作
14. 添加 TCC 操作接口和实现,添加 @Transactional
15. 修改业务代码,在业务中手动调用TCC第一阶段方法
16. 幂等性控制

sql 优化

select * from stu where name=‘张三’

name 添加索引,加速过滤

create index stu_name_index on stu(name)

 
 
  • 1

mysql 测试一个查询条件是否会使用索引,扫描的数据量

explain select * from stu where name='张三'

加索引之前
index 扫描的数据量
none 16340063

加索引之后
index 扫描的数据量
stu_name_index 3

当数据量非常大时,sql优化解决不了问题,
必须分库分表 ---- MyCat
大量数据,要分散存储到数据库集群多台服务器

RocketMQ

  1. 克隆 centos-8-2105: rocketmq
  2. 设置ip
./ip-static
ip: 192.168.64.141

 
 
  1. mobaxterm 上传文件到 /root/
    • 课前资料\分布式事务\rocketmq 文件夹下的三个文件

订单业务添加可靠消息最终一致性事务

  1. 无事务版本.zip 解压缩到 rocketmq-dtx 工程目录
  2. 导入
  3. 检查工程jdk配置

订单发送事务消息
4. pom.xml 添加spring 封装的 rocketmq 依赖
5. yml 配置 rocketmq 连接信息
6. 事务状态表、实体类TxInfo、TxMapper
7. 消息的封装对象,和JsonUtil
8. 发送事务消息

账户接收消息执行账户金额扣减
9. yml 配置 rocketmq 连接信息
10. 添加消费者类接收消息
11. 调用业务方法

docker

  1. 克隆 centos-8-2105: docker-base
  2. 设置ip:
./ip-static
ip: 192.168.64.150
ifconfig

 
 
  1. 上传离线安装文件到 /root/
    • docker课前资料\docker-install 目录
  2. 按笔记执行安装
  3. 从 docker-base 克隆: docker

Docker 搭建redis集群

a

六个Redis实例的配置文件:
redis.conf

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

 
 
/opt/redis
		/7000/redis.conf
		/7001/redis.conf
		/7002/redis.conf
		/7003/redis.conf
		/7004/redis.conf
		/7005/redis.conf

 
 
mkdir /opt/redis
cd /opt/redis
mkdir 7000 7001 7002 7003 7004 7005

cat <<EOF >7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7004/redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

先启动6个redis实例

docker run -d --name redis7000 \
-v /opt/redis/7000/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7001 </span>
-v /opt/redis/7001/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf

docker run -d --name redis7002 </span>
-v /opt/redis/7002/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf

docker run -d --name redis7003 </span>
-v /opt/redis/7003/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf

docker run -d --name redis7004 </span>
-v /opt/redis/7004/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf

docker run -d --name redis7005 </span>
-v /opt/redis/7005/redis.conf:/redis.conf </span>
–net=host </span>
–restart=always </span>
redis </span>
redis-server /redis.conf

/pre>

执行命令配置集群

# 进入容器执行集群配置命令

docker exec -it redis7000 </span>
redis-cli --cluster create </span>
192.168.64.150:7000 192.168.64.150:7001 </span>
192.168.64.150:7002 192.168.64.150:7003 </span>
192.168.64.150:7004 192.168.64.150:7005 </span>
–cluster-replicas 1

查看集群信息

docker exec -it redis7000 redis-cli -c -p 7000

cluster info

cluster nodes

存数据

docker exec -it redis7000 redis-cli -c -p 7000
# 7002
set a aaaaaaaaaaaaa
# 7000
set b bbbbbbbbbbb
# 7001
set c cccccccccccccccc

 
 

redis 哨兵

redis主从复制结构中,当主服务器宕机,哨兵可以监控到服务宕机,从从服务器中选举产生一个新的主服务器

  1. 搭建主从服务器 – 一主两从
docker rm -f $(docker ps -aq)

# 启动主服务器,正常启动,没有特殊设置
docker run -d --name redis6379 --net=host --restart=always redis

docker exec -it redis6379 redis-cli
> info replication

启动两个从服务器

# 启动redis6380容器,作为 redis6379 的从服务器启动
docker run -d --name redis6380 --net=host --restart=always redis \
redis-server --port 6380 --slaveof 192.168.64.150 6379

# 启动redis6381容器,作为 redis6379 的从服务器启动
docker run -d --name redis6381 --net=host --restart=always redis </span>
redis-server --port 6381 --slaveof 192.168.64.150 6379

# 查看三个 redis 服务的角色
docker exec -it redis6379 redis-cli
> info replication

docker exec -it redis6380 redis-cli -p 6380
> info replication

docker exec -it redis6381 redis-cli -p 6381
> info replication

  1. 添加哨兵配置文件
mkdir /opt/sentinel/
cd /opt/sentinel/

# sentinel monitor mymaster 192.168.64.150 6379 2
# 末尾的 2 表示两台从服务器投票确认主服务器宕机,哨兵才会认为主服务器宕机
cat <<EOF >5000.conf
port 5000
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

cat <<EOF >5001.conf
port 5001
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

cat <<EOF >5002.conf
port 5002
sentinel monitor mymaster 192.168.64.150 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

  1. 启动三个哨兵
docker run -d --name sentinel5000 \
-v /opt/sentinel/5000.conf:/sentinel.conf \
--net=host \
redis redis-sentinel /sentinel.conf

docker run -d --name sentinel5001 </span>
-v /opt/sentinel/5001.conf:/sentinel.conf </span>
–net=host </span>
redis redis-sentinel /sentinel.conf

docker run -d --name sentinel5002 </span>
-v /opt/sentinel/5002.conf:/sentinel.conf </span>
–net=host </span>
redis redis-sentinel /sentinel.conf

# 进入一个哨兵容器,查看它监控的主从服务器和其他哨兵
docker exec -it sentinel5000 redis-cli -p 5000
> sentinel master mymaster
> sentinel slaves mymaster
> sentinel sentinels mymaster

  1. 停止主服务器,测试主服务器重新选举
# 停止主服务器
docker stop redis6379
# 在哨兵日志中查看服务器切换日志: +switch-master mymaster 192.168.64.150 6379 192.168.64.150 6381
docker logs sentinel5000

# 查看 6380 和 6381 服务器的角色变化
docker exec -it redis6380 redis-cli -p 6380
> info replication

docker exec -it redis6381 redis-cli -p 6381
> info replication

重新启动6379,不会把6379切换成主服务器,而是作为从服务器

docker start redis6379

docker exec -it redis6379 redis-cli
> info replication

  1. 客户端api连接哨兵存取数据

elasticsearch

启动服务器
三个容器如果运行有问题,重启三个容器

1. docker restart node1 node2 node3

 
 

    倒排索引
    从 ik 分词器项目仓库中下载 ik 分词器安装包 – 分词,分词器,项目

    倒排索引把关键词和文档之间的关系颠倒过来
    分词 – 1,2,5,8
    分词器 – 2,3,5,8

    k8s案例

    1. 项目打包成jar文件
    2. 构建镜像
      • jdk
      • eureka
      • item
      • user
      • order
    3. 把镜像传到所有服务器导入
    4. 部署四个模块

    镜像构建
    5. 准备5个文件夹 — devops课前资料\kubernetes\案例\v2
    - jdk
    - jdk压缩文件
    - Dockerfile
    - eureka
    - eureka的jar文件
    - Dockerfile
    - item
    - item的jar文件
    - Dockerfile
    - user
    - user的jar文件
    - Dockerfile
    - order
    - order的jar文件
    - Dockerfile

    回顾

    spring cloud netflix

    • eureka
    • openfeign
    • ribbon
    • zuul
    • hystrix
    • hystrix dashboard / turbin
    • config
    • bus
    • zleuth+zipkin

    消息服务

    Rabbitmq

    • 简单模式
    • 工作模式
      • 合理分发 – 手动ACK、qos=1
      • 消息持久化 – 队列持久化、消息持久化
    • 发布和订阅模式
      • 消息群发
      • fanout 交换机
    • 路由模式
      • 路由键匹配路由消息
      • direct 交换机
    • 主题模式
      • 关键词格式: aa.bb.cc.dd、 ..cc.dd、 #.dd
      • topic 交换机
    • RPC 模式

    Rocketmq

    • 延时消息
    • 顺序消息
    • 事务消息、高可靠消息

    消息服务使用场景

    • 解耦
    • 流量削峰
    • 异步调用

    项目中使用消息服务

    • bus消息总线使用消息服务来传递配置刷新指令
    • sleuth+zipkin链路跟踪,各模块把日志发送到消息服务,zipkin接收消息进行分析处理
    • 订单流量削峰
    • Rocketmq可靠消息最终一致性事务

    分布式事务

    Seata

    • Seata AT
      • 全自动事务方案
      • 对业务无侵入
      • 80% 情况下都可以使用 AT 事务
      • 只需要添加配置就可以实现
        • 启动 Seata server
        • 添加三个配置: application.yml, registry.conf, file.conf
        • 创建数据源代理
        • 第一个模块添加 @GlobalTransactional
    • TCC
      • 需要自己编写事务处理代码
      • 对业务代码有侵入
      • 实现步骤:
        • 启动 Seata server
        • 添加三个配置: application.yml, registry.conf, file.conf
        • 添加 TccAction 接口和实现,实现 TCC 三个操作方法
        • 修改业务,调用Tcc第一阶段方法
        • 第一个模块添加 @GlobalTransactional

    可靠消息最终一致性

    1. 发送半消息
    2. 执行本地事务
      • 事务成功,提交消息
      • 事务失败,回滚消息
    3. 由于网络不稳定无法提交或回滚消息
      服务器会反向回查事务状态

    消费者处理消息必须成功,如果失败会重试消息

    Docker

    • 镜像命令
    • 容器命令
    • 数据挂载
    • 网络
    • 构建镜像

    Elasticsearch

    • 全文检索引擎,NoSql 数据库

    • 倒排索引

    • 核心概念

      • 索引
      • 分片
      • 副本
      • 映射(字段、类型、分词器)
      • 文档
      • 字段
      • 分类(淘汰)
    • Spring data elasticsearch

      • ElasticsearchRepository
      • Criteria / CriteriaQuery / SearchOperations

    Kubernetes

    • Pod
      • 标签
      • 存活探针
    • 控制器
      • ReplicationController
      • ReplicaSet
      • DaemonSet
      • Job
      • CronJob
    • Deployment
      • 自动滚动升级
    • Service
      • 不变的访问地址
      • Endpoints 端点
      • 对外暴露 Service
        • NodePort
        • Load Balance
        • Ingress
    • 数据挂载
      • Persistent Volume 持久数据卷
      • Persistent Volume Claim 持久卷声明
      • pv 和 pvc 靠条件匹配自动关联
    • 参数、环境变量
      • command – 覆盖docker的 ENTRYPOINT
      • args – 覆盖docker的 CMD
      • env
      • ConfigMap
    • 3
      点赞
    • 5
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值