15、Hyperf 3 微服务系列 - Hyperf 3 服务熔断实操

作者: 温新

分类: 【Hyperf 3 微服务系列】

阅读: 1578

时间: 2023-05-29 15:52:41

hi,我是温新,一名 PHPer

Hyperf 3 微服务代码已上传至 Github:https://github.com/ziruchu/hyperf3-microservice-code

本篇文章是行服务熔断实操,在实操之前还请先了解其概念,因为操作起来太简单了,若不去了解其概念,可能会似懂非懂。、

实操服务器

服务器 项目 说明
192.168.31.92 note_provider_user_9606 服务提供者
192.168.31.90 note_consumer_user_9502 服务消费者

项目说明:

1、note_provider_user_9606 增加模拟业务超时的方法 timeout,当 id > 0 时睡眠 1秒;

2、note_consumer_user_9502 使用熔断进行业务处理

Hyperf 熔断的使用

服务提供者

所在位置:92.168.31.92 note_provider_user_9606

第一步:添加接口方法
<?
// app/JsonRpc/Interface/UserServiceInterface.php
public function timeout($id);
第二步:实现接口方法
<?php
// app/JsonRpc/Service/UserService.php
public function timeout($id)
{
    try {
        // 暂停1秒模拟业务耗时
        if ($id > 0) {
            sleep(1);
        }
    } catch (\Exception $e) {
        throw new \RuntimeException($e->getMessage());
    }
    echo '测试熔断' . PHP_EOL;
    return ResponseTool::success([]);
}

服务消费者

所在位置:192.168.31.90 note_consumer_user_9502

第一步:安装熔断器组件
composer require hyperf/circuit-breaker
第二步:添加接口方法
<?php
// app/JsonRpc/Interface/UserServiceInterface.php  
 public function timeout($id);
第三步:实现接口方法
<?php
// app/JsonRpc/Service/UserService.php
public function timeout($id)
{
    return $this->__request(__FUNCTION__, compact('id'));
}
第四步:控制器实现熔断设置
<?php
// app/Controller/UserController.php
use Hyperf\CircuitBreaker\Annotation\CircuitBreaker;

#[GetMapping('/users/testCircuitBreaker')]
#[CircuitBreaker(options: ['timeout' => 0.05], failCounter: 1, successCounter: 3, fallback: "app\Controller\UserController::testCircuitBreakerFallback")]
public function testCircuitBreaker()
{
    $id     = (int)$this->request->input('id');
    $result = $this->userService->timeout($id);
    if ($result['code'] != ResponseCode::SUCCESS) {
        throw new RuntimeException($result['message']);
    }

    return ResponseTool::success($result['data']);
}

// 熔断器触发后,所有请求会执行该回调方法
#[GetMapping('/users/testCircuitBreakerFallback')]
public function testCircuitBreakerFallback()
{
    return ResponseTool::error(message: 'The server is busy, please try again later ...');
}

CircuitBreaker 熔断器注解参数说明:

参数 含义
$options 配置选项,如 timeout=0.5 设置超时时间
$failCounter 超时次数大于等于1,开启熔断器
$successCounter 成功次数大于等于3,关闭熔断器
$duration 熔断后,重新恢复服务调用的时间,10秒内新的请求会执行 fallback 方法
$fallback 用于指定熔断时执行的方法
第五步:测试

当 id < 0 时,正常返回结果:

$ curl http://192.168.31.90:9502/users/testCircuitBreaker?id=-1
{"code":200,"message":"success","data":[]}

下面使用 jmeter 进行并发测试,1 秒并发 100 次请求,结果如下:

当熔断开启会,会自动去调用 testCircuitBreakerFallback 方法,并返回我们自定义的内容。

当感觉到乏了,请不要放弃,一定要坚持下去。我写的每一篇文章都是正常运行后才发布出来的,经过了实际的测试。假如没有跑起来,先静一静,找哪是哪个地方出错了。

本篇文章到此结束,我是温新。

请登录后再评论