公司发展到一定阶段,前期快速迭代的老业务代码,已无法支撑扩展需求,线上宕机事故频发。

于是,把公司发展两年多的新业务线,跟老业务线合并,都是主营业务,只是之前争取转型,但是维护成本太大。又加上之前新业务一开始用php开发的,后来转java语言,再次拖慢了新业务发展。

融合为一个平台,自然想把人员和系统稳定性做一下权衡,最后因为一个老业务宕机事故,选定了使用微服务架构。

微服务:
根据 Robert C. Martin 的一个对 单一职责原则 (Single Responsibility Principle) 的论述:“把因为相同原因而变化的东西聚合到一起,把因为不同原因而变化的东西分离开来。” 该论述很好地强调了内聚性这一概念。

没有银弹 No Silver Bullet
虽然 微服务架构(Microservice) 好处众多,但 微服务不是银弹 !!! ,您需要面对所有分布式系统都需要面对的复杂性,你可能需要在部署、测试和监控上做很多的工作,在服务间调用、服务的可靠性上做很多工作,甚至您还需要处理类似于 分布式事务 或者与 CAP 相关的问题。尽管 Hyperf 已经为您解决了许多的问题,但在实施 微服务架构(Microservice) 之前您的团队必须储备足够的分布式系统相关的知识体系,以面对很多您在 单体架构(Monolithic architecture) 下可能没有面临过甚至没有考虑过的问题。

微服务

我们的故事,就从这里开始了~

hyperf

一个高性能、高灵活性的渐进式 PHP 协程框架,内置协程服务器及大量常用的组件。。。

本地安装运行环境

windows7 专属下载地址 window10+ 都可以直接去官网下载 mac也可以根据版本去官网下载。
  • 安装docker

  • 拉取镜像(非必须)

    • 上一步启动成功,就可以开心的使用了。
    • docker pull hyperf/hyperf
    • 下载完成后image.png
    • hyperf/hyperf-docker 项目内已经为您准备好了各种版本的 Dockerfile ,或直接基于已经构建好的 hyperf/hyperf 镜像来运行。
  • 启动服务(本地开发)

    • virtualBox跟本地d:\hypef共享目录绑定(建议不要是空目录,加一个空文件也行)
    • 需要操作新增虚拟机共享目录hyperfimage.png
    • 启动容器看到挂载地址:image.png
    • 拉取框架示例模板运行容器,复制下面内容到Docker Quickstart Terminal:

      • win7不支持快捷键:image.png
      • -v 如果挂载失败,试试容器要挂载的宿主机地址前双斜杠:// 还不行,去virtualBox直接进虚拟机操作也行。
    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 
    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
    
    • 按模板创建项目:image.png

      • composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
      • cd /data/project
      • composer create-project hyperf/hyperf-skeleton
      • 选择依赖可以都选n,这样防止一开始项目缺少启动不了。
    • 启动项目:image.png

      • cd hyperf-skeleton
      • php bin/hyperf.php start
      • win7本机和虚拟机映射一下端口9501,容器和虚拟机创建的时候已经映射过了:image.png
      • 再访问一下本地浏览器:
      • image.png
    • 上面设置的三个地址解释一下:

      • 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,之后,再执行上一步image.png image.png
    • 成功后,在执行目录下生成执行文件: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用户)。image.png
    • 编写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
    • 再加上自己想要的扩展安装步骤:
    • image.png
    • 执行本地构建:docker build -t hyperf8-yaml .
    • image.png
    • 报错处理:ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/community: BAD signature
    • image.png
    • 指定源下载(不要直接echo覆盖,导致报bash找不到等):
    • RUN中加:&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
    • image.png
    • 参考换源【无效】:linux-alpine

      • 新建/etc/docker/daemon.json:image.png
      • 重启docker,docker info 查看:image.png
    {
      "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增强包(不幸我本地报内存不可写)
  • 复制内容到虚拟机增强包支持(可参考):image.png

    • 老版本进去选择对应版本:image.png
    • 全局设定,选择扩展image.png
    • 加载下载到本地扩展包image.png
    • 选择虚拟机设置,常规-》高级,下拉选择开启双向image.png
    • 继续选择存储,控制器属性勾选使用主机输入输出缓存image.png

jiaoshengkang
9 声望1 粉丝

厨房诗人,编码爱好者,吉他粉丝。