windows下基于docker+hyperf构建微服务实战详细教程,亲测成功
首页->学习资料->编程语言->php教程->hyperf 关键词: 发布时间:2023-02-11 00:01:49 浏览次数:1039

相信很多人根据hyperf官网文档或网上的资料搭建微服务时都很难成功,大牛写的技术文档很多细节都省略了,而且不同的环境会有很多网络问题需要解决,导致很多人放弃了;

今天在windows上用Docker Desktop软件玩了一下,由于没有wifi,用的手机热点,网络特别不好,坑很多;

环境:

windows+docker descktop+consul+hyperf


相关文件的修改参考官方文档:

JSON RPC 服务 (hyperf.wiki)

服务提供者端口:80+9504

gitee仓库地址:hyperf_rpc_provider (gitee.com)

需要修改的文件

image.png

服务消费者商品:9501

gitee仓库地址:hyperf_rpc_consumer (gitee.com)

经测consumer中不需要consul.php配置,可删除

image.png

还有个.env文件,里面配置了一个,根据自己实例的情况修改

#consul
CONSUL_ADDRESS=http://192.168.43.128:8500


1、DockerDesktop-> 设置 -> Docker 引擎 ->“features”: { buildkit: true}将"features": { buildkit: false},不然docker pull 时可能拉不下来,报类似这样的错误:

failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://registry-1.docker.io/v2/hyperf/hyperf/manifests/8.0-alpine-v3.12-swoole": unable to connect to 34.194.164.123:443. Do you need an HTTP proxy?


2、制作docker image

由于hyperf的境像默认都是暴露的9501端口,在同一台电脑上启动时会有冲突,我们这里需要重新在pull下来的境像基础上重新构建用于服务者和消费者的境像,为了方便开发,我注消了文件的copy、自启动、端口(加粗部分),制作一个不复制文件到镜像,也不向外暴露端口的镜像,完全由自已启动容器时挂载、指定端口,手动启动

根据Dockerfile中的From拉取镜像:docker pull hyperf/hyperf:8.0-alpine-v3.12-swoole

将F:\windows_linux\hyperf_rpc_provider中的DockerFile文件修改如下,F:\windows_linux\hyperf_rpc_consumer中只需要将端口改为9504

-------------------------------------------------------------------------------------------------------------------------------------------------------

# Default Dockerfile

#

# @link     https://www.hyperf.io

# @document https://hyperf.wiki

# @contact  group@hyperf.io

# @license  https://github.com/hyperf/hyperf/blob/master/LICENSE


FROM hyperf/hyperf:8.0-alpine-v3.12-swoole

LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT" app.name="Hyperf"


##

# ---------- env settings ----------

##

# --build-arg timezone=Asia/Shanghai

ARG timezone


ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \

    APP_ENV=prod \

    SCAN_CACHEABLE=(true)


# update

RUN set -ex \

    # show php version and extensions

    && php -v \

    && php -m \

    && php --ri swoole \

    #  ---------- some config ----------

    && cd /etc/php8 \

    # - config PHP

    && { \

        echo "upload_max_filesize=128M"; \

        echo "post_max_size=128M"; \

        echo "memory_limit=1G"; \

        echo "date.timezone=${TIMEZONE}"; \

    } | tee conf.d/99_overrides.ini \

    # - config timezone

    && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \

    && echo "${TIMEZONE}" > /etc/timezone \

    # ---------- clear works ----------

    && rm -rf /var/cache/apk/* /tmp/* /usr/share/man \

    && echo -e "\033[42;37m Build Completed :).\033[0m\n"


#WORKDIR /opt/www


# Composer Cache

# COPY ./composer.* /opt/www/

# RUN composer install --no-dev --no-scripts


#COPY . /opt/www

#RUN composer install --no-dev -o && php bin/hyperf.php


#EXPOSE 9501


#ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"]

-------------------------------------------------------------------------------------------------------------------------------------------------------

原创不易,转型请保留此链接:http://www.hu-rong.com/article/582


3、构建新的docker境像,在provider项目根目录下执行以下命令,注意最后面有个点

docker build -t jsonrpc-http .

境像制作好了:

C:\Users\Administrator>docker images

REPOSITORY                                      TAG                               IMAGE ID       CREATED         SIZE

jsonrpc-http                                    latest                            4bb1445a70e8   41 hours ago    138MB

不熟docker build的也可以参考这篇文章:用dockerfile制作laravel项目镜像 (http://www.hu-rong.com/article/561)


4、启动容器

创建(临时--rm参数,加了的话退出容器就会自动删除)docker容器,检查依赖是否完整(红色部分改成自己项目的目录,这里有两个目录,一个是hyerf_rpc_provider一个是hyperf_rpc_consumer)

特别要注册,如果用docker启动consul\provider\consumer三者启动时,任一个指定了参数network,必须保持三个容器启动后在同一个网络,否则会报:

 Cannot select any node from load balancer.[24] in /www/vendor/hyperf/load-balancer/src/Random.php

这个我看框架代码也没有查出来是什么原因,后来怀疑是网络问题,排查启动后的容器发现consul指定了网络,而provider和consumer没有指定,导致provider注册到consul中的地址,在consumer拉取下来后无法访问,正常的情况应该是在provider和consumer中应互相ping通对方的ip

tip:不指定网络启动(用默认网络)

docker run -it  --rm  -v F:\windows_linux\hyperf_rpc_provider:/www--entrypoint bash registry.cn-shanghai.aliyuncs.com/hu-rong/com:hyperf-7.4-v1

tips:指定网络启动方式

docker run -it --rm --name provider -p 9504:9504 -p 80:80  --network hurong_www_gitee_127.0.0.1 -v F:\windows_linux\hyperf_rpc_provider:/www --entrypoint bash jsonrpc-http

docker run -it --rm --name consumer -p 9501:9501  --network hurong_www_gitee_127.0.0.1 -v F:\windows_linux\hyperf_rpc_consumer:/www --entrypoint bash jsonrpc-http


5、设置镜像加速

由于网络不好,登录到容器后,需设置境像加速,不然可能会报以下错误,解决方法:

curl error 28 while downloading https://repo.packagist.org/packages.json: SSL connection timeout

登录provider/consumer容器后设置镜像加速

tips:登录命令docker exec -it provider /bin/bash

设置阿里云镜像加速:

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/  


6、下载hyperf项目代码

hyperf-rpc全新安装:

登录容器后在provider和consumer中切换到/www目录下(启动时挂载的是什么就切换到什么)

composer create-project hyperf/hyperf-skeleton 

Whicp RPC protocol do you want to use?

选:JSON RPC with Service Governance,其它根据需要选择,这里不需要其它的全部回车

安装完成后,在provider及consumer中检查是否有以下依赖,没有的安装一下:

composer require hyperf/json-rpc

composer require hyperf/rpc-server

composer require hyperf/rpc-client

hyperf/service-governance

这里的用consul,还需要安装

composer require hyperf/service-governance-consul

服务提供者中需安装:

composer require hyperf/consul

provider中生成consul配置文件

php bin/hyperf.php vendor:publish hyperf/consul


6、修改consul配置

注意:如果是在windows下同一台机器上用docker测试,注意将consul注册中心的ip改成windows主机的ip(我这里的是http://192.168.43.128:8500),默认的http://127.0.0.1:8500是访问不到的,就一直无法注册成功;


7、启动provider和consumer

bash-5.0# cd /www/

bash-5.0# php bin/hyperf.php

provider启动成功后会看到服务注册成功的提示

[INFO] Service CalculatorService:CalculatorService-2 register to the consul successfully.

[DEBUG] Event Hyperf\Framework\Event\MainWorkerStart handled by Hyperf\ServiceGovernance\Listener\RegisterServiceListener listener.

[INFO] Worker#0 started.

[INFO] HTTP Server listening at 0.0.0.0:9504

[INFO] HTTP Server listening at 0.0.0.0:80

检查端口:

F:\windows_linux\hyperf_rpc_provider>docker ps

CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS          PORTS                                                                                                         NAMES

446cb78e8d49   rpc/provider            "bash"                   7 seconds ago   Up 6 seconds    0.0.0.0:80->80/tcp, 0.0.0.0:9504->9504/tcp                                               provider

c34c8e92379d   rpc/consumer            "bash"                   8 minutes ago   Up 8 minutes    0.0.0.0:9501->9501/tcp                                                                             consumer

访问测试:

访问Provider:

localhost:9504 看到如下信息表示正常

{

"jsonrpc": "2.0",

"id": null,

"error": {

"code": -32601,

"message": "Method not found.",

"data": null

},

"context": []

}

访问Consumer:

localhost:9501

此时还不能访问,因为provider注册到consul中的ip为容器内的ip,consumer无法访问到,这个问题后面再解决,这也是下面的consul界面中注册的服务前为什么有个X的原因

tips:这个问题已解决,就是前面讲的启动consul/provider/consumer时需要在同一个网络

image.png

8、登录consul检查服务,能看到CalculatorService且没有红叉,表示注册成功

image.png

访问localhost:9501能看到正常返回结果表示成功

image.png



赞:(0)
踩:(0)
相关文章
hyperf定时任务被跳过执行
hyperf中用guzzle发post raw请求
hyperf协程应用实例及协程执行流程
热门文章
win7中将文件拷贝到虚拟机linux下
phpexcel设置行高及列宽,背景颜色,
rabbitmq无法启动
intellij idea不显示git push按钮
php7中使用mongodb的aggregate进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
devops-jenkins容器为pending状态
好评文章
phpexcel设置行高及列宽,背景颜色,
php7中使用mongodb的aggregate进行
intellij idea打开文件所在文件夹
windows下使用MongoDB Compass Com
win7中将文件拷贝到虚拟机linux下
laravel 中悲观锁 & 乐观锁的使用
单点登录sso原理及php实现方式及de
navicate连接mycat报1184错误
rabbitmq无法启动
laravel整合dingo/api方法步骤:jwt
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:607篇
浏览数:942448
粤ICP备18028092号-1  微信:hurong241