当前位置: 首页 > 后端技术 > PHP

hpyerf开始写bug了~

时间:2023-03-29 17:40:23 PHP

公司发展到一定阶段,前期快速迭代的旧业务代码已经无法支持扩展需求,上线宕机事故频发。因此,将公司发展了两年多的新业务线与老业务线合并。都是主营业务。只是之前他们也在尝试改造,但是维护成本太高了。另外,新业务一开始是用php开发的,后来改用java语言,又一次拖慢了新业务的开发。集成到一个平台,自然要在人员和系统稳定性上做一个权衡。最后因为一次老业务宕机事故,选择了使用微服务架构。微服务:根据RobertC.Martin对单一职责原则(SingleResponsibilityPrinciple)的一段讨论:“聚合因相同原因而变化的事物,分离因不同原因而变化的事物”。Nicely语句强调了凝聚力的概念。NoSilverBulletNoSilverBullet虽然微服务架构(Microservice)有很多好处,但是微服务并不是银弹!!!,你需要面对所有分布式系统都需要面对的复杂性。你可能需要在部署、测试和监控上做很多工作,在服务间调用和服务可靠性上做很多工作。您甚至可能需要处理分布式事务或与CAP相关的问题。虽然Hyperf已经为你解决了很多问题,但是在实现微服务架构(Microservice)之前,你的团队必须储备足够的分布式系统相关知识,以面对你在单体架构(Monolithicarchitecture)下遇到的很多问题。可能没有面对甚至没有考虑过的问题。我们的微服务故事从这里开始~hyperf是一个高性能、高灵活性的渐进式PHP协程框架,内置协程服务器和大量常用组件。..本地安装运行环境windows7专属下载地址window10+可以直接去官网下载,mac也可以根据版本去官网下载。安装docker下载docker:这里以win7为例,点击下载DockerToolbox-18.03.0-ce.exe启动:DockerQuickstartTerminal(相当于gitbash、cmd.exe、powershell)需要下载的过程:boot2docker.iso,如果慢的话,可以用github加速,放到本地窗口提示的路径下,比如我的本地:C:\Users\Administrator.docker\machine\cache启动成功,拉取镜像(非必须)上一步启动成功,可以愉快的使用了。dockerpullhyperf/hyperf下载完成后,hyperf/hyperf-docker项目中已经为你准备好了各种版本的Dockerfile,你也可以直接基于构建好的hyperf/hyperf镜像运行。启动服务(本地开发)virtualBox绑定到本地d:\hypef共享目录(不建议为空目录,添加空文件也行)需要操作添加虚拟机共享目录hyperfstart容器查看挂载地址:pullFrameworkexampletemplate运行容器,将以下内容复制到DockerQuickstartTerminal:Win7不支持快捷键:-v如果挂载失败,请在host地址前尝试双斜杠被容器挂载://如果不行,直接去virtualBox进入虚拟机操作也是可以的。dockerrun--namehyperf\--restart=always\-v/hyperf:/data/project\-p9501:9501-it\--privileged-uroot\--entrypoint/bin/sh\hyperf/hyperf:7.4-alpine-v3.11-swoolephp8.0版本:docker地址参考dockerrun--namehyperf8\--restart=always\-v/hyperf8:/data/project\-p9601:9501-it\--privileged-uroot\--entrypoint/bin/sh\hyperf/hyperf:8.0-alpine-v3.14-swoole通过模板创建项目:composerconfig-grepo.packagistcomposerhttps://mirrors.aliyun.com/composercd/data/projectcomposercreate-projecthyperf/hyperf-skeleton可以为所有的依赖选择n,防止一开始工程丢失无法启动。启动项目:cdhyperf-skeletonphpbin/hyperf.phpstartwin7本地机和虚拟机映射9501端口,创建容器和虚拟机的时候已经映射好了:再次访问本地浏览器:说明三个地址上面设置:d:\hypefwin7本地D盘目录/hyperfvirtualBox虚拟机内部目录/data/projectdocker容器内部代码目录我们要做的就是将docker容器绑定到virtualBox,然后将virtualBox绑定到本地共享目录实现本地修改代码,容器自动更新,使用热更新软件实现自动重启,从而获取最新的代码应用。至此本地开发环境安装完成,为了方便开发期间自动重启,因为进程常驻内存,修改代码是无意识的,需要ctrl+c重新启动。那我们这里选择一个容器化的流行的go语言buexplain/go-watch,其他的可以自己选择。启动Go-watchdockercreate-it-eGOPROXY=https://goproxy.io--namemyGolang-v/hyperf/go-watch:/root/src-w/root/srcgolangbashdockerstartmyGolangdockerexec-itmyGolangbashgitclonehttps://github.com/buexplain/go-watch.gitcdgo-watchCGO_ENABLED=0gobuild-ogowatchmain.go报错,因为代码中没有go依赖,执行:gomodtidy,然后然后执行上一步成功后在执行目录下生成一个执行文件:gowatch虚拟机挂载地址:/hyperf/go-watch/gp-watch也有一份。程序容器hyperf也有一个副本:/data/project/go-watch/gp-watch。注意,在DockerQuickstartTerminal窗口操作时,会报错:Newstateof'nil'isinvalid。推荐使用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/gowatchrun\--preCmd"php/data/project/hyperf-skeleton/bin/hyperf.php开始"\--preCmdIgnoreError=true\--cmd"php"\--args"/data/project/hyperf-skeleton/bin/hyperf.php,开始"\--files"/data/project/hyperf-skeleton/test/.env"\--folder"/data/project/hyperf-skeleton/app/,/data/project/hyperf-skeleton/config/"\--autoRestart=true虚拟机加入服务容器hyperf自动启动:【暂时不用,确保本地不要重启电脑】dockerupdate--restart=alwayshyperfchmod+x/etc/init.d/hyperf_go_watch.shdockerrun最后添加脚本/etc/init.d/hyperf_go_watch.sh有关容器中命令的详细信息,请参见上文。安装扩展大多数时候默认的docker容器只适用于helloworld,那如果我们想自己安装一些扩展怎么办呢?使用容器编译自己的docker本地镜像。如果你也在网上部署容器,这并不陌生。在本地创建DockerFile,可以参考官网:8.0-alpine-v3.14-swoole但注意:SW_VERSION:-"v5.0.0",COMPOSER_VERSION:-"2.3.10"ALPINE_VERSION=3.14RUN&&sed-i's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g'/etc/apk/repositories\使用的php扩展包地址:pecl-yamlpackage#download2&&curl-SL"https://pecl.php.net/get/yaml-2.2.2.tgz"-oyaml.tgz\#phpextension:yaml&&ln-s/usr/bin/phpize8/usr/local/bin/phpize\&&ln-s/usr/bin/php-config8/usr/local/bin/php-config\&&(\cdyaml\&&phpize\&&./configure\&&make-s-j$(nproc)&&makeinstall\)\&&echo"extension=yaml.so">/etc/php8/conf.d/55_yaml.ini\修改必要的环境变量:FROMhyperf/hyperf:8.0-alpine-v3.14-base加上你要的扩展安装步骤:执行本地构建:dockerbuild-thyperf8-yaml。错误处理:ERROR:https://dl-cdn.alpinelinux.org/alpine/v3.14/community:BADsignatureunderthespecifiedsource加载(不要直接echooverwrite,导致报找不到bash等):在RUN中加入:&&sed-i's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g'/etc/apk/repositories\referencesource[无效]:linux-alpinenew/etc/docker/daemon.json:重启docker,dockerinfoview:{"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目前是业界最好的,但是国内有很多破解,所以我就不老套了:你好世界运行参考实现自启动(容器内容无法实现):chmod+x/etc/init.d/hyperf_go_watch.sh因为是最小化系统,所以不能自己启动:因为没有chkconfig,直接写入/etc/rc.local文件:echo"/etc/init.d/hyperf_go_watch.sh">>/etc/rc.localchmod+x/etc/rc.local安装VirtualBox增强包(可惜我本地内存不可写)复制内容到虚拟机增强包支持(参考):老版本进去选择对应版本:全局设置,选择扩展加载下载到本地扩展包,选择虚拟机设置,General->Advanced,下拉启用双向继续选择storage,勾选controllerproperties使用主机输入输出缓存