Rumah >rangka kerja php >Swoole >Swoole melaksanakan pelayan RPC berprestasi tinggi

Swoole melaksanakan pelayan RPC berprestasi tinggi

王林
王林asal
2023-06-13 17:54:48851semak imbas

Dalam beberapa tahun kebelakangan ini, dengan pembangunan berterusan aplikasi rangkaian, semakin banyak aplikasi perlu melaksanakan fungsi Remote Procedure Call (RPC). Rangka kerja RPC tradisional seperti Dubbo, Thrift, gRPC, dsb. boleh memenuhi permintaan ini Namun, dengan peningkatan aplikasi dan perniagaan, masalah prestasi menjadi semakin jelas. Untuk menyelesaikan masalah ini, komuniti sumber terbuka melancarkan pelayan RPC berprestasi tinggi berdasarkan bahasa PHP-Swoole.

Swoole ialah rangka kerja komunikasi rangkaian tak segerak, selari, berprestasi tinggi yang dibangunkan berdasarkan bahasa PHP, yang membolehkan program PHP memproses permintaan rangkaian dengan lebih cekap. Pelayan RPC ialah komponen Swoole Ia menyediakan kaedah panggilan prosedur jauh berdasarkan protokol TCP, menyokong I/O tak segerak, coroutine, pengurusan proses dan ciri-ciri lain, dan boleh melaksanakan perkhidmatan RPC berprestasi tinggi dan berkonkurensi tinggi dengan mudah.

Seterusnya, kami akan memperkenalkan cara menggunakan Swoole untuk melaksanakan pelayan RPC berprestasi tinggi.

Pasang sambungan Swoole

Sebelum kita bermula, kita perlu memasang sambungan Swoole terlebih dahulu. Memandangkan Swoole bergantung pada sambungan C asas PHP, anda perlu memasang pengkompil C dan perpustakaan bergantung Swoole terlebih dahulu.

yum install -y gcc 
    automake 
    autoconf 
    libtool 
    make 
    php-devel 
    php-pear 
    pcre-devel 
    openssl-devel

Selepas memasang perpustakaan bergantung, kita boleh menggunakan arahan pecl untuk memasang sambungan Swoole:

pecl install swoole

Selepas pemasangan selesai, kita perlu menambah baris berikut pada php.ini fail untuk mendayakan sambungan Swoole:

extension=swoole.so

Melaksanakan pelayan RPC

Selepas memasang sambungan Swoole, kami boleh mula melaksanakan pelayan RPC. Di sini kita akan menggunakan mekanisme refleksi PHP untuk melaksanakan pendaftaran perkhidmatan automatik, dan coroutine Swoole untuk mengendalikan I/O tak segerak.

Buat kelas perkhidmatan

Pertama, kita perlu mencipta kelas perkhidmatan untuk mendedahkan kaedah untuk panggilan jauh. Dalam kelas ini, kita boleh mentakrifkan berbilang kaedah dan menggunakan DocBlock PHP untuk menandakan parameter dan jenis nilai pulangan kaedah untuk menjana dokumentasi dan petua kod secara automatik.

/**
 * @method string hello(string $name)
 */
class MyService
{
    public function hello(string $name): string
    {
        return "Hello, $name!";
    }
}

Dalam kod di atas, kami mentakrifkan kelas MyService, yang mengandungi kaedah bernama hello, yang menerima parameter jenis rentetan $name dan mengembalikan data jenis rentetan.

Buat pelayan RPC

Seterusnya, kita perlu melaksanakan pelayan RPC untuk menerima permintaan pelanggan dan memanggil kaedah yang sepadan dalam kelas perkhidmatan untuk mengendalikan permintaan.

$server = new SwooleServer('127.0.0.1', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

/**
 * 注册服务
 */
$server->set([
    'worker_num' => 1,
    'dispatch_mode' => 1,
]);
$myService = new MyService();
$methods = get_class_methods($myService);
$availableMethods = [];
foreach ($methods as $method) {
    // 忽略 __* 类型的方法,私有方法和构造方法
    if (!preg_match('/^__|^get[A-Z]/i', $method) && is_callable([$myService, $method])) {
        $availableMethods[] = $method;
    }
}
$server->on('WorkerStart', function () use ($availableMethods, $myService) {
    // 打开协程支持
    SwooleRuntime::enableCoroutine();
    $service = new HproseSwooleSocketService();
    foreach ($availableMethods as $method) {
        $service->addFunction([$myService, $method], $method);
    }
    $server = new HproseSwooleSocketServer('tcp://0.0.0.0:9501');

    //监听 RPC 请求
    $coroutine = new SwooleCoroutineHttpClient();
    $coroutine->setHeaders([
        'Content-Type' => 'text/plain',
    ]);

    while (true) {
        $socket = $server->accept();
        if ($socket !== false) {
            $socket->setOption(['open_length_check' => 1]);
            $socket->setOption(['package_length_type' => 'N']);
            $socket->setOption(['package_length_offset' => 0]);
            $socket->setOption(['package_body_offset' => 4]);
            $socket->start();
            $client = new SwooleCoroutineClient(SWOOLE_SOCK_TCP);
            $client->connect('127.0.0.1', 9502);
            $client->send($socket->recv());
            $out = $client->recv();
            $socket->send($out);
            $socket->close();
        }
    }
});
$server->start();

Dalam kod di atas, kami mencipta objek $server yang mendengar pada alamat dan port 127.0.0.1:9501, menggunakan mod proses SWOOLE_PROCESS dan protokol SWOOLE_SOCK_TCP.

Selepas pelayan dimulakan, kami menggunakan mekanisme refleksi PHP untuk mendapatkan semua kaedah boleh panggil dalam kelas perkhidmatan. Kemudian, kami menggunakan coroutine Swoole untuk mendengar permintaan RPC dan mengendalikan permintaan dengan memanggil kaedah kelas perkhidmatan. Semasa proses pelaksanaan, kami menggunakan perpustakaan pihak ketiga Hprose, yang menyediakan cara yang mudah dan jelas untuk melaksanakan perkhidmatan RPC dan sangat mudah digunakan.

Buat pelanggan

Akhir sekali, kita perlu mencipta pelanggan untuk meminta perkhidmatan RPC. Dalam contoh ini, kita boleh menggunakan kelas Klien yang disertakan dengan Hprose untuk mencapai ini.

$client = new HproseHttpClient('http://127.0.0.1:9501/', false);
echo $client->hello('Swoole');

Dalam kod di atas, kami mencipta objek klien HTTP Hprose dan memanggil kaedah helo dalam kelas perkhidmatan untuk memulakan permintaan kepada pelayan RPC.

Ringkasan

Swoole ialah rangka kerja komunikasi rangkaian yang berkuasa yang menyediakan banyak ciri tak segerak, selari dan berprestasi tinggi, yang boleh meningkatkan keupayaan pemprosesan program PHP. Dengan mengkaji kandungan dalam artikel ini, kami boleh melaksanakan pelayan RPC berprestasi tinggi, berkonkurensi tinggi dan meningkatkan kecekapan pemprosesan dan pengendalian program PHP.

Atas ialah kandungan terperinci Swoole melaksanakan pelayan RPC berprestasi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn