现在的ERP系统由很多的模块组成,有PHP的、有JAVA的,为了实现统一访问,增加了统一的网关,PHP本身在服务注册这块开源的东西不多,同时为了兼容多语言问题,这里选用了Nacos来做注册中心和服务中心,需要把PHP的服务也注册到Nacos。
一、前置依赖安装1、配置要求:grpc扩展、php7+
2、安装
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
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挂掉了,才会显示实例不健康。
经测试,上面那个问题已解决
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];
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)