首页 > 其他分享 >达内 spring cloud 笔记

达内 spring cloud 笔记

时间:2022-10-24 17:58:39浏览次数:72  
标签:-- spring redis 笔记 添加 conf ip docker cloud

目录

随堂笔记

这是随堂笔记, 详细内容请参考在线笔记:
https://blog.csdn.net/weixin_38305440

笔记乱码问题

image-20200613174552258

课程安排(17到18天)

  1. Spring Cloud(6)
  2. RabbitMQ(2)
  3. Lucene Solr(1)
  4. 分布式事务(3)
  5. RocketMQ(1)
  6. Docker(2)
  7. Elasticsearch
  8. 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

搭建业务案例

  1. 新建父项目:springcloud1
  2. pom文件配置 springboot 和 springcloud 的版本
  3. 添加 commons 通用项目,添加通用代码

eureka 注册中心

搭建eureka注册中心

  1. 新建模块: sp05-eureka
  2. 配置 pom.xml 添加 eureka server 依赖
  3. application.yml
    1. 禁用保护模式
    2. 配置主机名,集群中用这个名字互相区分
    3. 针对单台服务器,不向自己注册、不从自己拉取
  4. 启动类添加注解 @EnableEurekaServer
    使用注解来触发自动配置

eureka的四条运行机制

  1. 注册
    客户端会一次次反复连接eureka服务器尝试注册,直到注册成功
  2. 拉取
    客户端每30秒拉取一次注册表,来刷新注册信息
  3. 心跳
    客户端每30秒发送一次心跳数据,
    服务器连续3次收不到一个服务的心跳,会删除这个服务的注册信息
  4. 自我保护模式
    在这种特殊模式下,所有的注册信息都不会删除
    • 15分钟内,85%服务器出现心跳异常,自动进入保护模式
    • 网络恢复正常后,自动退出保护模式
    • 开发调试期间,可以关闭保护模式,避免影响测试

注册中心客户端

修改 2,3,4 三个项目

  1. pom.xml 添加 eureka client 依赖
  2. application.yml 配置eureka的地址

订单调用商品和用户

修改 04

  1. 添加 openfeign 依赖
  2. 添加启动类注解 @EnableFeignClients
  3. 声明式客户端接口
    • ItemClient
    • UserClient
  4. 修改 OrderServiceImpl,使用声明式客户端接口调用远程服务

负载均衡

Feign集成了 Ribbon,通过Ribbon来实现了负载均衡功能,获得注册表中主机地址列表,在多个地址之间来回轮询调用

重试

Ribbon 在远程调用失败(宕机、异常、等待超时)时,会自动重试调用

  • 默认等待超时时间是 1 秒
  • 重试参数
    • MaxAutoRetries - 单台服务器重试次数,默认0
    • MaxAutoRetriesNextServer - 更换服务器的次数,默认1
    • ReadTimeout - 等待响应的超时时间,默认 1000
    • ConnectTimeout - 等待建立连接的超时时间,默认 1000
    • OkToRetryOnAllOperations - 是否对所有请求方式都进行重试,默认只对GET请求重试

Zuul - Api网关

  1. 统一的调用入口
  2. 统一的权限校验
  3. 集成 Ribbon 负载均衡和重试
  4. 集成 Hystrix 系统容错和限流

统一的调用入口:

  1. 新建模块: sp06-zuul
  2. 添加依赖: zuul
  3. application.yml
# 转发规则、路由规则
# **包含深层路径
# 下面的设置时默认设置,zuul 会根据注册表的注册信息进行配置,
# 最后手动配置,避免注册表不全
zuul:
  routes:
    item-service: /item-service/** 
    user-service: /user-service/**
    order-service: /order-service/**
  1. 启动类添加 @EnableZuulProxy

统一的权限校验

  1. 定义过滤器,继承 ZuulFilter
  2. 添加 @Component 注解,由 spring 自动创建实例
  3. zuul会在spring容器中找到过滤器实例,完成自动配置

模拟用户登录

http://localhost:3001/item-service/t34t34 没有登录不允许访问

http://localhost:3001/item-service/t34t34?token=t34t34t 已经登录可以访问

zuul 集成 ribbon 的负载均衡和重试

  • 默认已经启用负载均衡
  • 默认不启用重试,避免造成后台服务压力倍增,出现大面积故障

zuul 启用 ribbon 重试

  1. 添加 spring-retry 依赖
  2. yml 配置启用重试: zuul.retryable=true
  3. 默认重试参数:
    • ribbon.MaxAutoRetries=0
    • ribbon.MaxAutoRetriesNextServer=1
    • ribbon.ReadTimeout=1000

hystrix

类似 sentinel,系统的容错和限流

zuul 集成 hystrix,默认已经添加了 hystrix 依赖,并启用了 hystrix

hystrix 降级

当调用后台服务出错,可以执行当前服务中的一段代码,返回替代结果

  1. 实现 FallbackProvider 接口,添加降级代码
  2. 添加 @Component 注解,由spring自动创建实例
  3. zuul的自动配置会在spring容器中找到降级类的实例,自动完成配置

hystrix 熔断

  1. 10秒内20次请求(首先满足)

  2. 50%失败(异常,崩溃,超时),执行了降级代码

  3. 熔断后几秒,会进入“半开”状态,会尝试向后台服务发送一次客户端调用

    如果调用成功,会自动恢复正常,关闭断路器

    如果调用失败,继续保持打开状态

hystrix dashboard

hystrix 仪表盘

对降级容错处理,熔断限流的情况进行监控,快速定单位错误

hystrix dashboard利用 actuator 工具来暴露 hystrix 的监控日志

  1. 新建 sp07-hystrix-dashboard
  2. 添加依赖: hystrix dashboard
  3. yml
    • 允许抓取的服务器列表
  4. 启动类添加注解: @EnableHystrixDashboard
  5. 访问 http://localhost:4001/hystrix

actuator

spring 提供的一个项目日志监控工具,可以暴露系统的多种日志数据

  • 健康状态
  • 应用信息
  • 系统环境变量、参数
  • spring容器中所有的对象
  • spring mvc映射的所有访问路径
  • jvm虚拟机内存镜像
  • ....

添加 actuator

  1. 添加 actuator 依赖(zuul依赖中已经包含)
  2. 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 抓取合并后的多台服务器数据同时展现

  1. 新建 sp08-turbine
  2. 添加 turbine 依赖
  3. yml
    1. app-config: 指定服务id,同时抓取该服务的多台服务器
    2. name: 给合并后的数据命名,默认名是 default
  4. 启动类添加注解: @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

版本不兼容在这里设置:

image-20210625170448246

在虚拟机中已经做了一些基础环境准备:

  • 配置了阿里的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 仓库

  1. 新建文件夹 config
  2. 2,3,4项目的 application.yml 复制到 config 目录
    • item-service-dev.yml
    • user-service-dev.yml
    • order-service-dev.yml
  3. 创建本地仓库并提交
    • 已经创建过仓库,不要重复创建
  4. 推送远程仓库

搭建配置中心:

  1. 新建项目: sp09-config
  2. 添加 config server 依赖
  3. yml 配置
    • git仓库地址
    • 仓库中的文件夹: config
  4. 启动类注解: @EnableConfigServer

配置中心的客户端

  1. 2,3,4三个项目的 appliation.yml 注释掉
  2. 添加 config client 依赖
  3. 添加新的配置文件: bootstrap.yml
  4. 添加配置:
    • 连接eureka
    • 指定配置中心的 service-id
    • 下载的配置文件

bootstrap.yml

引导配置,springboot 应用启动之前,要先执行的一些配置,需要放到引导配置文件中,

rabbitmq 虚拟机

安装docker环境

  1. 克隆 centos-8-2105: rabbitmq

  2. 设置ip:

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

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

启动 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
    
  3. 浏览器访问 http://192.168.64.140:15672/

rabbitmq 虚拟机

安装docker环境

  1. 克隆 centos-8-2105: rabbitmq

  2. 设置ip:

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

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

启动 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
    
  3. 浏览器访问 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

  1. 添加依赖: starter-rabbitmq
  2. yml配置 rabbitmq 连接信息\
  3. 在启动类中(或自定义自动配置类)准备队列的参数
  4. 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 事务

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

账户添加 TCC 事务

  1. 三个配置文件
  2. 修改 Mapper 添加 TCC 的数据库操作
  3. 添加 TCC 操作接口和实现,添加 @Transactional
  4. 修改业务代码,在业务中手动调用TCC第一阶段方法
  5. 幂等性控制

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

  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配置

订单发送事务消息

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

账户接收消息执行账户金额扣减

  1. yml 配置 rocketmq 连接信息
  2. 添加消费者类接收消息
  3. 调用业务方法

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 \
-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

相关文章

  • SpringBoot代理图片、文件等路径
    在config文件夹下新增一个配置类即可 /***@authorcyl*@time2022/10/24*/@ConfigurationpublicclassMyWebAppConfigurationextendsWebMvcConfigurerAda......
  • SYSU-SSE 3D游戏编程与设计 学习笔记(2)--空间与运动
    前言中山大学软件工程学院3D游戏编程与设计课程学习记录博客游戏代码:游戏代码简答题游戏对象运动的本质是什么游戏对象的运动过程本质上就是游戏对象transform......
  • springcloud学习记录day06--在Java中使用elasticsearch
    RestClient查询文档发起查询请求以matchall为例代码解读:第一步,创建SearchRequest对象,指定索引库名第二步,利用request.source()构建DSL,DSL中可以包含查询、分页......
  • Spring —— 集合注入
    数组注入  List集合注入  set集合注入  Map集合注入  Properties集合注入   ......
  • springboot~redis-cluster动态感应的配置
    redis-cluster是一个高可用,可分片的分布式redis集群解决方案,建议使用springboot2.3及以上版本的脚手架,如果是<2.3版本,你需要手动添加LettuceConnectionFactory来实现因为服......
  • WGCLOUD无法连接到mysql数据库的原因
    WGCLOUD有时候连不上mysql数据库,我们按照以下几点来排查下:1.我们首先检查server/config/application.yml中mysql连接配置是否正确,比如用户名密码这些2.再检查mysql是否已......
  • Openpyxl笔记
    Openpyxl笔记常用方法01安装1、找到pip3.exe所在的文件夹,复制路径我的路径是:C:\Users\孙艺航\AppData\Local\Programs\Python\Python37\Scripts2、按Win+R,输入CMD......
  • 【Java八股】spring中有两个id相同的bean会报错吗?
    首先,在同一个bean里面不能出现存在id相同的两个bean,否则spring容器在启动时会报错。因为id是表示bean里面的唯一标志符号,所以spring在启动的时候回去验证id的唯一性,一旦发......
  • 狂神说Redis学习笔记
    Redis1、NoSQL概述1.1、为什么要用Nosql1、单机MySQL的年代!90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!那个时候,更多的去使用静态网页Html~服......
  • 乌班图学习笔记2:终端设置1
    乌班图22使用学习2_来自金沙江的小鱼_新浪博客(sina.com.cn)上面是新浪博客的链接,为了避免关闭服务,我在这里重新记录一遍。使用乌班图,主要是为了安装Geant,而安装geant4......