公司发展到一定阶段,前期快速迭代的老业务代码,已无法支撑扩展需求,线上宕机事故频发。
于是,把公司发展两年多的新业务线,跟老业务线合并,都是主营业务,只是之前争取转型,但是维护成本太大。又加上之前新业务一开始用php开发的,后来转java语言,再次拖慢了新业务发展。
融合为一个平台,自然想把人员和系统稳定性做一下权衡,最后因为一个老业务宕机事故,选定了使用微服务架构。
微服务:
根据 Robert C. Martin 的一个对 单一职责原则 (Single Responsibility Principle) 的论述:“把因为相同原因而变化的东西聚合到一起,把因为不同原因而变化的东西分离开来。” 该论述很好地强调了内聚性这一概念。没有银弹 No Silver Bullet
虽然 微服务架构(Microservice) 好处众多,但 微服务不是银弹 !!! ,您需要面对所有分布式系统都需要面对的复杂性,你可能需要在部署、测试和监控上做很多的工作,在服务间调用、服务的可靠性上做很多工作,甚至您还需要处理类似于 分布式事务 或者与 CAP 相关的问题。尽管 Hyperf 已经为您解决了许多的问题,但在实施 微服务架构(Microservice) 之前您的团队必须储备足够的分布式系统相关的知识体系,以面对很多您在 单体架构(Monolithic architecture) 下可能没有面临过甚至没有考虑过的问题。
微服务
我们的故事,就从这里开始了~
hyperf
一个高性能、高灵活性的渐进式 PHP 协程框架,内置协程服务器及大量常用的组件。。。
本地安装运行环境
windows7 专属下载地址 window10+ 都可以直接去官网下载 mac也可以根据版本去官网下载。
安装docker
- 下载docker:这里以win7为例,点击下载 DockerToolbox-18.03.0-ce.exe
- 启动:Docker Quickstart Terminal(相当于git bash,cmd.exe,powershell)
- 过程需要下载:boot2docker.iso,如果比较慢,你可以用github加速助力一把,放在本地窗口中提示的路径下,如我本地:C:\Users\Administrator.docker\machine\cache
- 启动成功
拉取镜像(非必须)
- 上一步启动成功,就可以开心的使用了。
docker pull hyperf/hyperf
- 下载完成后
- hyperf/hyperf-docker 项目内已经为您准备好了各种版本的 Dockerfile ,或直接基于已经构建好的 hyperf/hyperf 镜像来运行。
启动服务(本地开发)
- virtualBox跟本地d:\hypef共享目录绑定(建议不要是空目录,加一个空文件也行)
- 需要操作新增虚拟机共享目录hyperf
- 启动容器看到挂载地址:
拉取框架示例模板运行容器,复制下面内容到Docker Quickstart Terminal:
- win7不支持快捷键:
- -v 如果挂载失败,试试容器要挂载的宿主机地址前双斜杠:// 还不行,去virtualBox直接进虚拟机操作也行。
- win7不支持快捷键:
docker run --name hyperf \ --restart=always \ -v /hyperf:/data/project \ -p 9501:9501 -it \ --privileged -u root \ --entrypoint /bin/sh \ hyperf/hyperf:7.4-alpine-v3.11-swoole
- php8.0的版本:docker地址参考
docker run --name hyperf8 \ --restart=always \ -v /hyperf8:/data/project \ -p 9601:9501 -it \ --privileged -u root \ --entrypoint /bin/sh \ hyperf/hyperf:8.0-alpine-v3.14-swoole
按模板创建项目:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
cd /data/project
composer create-project hyperf/hyperf-skeleton
- 选择依赖可以都选n,这样防止一开始项目缺少启动不了。
启动项目:
cd hyperf-skeleton
php bin/hyperf.php start
- win7本机和虚拟机映射一下端口9501,容器和虚拟机创建的时候已经映射过了:
- 再访问一下本地浏览器:
上面设置的三个地址解释一下:
- d:\hypef win7 本地D盘目录
- /hyperf virtualBox虚拟机内部目录
- /data/project docker容器内部代码所在目录
- 我们要做的事情,docker容器绑定virtualBox,virtualBox再绑定本地共享目录,从而实现本地修改代码,容器自动更新,并使用热更新软件,实现自动重启,从而得到最新代码应用。
至此,本地开发环境安装结束
- 为了方便开发期间自动重启,因为常驻内存的进程,修改代码是无感知的,需要ctrl+c,再次启动。
- 那咱们这里选择一个容器化比较高的,而且也是时下比较热的go语言buexplain/go-watch ,其他都可以自行选择。
- 开始Go-watch
docker create -it -e GOPROXY=https://goproxy.io --name myGolang -v /hyperf/go-watch:/root/src -w /root/src golang bash
docker start myGolang
docker exec -it myGolang bash
git clone https://github.com/buexplain/go-watch.git
cd go-watch
CGO_ENABLED=0 go build -o gowatch main.go
- 报错是因为代码中没有go依赖,执行:
go mod tidy
,之后,再执行上一步 - 成功后,在执行目录下生成执行文件:gowatch 虚拟机挂载地址:/hyperf/go-watch/gp-watch也有一份。程序容器hyperf也有一份:/data/project/go-watch/gp-watch。
- 注意Docker Quickstart Terminal窗口下操作,会报错:New state of 'nil' is invalid. 建议使用virtualBox窗口连上,或者xshell远程登录,这里不再赘述(本地找到RSA密码:C:\Users\Administrator.docker\machine\machines\default\id_rsa,密码默认为空,直接回车连接,sudo -i 无密码切换root用户)。
- 编写shell脚本内容/etc/init.d/hyperf_go_watch.sh:
/data/project/go-watch/go-watch/gowatch run \ --preCmd "php /data/project/hyperf-skeleton/bin/hyperf.php start" \ --preCmdIgnoreError=true \ --cmd "php" \ --args "/data/project/hyperf-skeleton/bin/hyperf.php, start" \ --files "/data/project/hyperf-skeleton/test/.env" \ --folder "/data/project/hyperf-skeleton/app/, /data/project/hyperf-skeleton/config/" \ --autoRestart=true
虚拟机加入服务容器hyperf自启:【暂时不行,先保证本地不重启电脑吧】
docker update --restart=always hyperf
chmod +x /etc/init.d/hyperf_go_watch.sh
docker run 最后加脚本 /etc/init.d/hyperf_go_watch.sh
详见上面创建容器时的命令。
安装扩展
大多数时候,默认的docker容器只适合hello world
那我们想自己安装点扩展怎么办?
用容器编译自己的docker本地镜像,如果你们线上也是容器部署,这个就跟不陌生了。
本地创建DockerFile,可以参考官网:8.0-alpine-v3.14-swoole
- 但是要注意:SW_VERSION:-"v5.0.0",COMPOSER_VERSION:-"2.3.10"
- ALPINE_VERSION=3.14
- RUN && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
- 用到php扩展包地址:pecl-yaml包
# download2 && curl -SL "https://pecl.php.net/get/yaml-2.2.2.tgz" -o yaml.tgz \ # php extension:yaml && ln -s /usr/bin/phpize8 /usr/local/bin/phpize \ && ln -s /usr/bin/php-config8 /usr/local/bin/php-config \ && ( \ cd yaml \ && phpize \ && ./configure \ && make -s -j$(nproc) && make install \ ) \ && echo "extension=yaml.so" > /etc/php8/conf.d/55_yaml.ini \
- 修改一下必要的环境变量:
FROM hyperf/hyperf:8.0-alpine-v3.14-base
- 再加上自己想要的扩展安装步骤:
- 执行本地构建:
docker build -t hyperf8-yaml .
- 报错处理:
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/community: BAD signature
- 指定源下载(不要直接echo覆盖,导致报bash找不到等):
- RUN中加:
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
参考换源【无效】:linux-alpine
- 新建/etc/docker/daemon.json:
- 重启docker,docker info 查看:
- 新建/etc/docker/daemon.json:
{ "registry-mirrors":[ "http://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com", "http://registry.docker-cn.com" ] , "insecure-registries":[ "docker.mirrors.ustc.edu.cn", "registry.docker-cn.com" ] }
IDE编辑器
因为目前业界做的比较好的是PHPstorm,但是国内破解学习众多,不再赘述
老规矩:Hello World
操作参考
实现自启动(容器内容无法实现):
chmod +x /etc/init.d/hyperf_go_watch.sh
因为是最小化系统,无法自启动:
- 因为没有chkconfig,直接写/etc/rc.local文件:
echo "/etc/init.d/hyperf_go_watch.sh" >> /etc/rc.local
chmod +x /etc/rc.local
安装VirtualBox增强包(不幸我本地报内存不可写)
复制内容到虚拟机增强包支持(可参考):
- 老版本进去选择对应版本:
- 全局设定,选择扩展
- 加载下载到本地扩展包
- 选择虚拟机设置,常规-》高级,下拉选择开启双向
- 继续选择存储,控制器属性勾选使用主机输入输出缓存
- 老版本进去选择对应版本:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。