相信很多人根据hyperf官网文档或网上的资料搭建微服务时都很难成功,大牛写的技术文档很多细节都省略了,而且不同的环境会有很多网络问题需要解决,导致很多人放弃了;
今天在windows上用Docker Desktop软件玩了一下,由于没有wifi,用的手机热点,网络特别不好,坑很多;
环境:
windows+docker descktop+consul+hyperf
相关文件的修改参考官方文档:
服务提供者端口:80+9504
gitee仓库地址:hyperf_rpc_provider (gitee.com)
需要修改的文件
服务消费者商品:9501
gitee仓库地址:hyperf_rpc_consumer (gitee.com)
经测consumer中不需要consul.php配置,可删除
还有个.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:
此时还不能访问,因为provider注册到consul中的ip为容器内的ip,consumer无法访问到,这个问题后面再解决,这也是下面的consul界面中注册的服务前为什么有个X的原因
tips:这个问题已解决,就是前面讲的启动consul/provider/consumer时需要在同一个网络
8、登录consul检查服务,能看到CalculatorService且没有红叉,表示注册成功
访问localhost:9501能看到正常返回结果表示成功
- 热门文章
- 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
- 我的项目
- 【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