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

Windows上docker环境搭建hyperf微服务

时间:2023-03-29 14:02:23 PHP

Windowsdocker环境搭建hyperf微服务创建hyperf项目环境dockerrun-d--namehyperfrpc-vd/dataproject/hyperfrpc:/hyperf-skeleton-p9501:9501-it--entrypoint/bin/shhyperf/hyperf:7.4-alpine-v3.11-swoole参数说明:-d表示后台运行--name表示给容器起个名字-v表示挂载机器上的目录-p表示映射到主机的端口,冒号前是本机,后面是docker容器端口-itterminal--entrypoint用这个覆盖dockerfile中定义的entrypoint镜像容器运行后,进入容器,在容器中安装Composer#下载composer.phar文件wgethttps://github.com/composer/composer/releases/download/1.8.6/composer.phar#给composer.phar文件添加可执行权限chmodu+xcomposer.phar#将文件移动到/usr/local/bin/composerrmvcomposer.phar/usr/local/bin/composer将Composer镜像设置为阿里云镜像,加快国内下载速度composerconfig-grepo.packagistcomposerhttps://mirrors.aliyun。com/composerinstallhyperf/hyperf-skeletonproject通过Composercomposercreate-projecthyperf/hyperf-skeleton进入安装好的Hyperf项目目录,linux目录cdhyperf-skeleton测试Hyperf环境是否成功phpbin/hyperf.phpstartopen在powshellAclidockerexec-ithyperfrpc/bin/bash中测试curl127.0.0.1:9501查看输出{"method":"GET","message":"HelloHyperf."}环境成功在hyperf-skeleton目录下创建消费者和提供者删除刚刚创建的hyperf项目rm-rfhyperf-skeletoncreateprovidercomposercreate-projecthyperf/hyperf-创建时skeletonhyperf-skeleton/provider,只选择一个JSON-PRCwithServiceGovernance作为选项,并为所有其他选择n。创建consumercdhyperf-skeletoncopyprovider作为consumercp-rproviderconsumer。在windows上用编辑器编辑provider,随意用编辑器打开项目,目录就是你创建docker容器时挂载的目录。我们在上面挂载了d/dataproject/hyperfrpc。我们可以看到目录中有provider,consumer写provider。我们在app目录下创建一个文件夹,叫做Rpc,在Rpc下创建CalculatorService和CalculatorServiceInterface服务端口CalculatorServiceInterface是一个服务接口[['name'=>'http','type'=>Server::SERVER_HTTP,'host'=>'0.0.0.0','port'=>9501,'sock_type'=>SWOOLE_SOCK_TCP,'callbacks'=>[Event::ON_REQUEST=>[HyperfHttpServerServer::class,'onRequest'],],],['name'=>'jsonrpc-http','type'=>Server::SERVER_HTTP,'host'=>'0.0.0.0','port'=>9502,'sock_type'=>SWOOLE_SOCK_TCP,'callbacks'=>[Event::ON_REQUEST=>[HyperfJsonRpcHttpServer::class,'onRequest'],],],写consumer,我们调用刚刚写在consumer项目controller中的CalculatorService,调用前需要从provider复制服务接口对应的接口我们在消费者的app目录下创建Rpc目录,并创建新复制的CalculatorServiceInterfacecalculatorService->add(1,2);}}创建服务的配置文件我们需要到/config/autoload目录下创建services.php文件配置如下[['name'=>'CalculatorService','service'=>CalculatorServiceInterface::class,'nodes'=>[['host'=>'127.0.0.1','port'=>9502],],],],];这个服务的名字和我们写注解的名字是一致的。service的service对应consumer的CalculatorServiceInterface,因为我们没有使用注册中心,所以直接使用node地址,对应上面代码中的node修改consumer的启用端口,因为consumer复制过来,所以我们需要修改/config/autoloa中的端口在d下的server.php文件中,我们找到服务器,找到名字为http的服务器,把端口改成9503'servers'=>[['name'=>'http','type'=>Server::SERVER_HTTP,'host'=>'0.0.0.0','port'=>9503,'sock_type'=>SWOOLE_SOCK_TCP,'callbacks'=>[Event::ON_REQUEST=>[HyperfHttpServerServer::class,'onRequest'],],],],consumer写好,启动provider,进入终端cdhyperf-skeleton/cdprovider/phpbin/hyperf.phpstart启动consumercdhyperf-skeleton/cdconsumer/phpbin/hyperf.phpstart发起一个请求,打开一个终端curl127.0.0.1:9503我们应该可以看到输出3使用consul我们这里使用consul我们尝试在terminalprovider目录下安装hyperf的服务治理composerhyperf/service-governanceInstallconsul组件composerrequirehyperf/consul发布对应的配置文件phpbin/hyperf.phpvendor:publishhyperf/consul可以看到consul的配置文件已经生成刷机成功。可以查看cogfig/autoload目录下的consul.php文件return['uri'=>'http://127.0.0.1:8500','token'=>'',];默认是下载到本地8500端口,启动consul服务#下载并解压consulcd/opt/mkdirconsulchmod777consulcdconsulwgethttps://releases.hashicorp.com/consul/1.3.0/consul_1.3.0_linux_amd64.zipunzipconsul_1.3.0_linux_amd64.zipcpconsul/usr/local/bin/#查看是否安装成功consulconsulversion#启动consul服务consulagent-dev-ui-node=consul-dev-client=127.0.0.1#3.另开一个终端,输入查看8500端口curl127.0.0.1:8500#SeeMovedPermanently。提供者成功实现将类注册到consul中并添加publishTo="consul"[['name'=>'CalculatorService','service'=>CalculatorServiceInterface::class,'registry'=>['协议'=>'领事','广告dress'=>'http://127.0.0.1:8500',],//'nodes'=>[//['host'=>'127.0.0.1','port'=>9502],//],],],];registry会去consul取服务,我们需要注释节点重启providerCTRL+Cphpbin/hyperf.phpstartrestartconsumerCTRL+Cphpbin/hyperf.phpstartterminaltestcurl127.0.0.1:9503#可以看出仍然是输出,我们已经注释节点3为什么要熔断服务?在分布式系统中,经常会因为某个基础服务不可用而导致整个系统不可用。这种现象称为服务雪崩效应应对服务雪崩,通常的做法是降级服务。比如我们需要查询另一个服务中的用户列表。用户列表需要关联很多表。查询效率低,但在并发量不高的情况下,响应速度尚可。一旦并发量急剧增加,就会导致响应速度变慢,进而导致对对方服务的检查变慢。比如我们在进行一些Db查询的时候,需要查询多个表。这样的话,在平时并发不高的情况下,对应的速度就可以说得过去了。一旦并发量激增,可能导致服务不可用,最终导致整个系统不可用。这种现象称为服务雪崩效应。为了应对服务雪崩,一种常见的做法是降级服务。降级就是自己的待遇下降了。从RPC调用环节来看,是访问一个本地伪装者,而不是真正的服务。使用熔断器熔断器的使用非常简单,只需要添加HyperfCircuitBreakerAnnotationCircuitBreaker注解,然后就可以按照指定的策略进行熔断。这个时候我们只需要配置fusetimeout超时时间为0.05秒即可。失败计数failCounter超过1次后,熔丝就会熔断。对应的回退是AppServiceUserService类的searchFallback方法。这样当响应超时触发熔断时,将不再请求对端服务,而是直接降级服务,从当前项目返回数据,即按照fallback指定的方式返回。创建一个使用熔断器的服务,我们在服务提供者中的appService下创建一个UserService以供使用。首先,我们先在APP目录下创建目录Service,然后在Service目录下创建UserService,如下:"Normal",];}publicstaticfunctionsearchFallback(){return['message'=>"流量太大,炸了",];}}在服务中添加@CircuitBreaker注解我们需要断掉服务,然后接下来说明几个参数timeout="0.05"fusetimeoutfailCounter=1failurecount,断断续续的次数后successCounter=1successcountfallback="AppSerViceUserService::searchFallback"发送fuse后调用的方法在controller里面我们写一个controller吧,我们就叫它UserController吧。我们把刚刚写好的UserService注入到UserController中。为了方便我没有抽象成一个接口,然后在UserController中写一个方法调用UserService。方法代码如下:UserService->search();}}测试因为我们在创建docker之前已经绑定了9501,所以我们可以在windows上使用浏览器访问9501端口。我们打开浏览器访问,刷新几次就可以看到服务熔断了这个返回,或者你打开两个访问窗口`127.0.0.1:9501/user/search`或者我们在终端访问也可以,但是我们需要访问curlcurl127.0.0.1:9501/user/searchcurlcurl127.0.0.1:9501/user/searchcurlcurl127.0.0.1:9501/user/search服务限速限流的目的是通过限速来保护系统并发访问/请求或时间窗口内的请求。一旦达到限制速率,可以拒绝服务(直接跳到错误页面或提示资源没了)、排队等候(秒杀、评论、下单等)、降级(退回口袋数据和默认数据,如商品详情页默认有货)。下面我们将使用令牌桶限流器。要安装,我们首先进入provider目录`composerrequirehyperf/rate-limit`publishconfigurationphpbin/hyperf.phpvendor:publishhyperf/rate-limituseprocess()`或自己处理echo“限流”;返回$proceedingJoinPoint->process();}}create1每秒产生tokensconsume1每次请求消耗tokenscapacity2令牌桶最大容量limitCallback[]回调方法waitTimeout1触发限流时排队超时时间参考文档:https://hyperf.wiki/2.1/#/zh-cn/microservicehttps://blog.csdn.net/weixin_40670060/article/details/109582821