# Docker中学习微服务 **Repository Path**: liiy250/docker-php-env ## Basic Information - **Project Name**: Docker中学习微服务 - **Description**: Docker部署LNMP环境(Linux + Nginx + MySQL + PHP) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-15 - **Last Updated**: 2025-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 微服务架构学习 > 2025-03-06本次学习,通过docker compose完成了微服务架构的搭建。并通过php hyperf框架对接了 consul kong rabbitmq elascitsearch等等中间件。研究了这些中间件的基本使用。至于深入的原理还需要后续重新研究。 ### 第1章 1. 单体架构,查询变慢,服务器卡顿,cpu过高。 2. 服务器:增加数量。数据库:读写分离,主从复制,分库分表。 3. 数据库压力继续增加,引入redis。 4. 流量增加 业务逻辑复杂。异步解耦。消息队列 MQ 5. mysql适合海量数据的存储,不适合海量数据的查询。引入ES。千万级 ### 第2章 mysql 1. 数据库的读写分离 2. 分库分表。搭建数据库集群。使用中间件。 3. 索引。本质就是目录。mysql 数据是存储在硬盘中,以page的形式存储,page默认16k。mysql优化的本质是减少IO操作。 4. 二叉树。左子叶的值小于父节点,右子叶的值大于父节点。每个节点最多有两个子叶。存在极端情况,退化成链表。 5. 平衡二叉树(AVL树)。左右两个叉叶的高度差不超过1。左右两个叉叶必须是平衡二叉树。因为一个节点只能保存一条数据,当数据量很大时候层级会很深。 6. B-Tree。一个节点可以保存多个元素。对于m阶B-Tree,每个节点最多有m个子节点,每个节点最多可以保存m-1个元素。随机查找的时候效率比较高,但是当需要遍历所有元素的时候,中序遍历的方式,效率比较低。 7. B+Tree。m阶B+Tree,元素个数等于分支树。叶子节点包含所有元素,非叶子节点只包含索引。叶子节点之间通过指针连接。顺序查找,随机查找,范围查找。 8. 回表。多一步操作,所以尽量避免回表。 9. 最左匹配。索引查询,从左到右,直到遇到范围查询就停止。 10. mysql两种数据引擎。InnoDB,MyISAM。MyISAM三个文件。frm,myd,myi。 叶子节点保存的指针数据,指针指向数据。InnoDB 有两个文件。frm,ibd。叶子节点保存的是数据。主键索引数据直接在叶子节点。非主键索引数据保存的是主键值,主键值指向数据。没有主键索引会自动创建索引。 11.事务的实现原理。ACID 原子性(undolog) 一致性(mvcc) 隔离性(redolog) 持久性。当前读 快照读。undo log。redolog MVCC 多版本并发控制。db_trx_id 事务id。db_row_id唯一id。db_roll_ptr 回滚指针。 12.一致性的hash算法。 ### 第3章 redis 1.数据类型 ### 第4章 微服务 引入hyperf框架作为基本的服务框架。 docker exec app_php83 php /var/www/html/83_hyperf/bin/hyperf.php start //容器中的启动命令 composer create-project hyperf/hyperf-skeleton //创建hyperf项目 //将当前http服务注册到consul ``` # 登录到 MySQL 服务器并直接导入 SQL 文件 mysql -u root -p junziyun < junziyun.sql # 使用 mysqlimport 工具 mysqlimport -u your_username -p your_database_name your_sql_file.sql ``` //获取当前容器ip ``` $output = shell_exec('hostname -I'); $ips = explode(' ', trim($output)); $ip = $ips[0] ?? '127.0.0.1'; ``` php bin/hyperf.php gen:model table_name //生成模型 php bin/hyperf.php gen:amqp-producer DemoProducer //创建投递者 php bin/hyperf.php gen:amqp-consumer DemoConsumer //创建消费者 ### 第5章 服务注册中心和配置中心 1. consul的安装 `docker run -d -p 8500:8500 --name mbook_consul --net mbook_knet bitnami/consul` 2. php请求consul 3. raft 算法 待研究 4. 配置中心 ### 第6章 api网关 1. `docker-compose up -d` 2. `docker run --name mbook_hyperf --net mbook_knet -it --privileged -u root --entrypoint /bin/sh hyperf/hyperf:8.1-alpine-v3.18-swoole` 3. 配置kong 网关 4. 操作kong的api ``` 添加 upstream localhost:8001/upstreams POST name mjs-upstream //为upstream添加target localhost:8001/upstreams/mjs-upstream/targets POST target php83:9501 weight 100 //创建services localhost:8001/services POST name mjs-services host mjs-upstream //添加路由 localhost:8001/services/mjs-services/routes POST name mjs-service-routes paths[] /abc // http://localhost:8000/abc 此时访问能访问到服务代表配置成功 localhost:8001/routes/demo-service-route/plugins POST name basic-auth config.hide_credentials true localhost:8001/routes/demo-service-route/plugins POST name rate-limiting config.minute 5 config.limit_by ip localhost:8001/service/demo-service/plugins POST name jwt config.hide_credentials true localhost:8001/service/demo-service/plugins POST name ip-restriction config.deny 127.0.0.1 localhost:8001/consumers/test/jwt algorithm HS256 key test secret token ``` http://localhost:8001/upstreams name mbook-upstream //注册upstream http://localhost:8001/upstreams/mbook-upstream/targets target 172.19.0.4:8089 weight 100 //注册target http://localhost:8001/services name mbook-service host mbook-upstream //注册service http://localhost:8001/services/mbook-service/routes name mbook-service-route paths[] /abc //注册route http://localhost/abc/think访问路由就可以访问到。 http://localhost:8001/routes/mbook-service-route/plugins name basic-auth config.hide_credentials true //注册插件 http://localhost:8001/services/mbook-service/plugins name jwt ### 第7章 搜索引擎 ES 1.什么是lucene。 2.index索引 document文档(简单看成数据库表中的一条数据) Field域 segment里面有多个index 3.顺序扫描法 4.FST 算法 先放弃学习 5. 什么是倒排索引 6. ik分词器 `docker pull docker.elastic.co/elasticsearch/elasticsearch:8.14.2` `docker run --name mbook_es01 --net mbook_knet -p 9200:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.14.2` docker pull elasticsearch:7.17.1 7. 想要在elasticsearch-head中查看es的数据。需要配置es允许跨域访问。 elasticsearch.yml ``` cluster.name: "docker-cluster" network.host: 0.0.0.0 # 核心 CORS 配置 http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE http.cors.allow-headers: X-Requested-With, X-Auth-Token, Content-Type, Content-Length, Authorization, Access-Control-Allow-Headers, Accept http.cors.allow-credentials: true ``` ### 第8章 1. AMQP协议 生产者、消费者、交换机、队列、消息。 2. 工作模式 简单模式、工作模式(集群)、订阅模式(每个队列的消息都是一样的)、路由模式、主题模式。 3. composer require php-amqplib/php-amqplib ### 第9章