changgou-day04

目标(高并发的优化)

  • 实现首页的广告的展示解决方案
    • 广告表
    • 广告分类表
    • 实现的解决方案
  • lua + openresty+redis (实现多级缓存)+限流(掌握)
    • lua
    • openresty
    • 实现业务逻辑(多级缓存实现广告数据展示)
  • canal的中间件
  • 同步的解决方案(掌握)

    1 首页广告实现的思路

    1608943528991.png
    changgou-day04 - 图2
    优化之后的解决方案:
    changgou-day04 - 图3
    1. 1.先从openresty 通过lua脚本链接redis
    2. 2.再从redis 通过lua脚本链接Mysql
    3. 3.mysql找数据返回

    2 lua

    Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能

    3 openresty

    1. 是一个基于nginxweb平台,主要是集成了lua的模块 直接提供给我们开发人员使用。能够实现超高性能的处理 1000K
    安装:默认是安装到/usr/local/openresty
    1. yum install openresty
    nginx:
    1. --刷新配置
    2. ./nginx -s reload
    3. --启动
    4. ./nginx
    5. --关闭
    6. ./nginx -s stop

    4 需求

    ``` 查询数据库的数据 将数据存储到redis中 思路: 请求 到openresty openresty接收请求 转发给lua脚本来处理 lua脚本的业务逻辑如下:
    • 链接到数据库,查询数据库的广告的数据
    • 将数据转成JSON字符串
    • 链接到redis 将数据存储到redis中 请求:/update_content?id=1 参数: id —指定广告分类的id 返回值: json

步骤:

  1. + 1.配置/usr/local/openresty/nginx/conf/nginx.conf
  2. + 2.编写lua脚本(添加逻辑处理)
  3. + 3.重新刷新conf配置文件
  1. ![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635088543134-4e57ddcf-4b23-4181-9aec-843c22cc858a.png#id=cBfTV&originHeight=730&originWidth=1773&originalType=binary&ratio=1&status=done&style=none)
  2. <a name="It0zN"></a>
  3. ### 5 需求(实现高兵的解决方案)

需求: 先从openresty的缓存中的数据 如果能获取直接返回 如果获取不到,再从redis中获取数据 如果能获取,将redis的数据存储到openresty中,再直接返回 如果获取到redis中的数据,再从mysql中获取,将数据存储到redis中,再返回。 思路: 请求 到openresty openresty 接收请求 转发给lua脚本来处理 lua脚本的逻辑:需求说明 请求:/read_content 参数:id 返回值:JSON 步骤:

  1. + 0.设置nginx缓存对象 并分配内存空间
  2. + 1.配置/usr/local/openresty/nginx/conf/nginx.conf
  3. + 2.编写lua脚本(添加逻辑处理)
  4. + 3.重新刷新conf配置文件
  1. ![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635088543230-46493f7c-7d54-4991-bef9-5c8c984c1d01.png#id=ZuaDa&originHeight=876&originWidth=1814&originalType=binary&ratio=1&status=done&style=none)
  2. <a name="ChBOC"></a>
  3. ### 6 限流
  • 1.控制速率
  • 2.控制连接数量
    1. 控制速率:<br />![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635088543349-aef3d25b-137e-4a32-b5b3-588f5420329d.png#id=RsQG6&originHeight=720&originWidth=1536&originalType=binary&ratio=1&status=done&style=none)
    2. <a name="vztDV"></a>
    3. ### 7 canal
    canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 总结:就是一个服务器。实现监听数据变化,处理某一些业务逻辑。
    1. canal有两个角色:
    canal-server 服务端 伪装他自己是一个malseter的 slave canal-client 客户端 用来监听canal-server客户端(java的客户端:处理数据以及业务逻辑)
    1. 有个canal之后简单的同步的思路:
    1.有个数据库 是master 2.canal-server 是slave(伪装的) 3.canal-client 进行监听canal-server 4.一旦数据库master发生数据更新,canal-server就获取到数据,canal-client 监听到数据变化,在客户端中代码实现:统一获取到数据,进行同步即可
    1. 搭建canal并实现监听数据的变化的步骤:
  1. mysql 需要开启binlog (master角色)
  2. mysql 创建一个账号 用于salve专门使用,授予权限slave的权限 远程授权。
  3. 通过docker 安装canal-server
  4. 配置canal-server(配置连接到的master的ip和端口 以及自身的账号和密码以及要监听的数据库和表有哪些)
  5. 搭建canal-client(java微服务:监听canal-server 获取被修改的数据,然后做业务逻辑:同步数到redis中) 1.先下载参考,再安装起步依赖到本地仓库 2.再添加起步依赖 刷新 3.创建启动类启用canalclient 4.创建监听类 监听canal-server 实现当发生了CRUD的时候执行业务代码 5.配置客户端对应的服务端的地址和端口

6.canal-client写代码验证是否能监听到数据。

  1. 修改mysqld.cnf

docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf ./ vi mysqld.cnf

  1. 修改内容:<br />![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635088543453-f624ba6f-1ebe-4246-8ed6-0318b108a602.png#id=NrIzS&originHeight=253&originWidth=982&originalType=binary&ratio=1&status=done&style=none)<br />copy 到容器内部:

docker cp myqld.cnf mysql:/etc/mysql/mysql.conf.d/

  1. mysql授权:

create user canal@’%’ IDENTIFIED by ‘canal’; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON . TO ‘canal’@’%’; FLUSH PRIVILEGES; ``` 重启容器
配置canal-server: exmpale/instance.propetiers
changgou-day04 - 图4
feign调用的说明:
changgou-day04 - 图5