乐趣区

php与微服务

公司的系统根本就没有容错机制。所以想到了 java 微服务。

首先是需要一个注册中心 getService.php

<?php

    $array = ["produce" => [["url" => "http://127.0.0.1/testSwitch/producer1.php","status" => "1"],
                ["url" => "http://127.0.0.1/testSwitch/producer2.php","status" => "-1"],
                ["url" => "http://127.0.0.1/testSwitch/producer3.php","status" => "-1"],
        ]
    ];
    echo json_encode($array);
?>

三个服务提供者,用 status 表示状态。

<?php
// 用来测试超时机制
//sleep(120);
echo "producer1";

?>

服务的消费方,调用者。
主要是三步。第一步,获取可以调用的服务。第二步,选择一个服务。第三步,调用服务。
如果服务中出现问题,可以通知注册中心去修改当前服务的状态,并且同时短信通知到运维人员。这样可以保证下一次调用是正常。

<?php

function chooseUrl($urls){
    // 或者进行异常捕获
    $url = null;
    foreach($urls as $u){if($u['status'] == -1){continue;}else{$url = $u['url'];
        }
    }

    return $url;
}


function getContent($url){
    // 或者进行异常捕获
    // 超时机制
    $ctx = stream_context_create(array('http'=>
    array('timeout' => 10,)
    ));
    $content = file_get_contents($url,false,$ctx);    
    return empty($content) ? false : $content;
}



function getServices($serviceName){
    // 或者进行异常捕获
    $services = file_get_contents('http://127.0.0.1/testSwitch/getService.php');
    if(empty($services)){return false;}

    $services = json_decode($services,true);
    

    $urls = $services[$serviceName];
    return empty($urls) ? false : $urls;
}

function run($serviceName){$urls = getServices($serviceName);
    if(!$urls){
        // 注册中心错误,maybe 异常
        return false;
    }

    $url = chooseUrl($urls);
    if(empty($url)){
        // 无可用服务,maybe 异常
        return false;
    }


    $content = getContent($url);

    if(empty($content)){
        // 服务错误,更新服务信息。echo $url."服务错误";
        return false;
    }

    return $content;

}


$result = run("produce");
if(!$result){echo "默认的熔断机制";}else{echo $result;}


?>

测试 1

结果

这里就是手动修改注册中心状态

结果

在将 producer 的注释取消,进行超时测试

服务器上其他的因素导致服务超时。这样也可以进行状态变更。

退出移动版