公司的系統根本就沒有容錯機制。所以想到了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的註釋取消,進行超時測試
服務器上其他的因素導致服務超時。這樣也可以進行狀態變更。