swoft做微服务RPC服务中心consul

本文介绍了如何使用Docker搭建Consul集群,并展示了如何在Swoft项目中配置服务提供者和服务使用者,通过Consul进行服务发现和注册/反注册。主要内容包括配置Swoft的RPC服务器,监听器以及客户端对Consul服务的调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、搭建consul集群

可以参考 有道云笔记 这是用docker搭建的集群

其中一个consul client 为127.0.0.1:8511 下面需要用到

二、服务提供者 项目 swoft1 (我自己命名的项目)

修改1

app/bean.php

<?php

use Swoft\Rpc\Server\ServiceServer;

return [
    'rpcServer' => [
        'class' => ServiceServer::class,
        'host' => '192.168.1.10',
        'port' => 8307,
    ],
    'consul' => [
        'port' => 8511
    ]
];

其他的配置看需要添加,这里两个选项要配置,rpcServer也可以去掉(有默认值),但是去掉就不直观了

修改2

Listener/RegisterServiceListener.php 去掉注释 并引入CLog包

public function handle(EventInterface $event): void
{
    /** @var HttpServer $httpServer */
    $httpServer = $event->getTarget();

    $service = [
        'ID' => 'swoft',
        'Name' => 'swoft',
        'Tags' => [
            'http'
        ],
        'Address' => $httpServer->getHost(),
        'Port' => $httpServer->getPort(),
        'Meta' => [
            'version' => '1.0'
        ],
        'EnableTagOverride' => false,
        'Weights' => [
            'Passing' => 10,
            'Warning' => 1
        ]
    ];


    // Register
    $this->agent->registerService($service);
    CLog::info('Swoft http register service success by consul!');
}

修改3

Listener/DeregisterServiceListener.php 去掉注释,这个是使用命令行关闭swoft服务的时候自动反注册服务

public function handle(EventInterface $event): void
{
    /** @var HttpServer $httpServer */
    $httpServer = $event->getTarget();

    $this->agent->deregisterService('swoft');
}

然后就可以启动服务端了

php ./bin/swoft rpc:start

 

三、服务使用者 项目swoft2 (我自己命名的项目)

修改1

app/Common/RpcProvider.php

class RpcProvider implements ProviderInterface
{
    /**
     * @Inject()
     *
     * @var Health
     */
    private $health;

    public function getList(Client $client): array
    {
        $serviceName = $client->getSetting()['consul_service_name'] ?? '';
        $services = $this->health->service($serviceName, ['passing' => true]);
        $services = $services->getResult();
        $address = [];
        foreach ($services as $k => $v) {
            $address[] = $v['Service']['Address'] . ":" . $v['Service']['Port'];
        }
        return array_unique($address);
    }
}

修改2

app/bean.php 其他的配置看需要添加

return [
    'httpServer' => [
        'class' => HttpServer::class,
        'port' => 18308,
    ],
    'user' => [
        'class' => ServiceClient::class,
        'setting' => [
            'consul_service_name' => 'swoft',//consulservice里面筛选出自己需要的
            'timeout' => 0.5,
            'connect_timeout' => 1.0,
            'write_timeout' => 10.0,
            'read_timeout' => 0.5,
        ],
        'packet' => bean('rpcClientPacket'),
        'provider' => bean(RpcProvider::class)
    ],
    'user.pool' => [
        'class' => ServicePool::class,
        'client' => bean('user'),
    ],
    'consul' => [
        'port' => 8511
    ]
];

然后就可以启动调用端了

php ./bin/swoft rpc:start

php ./bin/swoft http:start

然后再浏览器输入

http://127.0.0.1:18308/rpc/getList

就可以通过调用端获取consul服务里面有效的服务地址来调用提供端的接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值