目录
- 随堂笔记
- 笔记乱码问题
- 课程安排(17到18天)
- 开发环境
- 常用地址
- spring cloud
- 搭建业务案例
- eureka 注册中心
- 注册中心客户端
- 订单调用商品和用户
- Zuul - Api网关
- hystrix
- hystrix dashboard
- actuator
- turbine
- VMware
- config 配置中心
- rabbitmq 虚拟机
- rabbitmq 虚拟机
- 订单流量削峰
- 动态配置刷新
- sleuth + zipkin 链路跟踪
- 选择正确的网卡,注册 IP 地址
- 账户
- seata server
- 订单添加 seata at 事务
- 库存和账户添加 seata at 事务
- TCC 事务
- sql 优化
- RocketMQ
- 订单业务添加可靠消息最终一致性事务
- docker
- Docker 搭建redis集群
随堂笔记
这是随堂笔记, 详细内容请参考在线笔记:
https://blog.csdn.net/weixin_38305440
笔记乱码问题
课程安排(17到18天)
- Spring Cloud(6)
- RabbitMQ(2)
- Lucene Solr(1)
- 分布式事务(3)
- RocketMQ(1)
- Docker(2)
- Elasticsearch
- Kubernetes(3)
王海涛
开发环境
- IDEA
- Lombok
- EditStarters
- Free MyBatis Plugin
- Maven Helper
- Maven
- 使用阿里仓库和中央仓库,来回切换更新
- 找到本地仓库的依赖包,删除后重新更新
- 复制同学的本地仓库中的依赖包
- 新工程的 Maven 默认配置:
- File - New Projects Settings - Settings for new projects
- springboot版本: 2.3.9.RELEASE
- springcloud版本: Hoxton.SR10
常用地址
提问:
- 直播聊天
- 微信: wanght6666666
笔记
https://blog.csdn.net/weixin_38305440/article/details/108609574
随堂笔记
http://code.tarena.com.cn/CGBCode/cgb2102/05-springcloud/note/note.html
Gitee代码仓库
https://gitee.com/benwang6/cgb2102
百度网盘非会员限速:
https://pan.baidu.com/s/19tOuVOYJsplssj3kLvfzcA
spring cloud
集成多种工具,解决微服务中的各种问题
- 注册和发现
- Nacos
- Eureka
- 远程调用 - OpenFeign
- 负载均衡
- 重试
- 系统容错和限流 - Sentinel, Hystrix
- 降级
- 熔断
- 错误监控 - Hystrix Dashboard、Turbine
- 配置中心 - Nacos、Config
- 链路跟踪 - Sleuth、Zipkin
搭建业务案例
- 新建父项目:springcloud1
- pom文件配置 springboot 和 springcloud 的版本
- 添加 commons 通用项目,添加通用代码
eureka 注册中心
搭建eureka注册中心
- 新建模块: sp05-eureka
- 配置 pom.xml 添加 eureka server 依赖
- application.yml
- 禁用保护模式
- 配置主机名,集群中用这个名字互相区分
- 针对单台服务器,不向自己注册、不从自己拉取
- 启动类添加注解
@EnableEurekaServer
使用注解来触发自动配置
eureka的四条运行机制
- 注册
客户端会一次次反复连接eureka服务器尝试注册,直到注册成功 - 拉取
客户端每30秒拉取一次注册表,来刷新注册信息 - 心跳
客户端每30秒发送一次心跳数据,
服务器连续3次收不到一个服务的心跳,会删除这个服务的注册信息 - 自我保护模式
在这种特殊模式下,所有的注册信息都不会删除- 15分钟内,85%服务器出现心跳异常,自动进入保护模式
- 网络恢复正常后,自动退出保护模式
- 开发调试期间,可以关闭保护模式,避免影响测试
注册中心客户端
修改 2,3,4 三个项目
- pom.xml 添加 eureka client 依赖
- application.yml 配置eureka的地址
订单调用商品和用户
修改 04
- 添加 openfeign 依赖
- 添加启动类注解
@EnableFeignClients
- 声明式客户端接口
- ItemClient
- UserClient
- 修改 OrderServiceImpl,使用声明式客户端接口调用远程服务
负载均衡
Feign集成了 Ribbon,通过Ribbon来实现了负载均衡功能,获得注册表中主机地址列表,在多个地址之间来回轮询调用
重试
Ribbon 在远程调用失败(宕机、异常、等待超时)时,会自动重试调用
- 默认等待超时时间是 1 秒
- 重试参数
- MaxAutoRetries - 单台服务器重试次数,默认0
- MaxAutoRetriesNextServer - 更换服务器的次数,默认1
- ReadTimeout - 等待响应的超时时间,默认 1000
- ConnectTimeout - 等待建立连接的超时时间,默认 1000
- OkToRetryOnAllOperations - 是否对所有请求方式都进行重试,默认只对GET请求重试
Zuul - Api网关
- 统一的调用入口
- 统一的权限校验
- 集成 Ribbon 负载均衡和重试
- 集成 Hystrix 系统容错和限流
统一的调用入口:
- 新建模块: sp06-zuul
- 添加依赖: zuul
- application.yml
# 转发规则、路由规则
# **包含深层路径
# 下面的设置时默认设置,zuul 会根据注册表的注册信息进行配置,
# 最后手动配置,避免注册表不全
zuul:
routes:
item-service: /item-service/**
user-service: /user-service/**
order-service: /order-service/**
- 启动类添加
@EnableZuulProxy
统一的权限校验
- 定义过滤器,继承 ZuulFilter
- 添加
@Component
注解,由 spring 自动创建实例 - zuul会在spring容器中找到过滤器实例,完成自动配置
模拟用户登录
http://localhost:3001/item-service/t34t34 没有登录不允许访问
http://localhost:3001/item-service/t34t34?token=t34t34t 已经登录可以访问
zuul 集成 ribbon 的负载均衡和重试
- 默认已经启用负载均衡
- 默认不启用重试,避免造成后台服务压力倍增,出现大面积故障
zuul 启用 ribbon 重试
- 添加 spring-retry 依赖
- yml 配置启用重试:
zuul.retryable=true
- 默认重试参数:
- ribbon.MaxAutoRetries=0
- ribbon.MaxAutoRetriesNextServer=1
- ribbon.ReadTimeout=1000
hystrix
类似 sentinel,系统的容错和限流
zuul 集成 hystrix,默认已经添加了 hystrix 依赖,并启用了 hystrix
hystrix 降级
当调用后台服务出错,可以执行当前服务中的一段代码,返回替代结果
- 实现 FallbackProvider 接口,添加降级代码
- 添加
@Component
注解,由spring自动创建实例 - zuul的自动配置会在spring容器中找到降级类的实例,自动完成配置
hystrix 熔断
-
10秒内20次请求(首先满足)
-
50%失败(异常,崩溃,超时),执行了降级代码
-
熔断后几秒,会进入“半开”状态,会尝试向后台服务发送一次客户端调用
如果调用成功,会自动恢复正常,关闭断路器
如果调用失败,继续保持打开状态
hystrix dashboard
hystrix 仪表盘
对降级容错处理,熔断限流的情况进行监控,快速定单位错误
hystrix dashboard利用 actuator 工具来暴露 hystrix 的监控日志
- 新建 sp07-hystrix-dashboard
- 添加依赖: hystrix dashboard
- yml
- 允许抓取的服务器列表
- 启动类添加注解:
@EnableHystrixDashboard
- 访问 http://localhost:4001/hystrix
actuator
spring 提供的一个项目日志监控工具,可以暴露系统的多种日志数据
- 健康状态
- 应用信息
- 系统环境变量、参数
- spring容器中所有的对象
- spring mvc映射的所有访问路径
- jvm虚拟机内存镜像
- ....
添加 actuator
- 添加 actuator 依赖(zuul依赖中已经包含)
- yml 配置暴露监控日志
- m.e.w.e.i="*" : 暴露全部日志
- m.e.w.e.i=[health, beans, env]
- m.e.w.e.i=hystrix.dashboard
turbine
从多态服务器合并监控数据,
hystrix dashboard 可以从 turbine 抓取合并后的多台服务器数据同时展现
- 新建 sp08-turbine
- 添加 turbine 依赖
- yml
- app-config: 指定服务id,同时抓取该服务的多台服务器
- name: 给合并后的数据命名,默认名是 default
- 启动类添加注解:
@EnableTurbine
访问地址: http://localhost:5001/turbine.stream
VMware
最新 16.1.2
还原网络:
VMware 虚拟网络不稳定,经常出现问题,可以重置虚拟网络
编辑 -- 虚拟网络编辑器 -- 左下角还原默认设置
会删除所有虚拟网络然后重新创建
NAT网络网段:
192.168.64.0 网段
编辑 -- 虚拟网络编辑器 -- 在上面选择 vmnet8 网络,左下角设置 192.168.64.0
虚拟机:
课前资料\虚拟机\centos-8-2105.zip
解压缩
双击 centos-8-2105.vmx
加载虚拟机
启动虚拟机时选择 已复制
,用户名和密码都是 root
版本不兼容在这里设置:
在虚拟机中已经做了一些基础环境准备:
- 配置了阿里的yum源和扩展源
- 两个用来设置ip的脚本文件:
- ip-static:用来设置固定ip
- ip-dhcp:用来自动获取ip
# 自动获取ip
./ip-dhcp
# 查看ip地址
ifconfig
# 手动指定固定ip
./ip-static
ip: 192.168.64.3
# 查看ip地址
ifconfig
config 配置中心
集中的管理和维护配置文件
准备本地的 git 仓库
- 新建文件夹 config
- 2,3,4项目的 application.yml 复制到 config 目录
- item-service-dev.yml
- user-service-dev.yml
- order-service-dev.yml
- 创建本地仓库并提交
- 已经创建过仓库,不要重复创建
- 推送远程仓库
搭建配置中心:
- 新建项目: sp09-config
- 添加 config server 依赖
- yml 配置
- git仓库地址
- 仓库中的文件夹: config
- 启动类注解:
@EnableConfigServer
配置中心的客户端
- 2,3,4三个项目的 appliation.yml 注释掉
- 添加 config client 依赖
- 添加新的配置文件: bootstrap.yml
- 添加配置:
- 连接eureka
- 指定配置中心的 service-id
- 下载的配置文件
bootstrap.yml
引导配置,springboot 应用启动之前,要先执行的一些配置,需要放到引导配置文件中,
rabbitmq 虚拟机
安装docker环境
-
克隆 centos-8-2105: rabbitmq
-
设置ip:
./ip-static ip: 192.168.64.140 ifconfig
-
mobaxterm 上传 docker 离线安装文件到 /root/ 目录
- 课前资料\devops课前资料\docker\docker-install 文件夹
-
按照笔记安装docker
启动 docker 容器
-
下载 docker 镜像
docker pull rabbitmq:management docker images
-
启动运行容器
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
-
浏览器访问
http://192.168.64.140:15672/
rabbitmq 虚拟机
安装docker环境
-
克隆 centos-8-2105: rabbitmq
-
设置ip:
./ip-static ip: 192.168.64.140 ifconfig
-
mobaxterm 上传 docker 离线安装文件到 /root/ 目录
- 课前资料\devops课前资料\docker\docker-install 文件夹
-
按照笔记安装docker
启动 docker 容器
-
下载 docker 镜像
docker pull rabbitmq:management docker images
-
启动运行容器
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
-
浏览器访问
http://192.168.64.140:15672/
rabbitmq 容器不可访问:
# 重启网络服务
systemctl restart NetworkManager
# 重启 docker 系统服务
systemctl restart docker
# 重启容器
docker restart rabbit
订单流量削峰
导入项目:
- 课前资料\elasticsearch\pd-商城项目案例.zip
pd-web 目录解压缩到 rabbitmq 工程目录 - 导入maven项目,选择 pd-web 下的 pom.xml
- file --- project structures ,配置jdk
- sqlyog ,右键点连接 --- 从sql转储文件导入
选择 pd-web 项目目录中的 pd.sql - 如果用 wht6.cn:3309,修改 application.yml 配置
- 右键点击 RunPdApp 类,启动项目
- 配置启动项,设置 working directory,设置成 pd-web 模块的目录
修改pd-web,发送订单到rabbitmq
- 添加依赖: starter-rabbitmq
- yml配置 rabbitmq 连接信息\
- 在启动类中(或自定义自动配置类)准备队列的参数
- OrderServiceImpl
- 添加 AmqpTemplate 用来发送消息的封装工具
- 在 saveOrder() 方法中发送消息
- 把 saveorder() 中的数据库代码都注释掉
动态配置刷新
2,3,4,9项目基础配置
- 添加依赖:
- rabbitmq
- bus
- yml 配置rabbitmq连接
- 09修项目修改 application.yml
- 2,3,4 修改 config目录的三个文件,推送到远程仓库
- 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配置
- 2,3,4,6 添加 zipkin 客户端依赖
- 6 添加 rabbitmq 依赖和连接配置
- 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
账户
- 实体类 Account
- AccountMpper 接口
- AccountMapper.xml
- AccountService
- AccountController
seata server
registry.conf
配置 seata server 向注册中心注册
file.conf
配置 seata server 运行过程中存储的日志的存储位置
seata-server.bat
配置使用的内存
订单添加 seata at 事务
- 父项目添加 seata 依赖
- 配置
- application.yml --- 事务组的组名
- registry.conf --- 注册中心地址,获得事务协调器的地址
- file.conf --- 事务组对应使用的协调器
- 数据源代理 --- 提供自动事务处理代码
- 业务方法添加事务注解
- @Transactinal --- 控制本地事务
- @GlobalTransactional --- 启动全局事务
库存和账户添加 seata at 事务
- 三个配置文件
- application.yml --- 事务组的组名
- registry.conf --- 注册中心地址
- file.conf --- 事务组对应的协调器
- 数据源代理
- 业务方法添加
@Transactional
控制本地事务
订单中,打开库存和账户的远程调用
TCC 事务
AT - 对业务无侵入,全自动事务,80%情况下都可以使用AT事务
TCC - 对业务有侵入,两阶段代码都需要自己来实现
订单添加 TCC 事务
- 添加 seata 依赖
- 三个配置文件,和 AT 事务相同
- 修改 Mapper 添加 TCC 的数据库操作
- 添加 TCC 操作接口和实现
- TCC三个方法,添加
@Transactional
- 修改业务代码,在业务中手动调用TCC第一阶段方法
- 业务方法添加
@GlobalTransactional
库存添加 TCC 事务
- 三个配置文件
- 修改 Mapper 添加 TCC 的数据库操作
- 添加 TCC 操作接口和实现,添加
@Transactional
- 修改业务代码,在业务中手动调用TCC第一阶段方法
账户添加 TCC 事务
- 三个配置文件
- 修改 Mapper 添加 TCC 的数据库操作
- 添加 TCC 操作接口和实现,添加
@Transactional
- 修改业务代码,在业务中手动调用TCC第一阶段方法
- 幂等性控制
sql 优化
select * from stu where name='张三'
name 添加索引,加速过滤
create index stu_name_index on stu(name)
mysql 测试一个查询条件是否会使用索引,扫描的数据量
explain select * from stu where name='张三'
加索引之前
index 扫描的数据量
none 16340063
加索引之后
index 扫描的数据量
stu_name_index 3
当数据量非常大时,sql优化解决不了问题,
必须分库分表 ---- MyCat
大量数据,要分散存储到数据库集群多台服务器
RocketMQ
- 克隆 centos-8-2105: rocketmq
- 设置ip
./ip-static
ip: 192.168.64.141
- mobaxterm 上传文件到 /root/
- 课前资料\分布式事务\rocketmq 文件夹下的三个文件
订单业务添加可靠消息最终一致性事务
- 无事务版本.zip 解压缩到 rocketmq-dtx 工程目录
- 导入
- 检查工程jdk配置
订单发送事务消息
- pom.xml 添加spring 封装的 rocketmq 依赖
- yml 配置 rocketmq 连接信息
- 事务状态表、实体类TxInfo、TxMapper
- 消息的封装对象,和JsonUtil
- 发送事务消息
账户接收消息执行账户金额扣减
- yml 配置 rocketmq 连接信息
- 添加消费者类接收消息
- 调用业务方法
docker
- 克隆 centos-8-2105: docker-base
- 设置ip:
./ip-static
ip: 192.168.64.150
ifconfig
- 上传离线安装文件到 /root/
- docker课前资料\docker-install 目录
- 按笔记执行安装
- 从 docker-base 克隆: docker
Docker 搭建redis集群
六个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 \
-v /opt/redis/7001/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7002 \
-v /opt/redis/7002/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7003 \
-v /opt/redis/7003/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7004 \
-v /opt/redis/7004/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
docker run -d --name redis7005 \
-v /opt/redis/7005/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf
执行命令配置集群
# 进入容器执行集群配置命令
docker exec -it redis7000 \
redis-cli --cluster create \
192.168.64.150:7000 192.168.64.150:7001 \
192.168.64.150:7002 192.168.64.150:7003 \
192.168.64.150:7004 192.168.64.150:7005 \
--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
标签:--,spring,redis,笔记,添加,conf,ip,docker,cloud
From: https://www.cnblogs.com/yolinzhao2/p/16822250.html