本文demo已经上传到Github:链接:hyperf-rpc-demoWhyisRPC?而不是HTTP1,简单来说,RPC没有那么多的HTTPRequest和ResponseBody字段,比如:content-type,user-agent,accept-language,content-encoding,expires等字段。通常这些字段占消息内容的70%。如果请求次数过于频繁,性能和网络开销可想而知。2、对于内部服务器通信,我们完全可以减少握手次数,使用HTTP2.0。HTTP2.0可以在一个连接上多次发送数据。与目前的http1.1模式相比,仍然是基于TCP的RPC协议的非阻塞,长连接传输数据基于以上,微服务之间使用HTTPv1.1服务器到服务器通信并不是最好的方案,这也是为什么很多基于PHP-FPM的PHP框架不适合微服务的原因,因为PHP-FPM会为每个请求生成一个新的Woker进程。如果每个Worker都跑去和微服务建立HTTP1.1的连接,其实是没有意义的。为什么需要领事?什么是领事?为什么需要服务发现?从图中可以看出,我在Server1上部署了一套HTTP服务(服务消费者)对外提供接口,但是它也依赖于Server2(服务提供者)的服务。Server1不需要知道Server2的地址,只需要知道Consul即可。服务器中心没问题,会帮我注册所有的服务。现实中,比如大公司的A组在做HTTP业务的核心功能,B组在做很多服务轮,那么A组总不能每次开发都去B组,问:“你的地址是什么?端口是什么?服务的名称是什么?告诉我如何调用它。”那如果要调用100个服务,A组的人岂不是每次都要忙着配置IP和端口?1.在Server1上搭建Consul1,下载consulforlinux,解压后是一个可执行文件,直接mv到/usr/bin/consul2,新建consul文件夹,新建data文件夹和etc文件夹里面,data的文件夹用于存放consul数据文件,etc用于存放配置文件3.切换到etc文件夹,新建web.json文件,内容如下:{"service":{//服务的ID这里写的必须是唯一的"id":"CalculatorService",//这里写服务名,一般是ID名,不是唯一的"name":"CalculatorService",//注册服务,服务在哪个服务器上,填写服务器IP,这里我填写的是server2的ip,因为server2给server1提供服务,调用"address":"server2.ip.server2.ip",//"tags"随便写:["webapi"],//同上,服务也有端口,填写那个服务器提供的端口即可,这里填写server2的端口“端口”:9502}}4.回到consuldirectory并启动consul,其中-config-dir指定刚才的配置目录,-data-dir指定存储数据目录consulagent-dev-ui-config-dir=./etc-data-dir=./data-client=0.0.0.0client=0.0.0.0这里需要注意,网上一般都是127.0.0.1,如果写成127.0.0.1也可以运行,但是外部访问consul的UI界面是没办法的网络,所以这里改成0.0.0.05,在浏览器输入IP:8500,可以看到consul安装成功。二、在Server2上安装并设置hyperfServiceprovider1、在app目录下新建RPC文件夹,首先创建一个CalculatorServiceInterface接口文件,文件名为CalculatorServiceInterface.php'jsonrpc-http','type'=>Server::SERVER_HTTP,'host'=>'0.0.0.0','port'=>9502,'sock_type'=>SWOOLE_SOCK_TCP,'callbacks'=>[SwooleEvent::ON_REQUEST=>[\Hyperf\JsonRpc\HttpServer::class,'onRequest'],],],这样hyperf就会在9502端口上发布并运行代码中的服务。这里的端口其实就是对应上面的consul配置文件web.json文件,这样consul就可以发现服务95023.在服务器1上安装并设置hyperf服务消费者。我将在这里创建一个新项目来表示消费者服务模型。同样在app目录下新建一个RPC文件夹,首先新建一个CalculatorServiceInterface接口文件,文件名CalculatorServiceInterface.phpcalculatorService-&g吨;加(1,2);}}2。在config/autoload下新建services.php[[//name必须和服务提供者的name属性一致'name'=>'CalculatorService',//服务接口名称,可选,默认值等于name配置的值,如果name直接定义为接口类,这行配置可以忽略,如果name是字符串,需要配置service对应接口类'service'=>\App\Rpc\CalculatorServiceInterface::class,//这个消费者想从哪个服务中心获取节点信息?如果不配置,则不会从服务中心获取节点信息'registry'=>['protocol'=>'consul',//这里的地址表示consul是建立在服务器上的,填写的IP服务器'地址'=>'http://127.0.0.1:8500',],]],];这样,当有请求进来时,IndexController会注入Service,hyperf会告诉service,应该去services.php中寻找service(也就是consul)3.在config/autoload/中更改端口server.php改为9503,后面我们会通过9503访问indexcontroller,这里只是演示,实际可以随意改成你想访问的端口'servers'=>[['name'=>'http','type'=>Server::SERVER_HTTP,'host'=>'0.0.0.0','port'=>;9503,'sock_type'=>SWOOLE_SOCK_TCP,'callbacks'=>[SwooleEvent::ON_REQUEST=>[Hyperf\HttpServer\Server::class,'onRequest'],],],],4.运行它1.重启开始consul,如果之前启动过,先kill-9consul的PIDconsulagent-dev-ui-config-dir=./etc-data-dir=./data-client=0.0.0.02,切换到Server2的hyperf-provider,启动phpbin/hyperf.phpstart3,切换到Server1的hyperf-consumer,启动phpbin/hyperf.phpstart4,在浏览器中打开Server1的HTTP8500端口,查看consul界面,可以看到可以找到Server2Provider5下的hyperf,浏览访问Servier1的服务,可以看到Server1下的9503服务正常,会访问Server1下的consul-8500中心,然后consul-8500中心访问下的9502服务Server2,再返回给Server1的9503到这里就完成了整个简单的微服务系统,写的不好请见谅~
