随堂笔记

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

笔记乱码问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jj7DWoR-1636982358216)(note.assets/image-20200613174552258.png)]

课程安排(17到18天)

  1. Spring Cloud Netflix(6)
  2. RabbitMQ(2)
  3. 分布式事务(3)
  4. RocketMQ(1)
  5. Docker(2)
  6. Elasticsearch
  7. Kubernetes(3)

Spring Cloud Netflix

  • 注册中心
    • Nacos
    • Eureka
  • 配置中心
    • Nacos
    • Spring Cloud Config
  • 远程调用、负载均衡
    • Feign、Ribbon
  • 系统容错、限流
    • Sentinel
    • Hystrix
  • API网关
    • Spring Cloud Gateway
    • Zuul
  • 数据监控
    • Sentinel
    • Hystrix Dashboard+Turbine
    • 链路跟踪监控:Sleuth+Zipkin

eureka

服务的注册和发现

搭建eureka注册中心服务器

  1. 新建 module: sp05-eureka
  2. 调整pom.xml
    • 父项目
    • 添加 eureka server 依赖
  3. yml
    • 关闭自我保护模式
    • 主机名
    • 针对单台服务器,不向自己注册,不从自己拉取
  4. 启动类注解:@EnableEurekaServer 触发 eureka 服务器的自动配置

eureka四条运行机制

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

客户端连接 eureka 注册中心

修改 2,3,4 项目

  1. 添加 eureka client 依赖

  2. yml

    eureka连接地址: http://eureka1:2001/eureka

高可用

02商品服务

  1. 右键点击02的启动配置
    或者点上面的启动配置下拉菜单
    选择 “Edit Configuration”
  2. 对02创建两个启动配置,设置启动参数--server.port=xxxx

05eureka注册中心

04调用02、03

  1. 在 04 的 pom.xml 添加依赖: openfeign
  2. 启动类添加注解:@EnableFeignClients 触发Feign的自动配置
  3. 定义远程调用接口:
    • ItemClient
    • UserClient
  4. OrderServiceImpl,实现远程调用

Feign 集成 Ribbon 负载均衡和重试

  • Feign集成Ribbon,默认实现了负载均衡和重试

Ribbon的重试

远程调用失败,可以自动发起重试调用

  • 异常
  • 服务器宕机
  • 后台服务阻塞超时

重试参数:

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

Zuul API 网关

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

统一的访问入口

  1. 新建模块: sp06-zuul

  2. 添加依赖:

    • eureka client
    • zuul
    • sp01
  3. yml 配置路由转发规则

    #  **包含深层路径
    #  * 只包含一层路径
    
    # 服务id设置成访问子路径,是默认规则,
    # zuul根据注册表的注册信息完成自动配置
    # 最好手动配置,防止注册表不全
    zuul:
      routes:
        item-service: /item-service/**
        user-service: /user-service/**
        order-service: /order-service/**
    
  4. 启动类添加注解 @EnableZuulProxy

zuul统一权限校验

http://localhost:3001/item-service/t45t4 没有登录不能访问

http://localhost:3001/item-service/t45t4?token=65345rt 已经登录过,可以访问

  1. 新建 ZuulFilter 子类
  2. 按 zuul 的规则实现
  3. 添加 @Component 注解

zuul 的自动配置类可以在 spring 容器中自动发现过滤器实例,完成自动配置

zuul集成Ribbon

  • 默认启用了负载均衡

  • 默认没有启用重试

    • 在入口位置进行重试,会造成后台大面积服务压力翻倍,可能造成故障传播、雪崩
  • zuul启用重试(不推荐)

    1. 添加 spring-retry 依赖
    2. yml配置 zuul.retryable=true
    3. 配置重试参数(可选)

zuul集成 Hystrix

Hystrix是容错和限流工具

  • 容错 – 降级

    调用后台服务出错(异常,阻塞,服务崩溃),可以执行当前服务的一段代码,直接向客户端返回降级结果

    • 错误提示
    • 缓存的结果
    • 根据业务逻辑,返回任意的结果
  • 添加 Hystrix 降级

    1. Zuul默认已经启用 Hystrix
    2. 实现 FallbackProvider 接口,按zuul的规则实现接口的方法
    3. 添加 @Component
  • Hystrix 限流 - 熔断

    • 当流量过大,造成后台服务故障,可以断开链路,限制后台服务的访问流量,等待后台服务恢复
    • 断路器打开的条件
      • 10秒20次请求(必须首先满足)
      • 50%出错,执行降级代码
    • 半开状态
      • 断路器打开一段时间后,会进入半开状态
      • 会尝试发送一次客户端调用,
        • 成功,关闭断路器,恢复正常
        • 失败,继续保持打开状态

Hystrix dashboard

Hystrix数据监控仪表盘

Hystrix日志,是通过 Actuator 工具来暴露出来

Actuator

springboot 提供的一个项目指标工具,可以通过Actuator获取项目的各种日志数据

  • 健康状态

  • spring容器中所有的对象

  • spring mvc映射的所有路径

  • jvm堆内存镜像

  • 添加 Actuator

    1. 添加 actuator 依赖

    2. 暴露监控日志

      m.e.w.e.i= "*"  暴露所有日志
      m.e.w.e.i= health  暴露健康状态日志
      m.e.w.e.i= health,beans,mappings,hystrix.stream  暴露多种日志
      
    3. 查看日志

      http://localhost:3001/actuator

搭建 Hystrix dashboard

  1. 新建模块: sp07-hystrix-dashboard

  2. 添加依赖: Hystrix dashboard

  3. yml配置

    允许抓取的服务器列表: localhost
    
  4. 启动类添加注解: @EnableHystrixDashboard

  5. 访问 http://localhost:4001/hystrix

Turbine

聚合多台服务器的日志数据,提供给仪表盘显示

  1. 新建模块: sp08-turbine

  2. 添加依赖

    • eureka client
    • turbine
  3. yml

    聚合的服务: zuul
    为聚合的日志数据命名:new String("default")
    
  4. 启动类注解:@EnableTurbine

合并的日志地址: http://localhost:5001/turbine.stream

VMware

  • VMware 版本: 16+

  • NAT网络网段使用 64 网段

    • 编辑 – 虚拟网络编辑器 – 选择 vmnet8 – 左下角修改:192.168.64.0
  • 虚拟机镜像

    • 课前资料\虚拟机\
      • centos-7-1908.zip
      • centos-8-2105.zip
    • 已经做了几步基础设置:
      • yum源和扩展源,使用阿里镜像
      • 安装了工具: python、pip、ansible
      • 方便设置ip地址的脚本:
        • ip-static 设置固定ip
        • ip-dhcp 自动获取ip
  • 加载虚拟机

    1. 解压缩 centos-8-2105.zip
    2. 双击 centos-8-2105.vmx 加载镜像
    3. 启动虚拟机,按提示选择“已复制虚拟机”
    4. 用户名密码都是 root

网卡不可用

# centos 7 禁用 NetworkManager 系统服务
systemctl stop NetworkManager
systemctl disable NetworkManager

# centos 8 开启 VMware 托管
nmcli n on
systemctl restart NetworkManager

# 还原 VMware 虚拟网络
# VMware 虚拟网络不稳定,经常出现故障

# 编辑 -- 虚拟网络编辑器 -- 左下角按钮“还原默认设置” -- 设置 VMnet8 的 64 网段

# 会删除所有虚拟网络,重新创建

离线安装 Docker

  1. 上传离线文件到 /root/

    • \DevOps课前资料\docker\docker-install 文件夹
  2. 参考笔记,从第三步开始安装

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

配置中心

准备 Git 仓库

把 2,3,4 三个项目的配置文件,存放到git仓库

  1. 在 springcloud1 下新建文件夹: config
  2. 把 2,3,4 三个项目的配置文件,复制到 config 目录
    • item-service-dev.yml
    • user-service-dev.yml
    • order-service-dev.yml
  3. 添加 override-none=true 防止配置中心的配置,覆盖本地命令参数
  4. (有仓库的同学不用重复创建)
    1. VCS – create git repository
      或 double shift,搜索 create git repository
    2. 选择 springcloud1 工程目录作为仓库目录
    3. commit 提交本地仓库,ctrl+k,右上角对勾按钮,double shift搜索commit
    4. 选择所有文件,填写提交信息,提交
  5. (有仓库的同学不用重复创建)
    在 gitee 点右上角加号新建仓库
    • 仓库名称: springcloud1
    • 设置开源项
  6. ctrl+shift+k,右上角向上箭头按钮,double shift搜索push
  7. push界面,点击 define remore 连接,填写远程仓库地址,完成推送

搭建配置中心服务器

  1. 新建模块: sp09-config

  2. 添加依赖

    • eureka client
    • config server
  3. yml

    • 仓库的地址

    • 存放配置文件的文件夹路径

    • 之后测试如果有问题,果断换仓库

      https://gitee.com/xyxyxyxyx/springcolud01
      
      config
      
  4. 启动类注解: @EnalbleConfigServer

确认配置中心服务器是否正确

  1. http://eureka1:2001/ 检查是否有 config-server 的注册信息
  2. 访问配置中心的配置文件
    • http://localhost:6001/item-service/dev
    • http://localhost:6001/user-service/dev
    • http://localhost:6001/order-service/dev

配置中心的客户端

  1. 把 2,3,4 的配置文件全部注释掉
  2. 添加依赖: config client
  3. 新建配置文件: bootstrap.yml
  4. 添加配置:
    • eureka地址
    • 指定配置中心的服务id:CONFIG-SERVER
    • 指定下载的配置文件和 profile

确认

  • 启动控制台中,要看到连接 6001 的日志

Rabbitmq

消息队列、消息服务、消息中间件、Broker

  • Rabbitmq
  • Activemq
  • Rocketmq 阿里
  • Kafka
  • Tubemq 腾讯

搭建Rabbitmq服务器

  1. 克隆 docker-base: rabbitmq

  2. 设置ip

    ./ip-static
    ip: 192.168.64.140
    
    ifconfig
    
  3. 下载 rabbitmq 镜像

    docker pull rabbitmq:management
    
    或者从 code 下载 rabbit-image.gz
    上传到服务器,然后执行镜像导入
    docker load -i rabbit-image.gz
    
  4. 启动rabbitmq容器

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
 
重启 docker 系统服务
systemctl restart docker

mkdir /etc/rabbitmq
vim /etc/rabbitmq/rabbitmq.conf

# 添加两行配置:
default_user = admin
default_pass = admin

docker run -d --name rabbit \
-p 5672:5672 \
-p 15672:15672 \
-v /etc/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-e RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf \
rabbitmq:management

访问管理控制台 http://192.168.64.140:15672
用户名密码是 admin

Bus 配置刷新

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9QZmjYg-1636982358218)(note.assets/image-20211022163759194.png)]

  1. 修改 2,3,4,9 添加依赖

    • Bus
    • Rabbitmq
    • binder-rabbit
  2. 09添加依赖: actuator

  3. 09的yml配置:

    • 暴露 bus-refresh:

      m.e.w.e.i=bus-refresh

    • rabbitmq连接

  4. 修改 2,3,4 的yml 配置,修改 config 目录的三个文件并提交

    • rabbitmq连接

启动项目测试

  1. 启动5,耐心等待完全启动完成
  2. 启动9,耐心等待完全启动完成
  3. --------- http://eureka1:2001 注册表中存在 config-server
    http://localhost:6001/item-service/dev
    http://localhost:6001/user-service/dev
    http://localhost:6001/order-service/dev
  4. 启动 2,3
  5. 启动 4
  6. --------- 查看 2,3,4 的控制台,要看到连接 6001
  7. 启动6
  8. --------- http://localhost:6001/actuator 这里面要看到 bus-refresh
  9. 使用 postman 向 http://localhost:6001/actuator/bus-refresh 提交 post 请求
  10. 观察 2,3,4 的控制台,要看到重新连接 6001 刷新配置的日志

把刷新到的配置信息,重新注入到对象中

@RefreshScope

在需要重新注入配置数据的对象上添加这个注解,刷新的配置才能重新注入到对象中;

如果加这个注解,即使刷新到新配置,也不会重新向对象注入

链路跟踪

  • sleuth

    产生链路跟踪日志

  • zipkin

    日志的可视化

sleuth

A --> B --> C --> D

A, U5HG4HG456UYU, U5HG4HG456UYU, true

B, U5HG4HG456UYU, O7IUYH45TY34Y45, true

C, U5HG4HG456UYU, U56YU4Y344U456, true

D, U5HG4HG456UYU, 34T345Y456U56U5, true

修改 2,3,4,6 添加 sleuth 产生链路跟踪日志

  • 只需要添加 sleuth 依赖
  • sleuth 是自动配置,不需要添加任何其他配置

2,3,4,6 向rabbitmq 发送日志数据

  1. 添加 zipkin 客户端依赖
  2. 在 06 添加 rabbitmq 依赖
  3. yml 配置发送方式: rabbit
  4. 修改 06的yml,添加 rabbitmq 连接配置

起动zipkin服务器

# 使用 140 服务器,没有 virtual host
java -jar zipkin-server-2.23.4-exec.jar --
zipkin.collector.rabbitmq.uri=amqp://admin:admin@192.168.64.140:5672

# 使用 140 服务器,有 virtual host
java -jar zipkin-server-2.23.4-exec.jar --zipkin.collector.rabbitmq.uri=amqp://admin:admin@192.168.64.140:5672/vh0

# 使用我的服务器,有 virtual host
java -jar zipkin-server-2.23.4-exec.jar --zipkin.collector.rabbitmq.uri=amqp://admin:admin@wht6.cn:5672/vh0

向注册中心注册时,选择正确网卡,注册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:服务id:端口

订单流量削峰

导入项目

  1. 课前资料\elasticsearch\pd-商城项目案例.zip
    压缩文件\pd\pd-web 文件夹,解压到 rabbitmq 工程目录
  2. pd-web\pom.xml 鼠标拖拽到 idea,springboot 版本改成 2.3.2.RELEASE
  3. pom.xml编辑器中,右键–add as maven project, 导入 pd-web 模块

导入数据库

  1. sqlyog, 右键点连接, 从 sql 转储文件导入,选择 pd-web 目录中的 pd.sql

  2. 如果导入失败,可以增大 mysql 缓存大小

    如果导入失败,可以增大 mysql 缓存区
    set global max_allowed_packet=100000000;
    set global net_buffer_length=100000;
    SET GLOBAL  interactive_timeout=28800000;
    SET GLOBAL  wait_timeout=28800000
    

启动项目测试

  1. application.yml

    修改数据库连接的密码

  2. 右键点击 RunPDApp — run

  3. 修改启动配置,working directory 设置成 pd-web 模块文件夹的路径

  4. 重启项目

  5. 访问 http://localhost

测试现有订单系统

  1. 删除数据库中的所有注册用户和订单

    delete from pd_user;
    
    delete from pd_order;
    
    delete from pd_order_item;
    
  2. 点右上角,登录,注册新用户

  3. 右上角地址管理,填写收货地址

  4. 下订单

生成订单的代码

  1. OrderController.submitOrder()
  2. OrderServiceImpl.saveOrder()

向 Rabbitmq 发送订单

  1. pom.xml 添加 rabbitmq 依赖
  2. yml添加rabbitmq连接
  3. 在启动类,或者添加自动配置类
    给出使用的队列参数: orderQueue,true,false,false
  4. 修改 OrderServiceImpl,使用 AmqpTemplate 工具类,向 orderQueue队列 发送订单消息

消费者接收订单,存储到数据库

  1. 新建OrderConsumer 消费者类
  2. 通过注解配置来接收订单消息
  3. 收到的订单,直接调用业务方法 saveOrder() 保存到数据库
  4. 调整 OrderServiceImpl

分布式事务

搭建业务案例

数据库初始化工具

执行多次测试后,库存和账户金额都会减少,可以执行初始化工具,把数据重置到初始状态,再重新测试

  1. 新建空工程: seata-at
  2. 新建spring模块: db-init
  3. 添加依赖: spring jdbc,mysql driver
  4. yml 配置数据库连接
  5. 在 resources 目录创建四个 sql 脚本文件
    • 新建sql子目录,在sql 目录下创建文件
  6. 启动类中添加代码,执行这四个 sql 脚本

mysql 旧版本,需要调整sql脚本

  1. 四个文件中的 DATETIME(6),把小括号6去掉,改成DATETIME
  2. order.sql 最后一行,两个 NOW() 改成 0

三个业务模块

  1. 新建 spring 模块
  2. 调整 pom.xml,从 order-parent 继承
  3. yml配置
    • app.name
    • port
    • 注册中心
    • jdbc连接信息
    • mybatis-plus
    • 显示 mapper 执行的sql语句日志
    • bootstrap.yml 选择网卡
  4. 实体类
  5. Mapper
  6. 启动类添加注解:@MapperScan
  7. Service
  8. Controller

全局唯一id发号器

分布式系统中,多个模块可以从发号器获得不重复的id

https://github.com/lookingatstarts/easyIdGenerator

这个开源项目支持两种产生id的算法:

  • 雪花算法
  • 使用数据库产生不重复id

订单远程调用 storage, account, easy-id

  1. 父项目中已经添加 feign 依赖
  2. 启动类添加注解:@EnableFeignClients
  3. 添加三个远程调用接口
    • EasyIdClient
    • StorageClient
    • AccountClient
  4. OrderServiceImpl 完成远程调用
  5. 禁用 Ribbon 重试,避免干扰观察分布式事务执行效果

Seata AT 事务

部署 seata server (TC 事务协调器)

  1. 课前资料\分布式事务\seata-server-1.3.zip
    解压缩
  2. 修改三个配置文件
    • registry.conf – 向注册中心注册
    • file.conf – 协调器运行过程中记录的日志数据,要存到数据库
    • seata-server.bat – 使用的内存默认 2G,测试环境把内存改小:256m
  3. 执行 seata-server.bat 启动协调器
  • 必须用 jdk 1.8
  • 不能关闭命令行窗口
  • 窗口中的内容不能选中,如果选中,窗口中的应用会挂起(暂停)

订单模块添加 Seata AT 事务

  1. 父项目中添加 seata 依赖
  2. order中配置三个配置文件
    • application.yml – 事务组的组名
    • registry.conf – 注册中心的地址
    • file.conf – 上面的事务组,使用哪个协调器
  3. 新建自动配置类,创建 DatasourceProxy 数据源代理对象
    • AT事务的自动事务处理代码,都是有数据源代理提供的
  4. 禁用 spring 默认的数据源配置
  5. 在业务方法上添加事务注解
    • spring 本地事务 @Transactional
    • seata 启动全局事务 @GlobalTransactional (只在第一个模块上添加)

TCC 事务

有侵入的事务方案

  • 事务控制代码需要自己编写
  • 业务代码也需要修改
  • 底层数据库表结构也要修改

AT事务适用于 80% 业务场景,在一些复杂情况下,自动事务无法自动处理,就需要手动处理事务

TCC - 两个阶段的三个操作

  • 第一阶段
    • Try - 预留资源、冻结数据
  • 第二阶段
    • Confirm - 确认资源,使用冻结数据完成业务处理
    • Cancel - 取消预留的资源,把之前冻结的数据回滚(解冻、恢复)回去

新建工程,导入无事务版本

  1. 新建 empty 工程: seata-tcc
  2. 无事务版本的 4 个文件夹,解压缩到工程目录
  3. 导入
    • project structure 中添加 module
    • double shift 搜索 add maven project
    • 拖拽 pom.xml ,右键 add as maven project

添加 TCC 事务

  1. 添加 seata 依赖
  2. 三个配置文件
    • application.yml – 事务组
    • registry.conf – 注册中心地址
    • file.conf – 事务组对应协调器
  3. 修改Mapper,添加 TCC 数据库操作
  4. 按照 seata tcc 的实现规则,定义 TccAction 接口和实现
    • 添加三个方法,实现 TCC 三个操作
    • 三个方法都添加 @Transactional 注解,控制本地事务
  5. 修改业务方法,调用 TccAction 的第一阶段方法
  6. 第二阶段的方法,由 seata 的 RM 组件自动调用
  7. 在第一个模块,添加 @Globaltransactional 启动全局事务
  • 第一阶段,冻结数据失败,二阶段回滚也会执行
  • 二阶段失败,TC会重复发送二阶段指令,模块会重复执行二阶段操作

幂等性控制

让多次重复的操作,和一次操作的结果相同

  • 第一阶段成功,设置一个“一阶段成功标记”;失败就没有标记

  • 二阶段执行前,先检查标记是否存在,如果存在执行第二阶段操作

    二级段执行完成后,删除标记

可靠消息最终一致性事务

Rocketmq 提供了事务消息高可靠消息

搭建Rocketmq服务器

  1. 克隆 centos-8-2105: rocketmq

  2. 设置ip

    ./ip-static
    ip:  192.168.64.141
    
    ifconfig
    
  3. 上传文件到 /root/

    • 课前资料\分布式事务\rocketmq\ 目录中的三个文件
  4. 后面安装参考 csdn 笔记

Rocketmq 可靠消息最终一致性事务

导入项目

  1. seata-at/无事务版本.zip, 解压到 rocketmq-dtx 工程目录
  2. 导入
    • 工程模块管理中,添加模块
    • double shift,搜索 add maven project
    • 拖拽pom.xml到 idea,右键 add as maven project

订单使用事务消息,异步调用账户

订单添加事务消息

  1. 父项目添加 spring Rocketmq 依赖
  2. yml 配置 rocketmq 连接和生产者组名
  3. 添加新的数据表 tx_table,用来存储事务执行状态
  4. 添加实体类 TxInfo 和 TxMapper
  5. 新建 AccountMessage,用来封装发给账户的调用信息: userId, money, txId
  6. 工具类:JsonUtil
  7. OrderServiceImpl 发送事务消息
  8. 实现事务监听器

账户接收消息,扣减账户

  1. 依赖
  2. yml配置 name server
  3. AccountMessage
  4. JsonUtil
  5. 新建消费者类: AccountConsumer,实现消费者接口
  6. 通过注解配置接收消息
  7. 扣减账户

Docker

准备docker服务器

  1. 克隆 docker-base: docker

  2. 设置ip

    ./ip-static
    ip: 192.168.64.150
    
    ifconfig
    
  3. 上传文件到 /root/

    • docker-images.gz
    • tomcat 文件夹
  4. 导入镜像:

    docker load -i docker-images.gz 
    
    docker images
    

用 tomcat:10 运行 helloworld web应用

1. 准备 jsp 文件
mkdir /opt/web
vim /opt/web/index.jsp

添加内容:
<h1>Hello wolrd!</h1>
<h1>Hello ${param.name}!</h1>

2. 启动 tomcat:10 容器
docker run -d --name web \
--restart=always \
-p 80:8080 \
-v /opt/web:/usr/local/apache-tomcat-10.0.6/webapps/ROOT \
tomcat:10

3. 访问 http://192.168.64.150 、 http://192.168.64.150/?name=zhangsan


Elasticsearch

全文检索引擎服务器

  1. 克隆 docker-base: es

  2. 设置ip

    ./ip-static
    ip: 192.168.64.181
    
    ifconfig
    
  3. 上传文件到 /root/

    • pditems 文件夹
    • elasticsearch-analysis-ik-7.9.3.zip
    • es-img.gz
  4. 导入镜像:

    docker load -i es-img.gz
    
  5. 增加服务器内存到 2G 或以上

  6. 修改 Linux 底层系统参数

    echo 'vm.max_map_count=262144' >>/etc/sysctl.conf
    
  7. 关闭防火墙

    # 关闭防火墙
    systemctl stop firewalld.service
    
    # 禁用防火墙
    systemctl disable firewalld.service
    
  8. 重启服务器 shutdown -r now

  9. 检查底层系统参数是否添加正确 vim /etc/sysctl.conf

按照笔记,启动 es 三个节点的容器

  1. 准备虚拟网络和挂载目录
  2. 启动 Elasticsearch 集群

Spring Data Elasticsearch

Criteria 数据查询

  • Criteria - 封装搜索条件
  • CriteriaQuery - 封装上面的条件对象、分页参数
  • ElasticsearchOperations - 用来执行查询的工具

分页

  • Pageable - 向服务器提交的分页参数,page、size

  • Page - 从服务器返回的一页数据,数据列表、分页信息(可选,可以直接使用 List<…>)

  • Repository

    Page<Student> findByName(String key, Pageable pageable);
    
  • Criteria

    Criteria c = ...
    CriteriaQuery q = new CriteriaQuery(c);
    q.setPageable(pageable);
    ....
    

拼多商城商品搜索

  1. 添加 spring data es 依赖
  2. yml 配置 es 服务器地址
  3. 新建实体类 Item,封装从 es 搜索的数据
  4. 新建 ItemRepository 接口
  5. 添加搜索方法: findByTitleOrSellPoint()
  6. SearchService
  7. SearchController
  8. search.jsp

Kubernetes

容器自动管理工具、持续部署工具

谷歌的开源工具,开源之前在谷歌内部使用了几年的时间,管理上千万的容器

安装搭建 Kubernetes 集群

安装过程非常复杂,即使对专业运维难度也非常大,有开源工具辅助安装K8s集群

  • 一键安装:https://github.com/easzlab/kubeasz
  • 一步步手动安装:https://github.com/opsnull/follow-me-install-kubernetes-cluster

第一台服务器

  1. 克隆 centos-8-2105: k1

  2. 设置ip

    ./ip-static
    ip: 192.168.64.191
    
    ifconfig
    
  3. kubeasz-3.1.0.zip 解压缩

  4. 上传文件

    • images.gz 上传到 /root/
    • kubeasz-3.1.0/ezdown 上传到 /root/
    • kubeasz-3.1.0/kubeasz 文件夹上传到 /etc/
  5. 内存设置 2G 或 2G 以上

  6. cpu 设置成两块

  7. 重启服务器

准备安装环境

cd ~/
chmod +x ./ezdown

# 1.下载离线安装文件,如果存在,不会重复下载
# 2.安装Docker
./ezdown -D

docker info

docker load -i images.gz

docker images

克隆 k1,克隆出 k2 和 k3

  • k1先关机

  • 方案1,从 k1 克隆出 k2 和 k3

  • 方法2,从 k1 只克隆一个 k2

  • 修改 k2 和 k3 的 ip

    • 192.168.64.192
    • 192.168.64.193

191继续配置安装环境

cd ~/
./ezdown -S

sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' /etc/kubeasz/example/config.yml 

# 生成公钥和私钥
ssh-keygen -t rsa -b 2048 -N '' -f ~/.ssh/id_rsa
# 公钥复制到三台主机,包括自己
ssh-copy-id 192.168.64.191
ssh-copy-id 192.168.64.192
ssh-copy-id 192.168.64.193

# 使用离线安装工具,新建集群安装方案
cd /etc/kubeasz
chmod +x ezctl
./ezctl new cs1

修改集群方案 cs1 的配置文件 hosts

三台服务器都拍摄快照,如果集群安装失败,可以回退到快照重新安装

  • 可能出错的情况
    1. 漏做某一步
    2. hosts 文件修改错误
    3. 内存不足引起安装失败
      可以释放更多内存、加大虚拟机内存

执行一键安装脚本

cd /etc/kubeasz

./ezctl setup cs1 all

Kubernetes 的三个核心对象

  • Pod

    Pod是K8s的容器, 是 K8s 对 Docker 容器的封装对象,

    一个 Pod 可以封装多个 Docker 容器,

    Pod是对底层容器化技术的解耦工具,底层容器可以使用 Docker 或 Containerd

  • 控制器

    控制容器的自动部署和自动销毁

  • Service

    提供一个不变的访问入口,Service可以向所有容器以负载均衡的方式,转发调用

K8s 部署 Springcloud1 微服务模块

构建镜像

  1. 上传文件到 /root/

    • DevOps课前资料\kubernetes\k8s案例\v2\
      目录中的 5 个文件夹
  2. 构建镜像

    cd ~/
    
    docker build -t centos7-jdk8:v1 jdk/
    docker build -t sp-eureka:v1 eureka/
    docker build -t sp-item:v1 item/
    docker build -t sp-user:v1 user/
    docker build -t sp-order:v1 order/
    
    查看镜像列表
    docker images
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnRGS1xN-1636982358220)(note.assets/image-20211110115009868.png)]

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐