当前位置: 首页 > 工具软件 > OMS-PHP > 使用案例 >

PHP服务注册到Nacos(Laravel框架)

单嘉泽
2023-12-01

背景

现在的ERP系统由很多的模块组成,有PHP的、有JAVA的,为了实现统一访问,增加了统一的网关,PHP本身在服务注册这块开源的东西不多,同时为了兼容多语言问题,这里选用了Nacos来做注册中心和服务中心,需要把PHP的服务也注册到Nacos。

一、前置依赖安装

1、配置要求:grpc扩展、php7+
2、安装

Pecl安装

pecl install protobuf
pecl install grpc

把安装好的扩展加入PHP配置文件

echo "extension=protobuf.so" >> php.ini
echo "extension=grpc.so" >> php.ini

3、可能的问题

gcc 版本太低,升级 gcc

yum install centos-release-scl   //安装centos-release-scl
yum install devtoolset-7-gcc*    //安装devtoolset,注意,如果想安装8.版本的,就改成devtoolset-8-gcc,以此类推
scl enable devtoolset-7 bash     //激活对应的devtoolset
gcc -v                           //查看版本

zlib 不存在,需要安装zlib

yum install -y zlib.x86_64 zlib-devel.x86_64

二、Composer安装

composer require alibaba/nacos

三、PHP服务注册到Nacos

<?php
namespace App\Console\Commands\Nacos;

use alibaba\nacos\NacosConfig;
use alibaba\nacos\Naming;
use App\Traits\LoggerSendMsgTrait;
use Illuminate\Console\Command;

/**
 * @CLassname ServiceRegister
 * @Description TODO
 * @Author blueo
 * @Date 2022/1/28 12:27
 */
class ServiceRegister extends Command
{

    use LoggerSendMsgTrait;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'ServiceRegister {--action=}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '服务注册到Nacos';
    
    private $naming;
    
    public function __construct()
    {
        parent::__construct();
        NacosConfig::setHost("http://172.16.104.170:8848/"); //上面如果启用的了域名就用域名,如果用了VIP就用VIP,这里为了测试简单用了简单模式
        $this->naming = Naming::init(
            "erp-oms",          //服务的名称,随便取,在Nacos里不重复就可以了,如果重复就代表同一个服务的不同节点,用于高可用
            "172.16.104.170",   //服务的地址
            "8000",             //服务的端口号
            "",
            "",
            false               //设置后nacos服务器会自动检测ip和端口匹配的实例是否存活 设置后就无需客户端发送实例心跳了,
                                //但是测试结果是,PHPFPM停掉后,服务一直显示健康,只有对应的Nginx挂了,才会变成实体不健康
        );
    }
    
    public function handle(){
        $action = $this->option('action') ?? 'register';
        switch ($action) {
            case 'register':
                $this->naming->register();
                break;
            case 'delete':
                $this->naming->delete();    //测试实例删除返回成功,实际删除不成功,后台一直显示存在
                break;
        }
    }
}

四、测试总结

经过测试,PHP服务注册到Nacos是没有问题,也可以正常访问成功,可以正常使用
问题点:
1、服务实例删除报成功,但是实际是失败的
2、PHP-FPM挂了,实例并不会显示不健康,只要Nginx还是正常的,那么这个服务实例就不会显示不健康,只有Nginx挂掉了,才会显示实例不健康。

后记:

经测试,上面那个问题已解决

<?php

namespace alibaba\nacos\request\naming;

use alibaba\nacos\NacosConfig;
use alibaba\nacos\NamingConfig;
use alibaba\nacos\util\LogUtil;
use alibaba\nacos\request\Request;
use alibaba\nacos\util\ReflectionUtil;

class NamingRequest extends Request
{
    protected function getParameterAndHeader()
    {
        $headers = [];
        $parameterList = [];

        $properties = ReflectionUtil::getProperties($this);
        foreach ($properties as $propertyName => $propertyValue) {
            if (in_array($propertyName, $this->standaloneParameterList)) {
                // 忽略这些参数
            } else {
                $parameterList[$propertyName] = $propertyValue;
            }
        }

        //修改为所有接口都传这个参数,不传这个参数,删除不会成功的
        $parameterList["ephemeral"] = NamingConfig::getEphemeral();

        if (NacosConfig::getIsDebug()) {
            LogUtil::info(strtr("parameterList: {parameterList}, headers: {headers}", [
                "parameterList" => json_encode($parameterList),
                "headers" => json_encode($headers)
            ]));
        }
        return [$parameterList, $headers];
    }
}
 类似资料: