swoft微服务实战二十七:增加consul示意图

1. 增加consul示意图:

网关从consul中获取健康的列表进行调用服务.

(1). 修改bean.php:
app\bean.php:

'EnvConfig' => [
    'class'    => \App\Lib\EnvConfig::class,
    'namespace' => env("ENV_NAMESPACE", ""),
    'host' => env("ENV_HOST", ""),
    // 增加
    'service_prefix' => env("ENV_SERVICE_PREFIX", "localhost"),
],

(2). 增加EnvConfig类:

namespace App\Lib;
class EnvConfig {
    ...
    // 增加以下代码
    protected $service_prefix;
    public function getServicePrefix()
    {
        return $this->service_prefix;
    }
}

(3). 增加ServiceHelper类(用来根据服务名获取服务地址列表):
app\Lib\ServiceHelper.php:

namespace App\Lib;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Bean\Annotation\Mapping\Inject;
use Swoft\Consul\Agent;
use Swoft\Consul\Health;
/**
 * @Bean()
 */
class ServiceHelper{
    /**
     * @Inject()
     * @var Agent
     */
    private $agent;
    /**
     * @Inject()
     * @var Health
     */
    private $health;
    public function  getService(string $serviceName):array{
        $services = $this->agent->services()->getResult();
        $checks = $this->health->checks($serviceName, ["filter"=>"Status==passing"])->getResult();
        $passingNode=[];
        foreach($checks as $check){
            $passingNode[]=$check["ServiceID"];
        }
        if(count($passingNode)==0) return [];
        return  array_intersect_key($services,array_flip($passingNode));
    }
    // 解析tags
    public function parseTags(array $service): array
    {
        if (empty($service) || !is_array($service) || empty($service['Tags'])) {
            return [];
        }
        $result = [];
        foreach ($service['Tags'] as $v) {
            if (preg_match("/^gw\.(\w+)=(.*)/i", $v, $matches)) {
                $result[$matches[1]] = str_replace('.', '\\', $matches[2]);
            }
        }
        return $result;
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值