Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan PHP7.0 untuk melaksanakan get laluan API dengan seni bina perkhidmatan mikro?

Bagaimana untuk menggunakan PHP7.0 untuk melaksanakan get laluan API dengan seni bina perkhidmatan mikro?

王林
王林asal
2023-05-28 11:31:361747semak imbas

Dengan populariti pengkomputeran awan dan seni bina perkhidmatan mikro, get laluan API merupakan bahagian yang amat diperlukan dalam sistem perkhidmatan mikro, dan fungsinya menjadi semakin penting. Gerbang API boleh memintas dan memajukan semua permintaan di dalam dan di luar sistem, dan bertanggungjawab untuk keselamatan, kawalan akses, kawalan trafik, pengimbangan beban dan fungsi lain.

Dalam artikel ini, kami akan memperkenalkan cara untuk melaksanakan get laluan API mudah menggunakan PHP7.0 untuk mencapai fungsi berikut:

  • Penghalaan: permintaan pemajuan berdasarkan URL yang diminta dan HTTP kaedah kepada perkhidmatan mikro yang sepadan.
  • Penghadan semasa: Hadkan kekerapan dan bilangan konkurensi setiap panggilan API.
  • Pengesahan dan Kebenaran: Kenal pasti dan sahkan identiti permintaan dan kawalan akses berdasarkan peranan dan kebenaran pengguna.
  • Statistik: Merekod dan menganalisis penggunaan API untuk mengenal pasti kemungkinan kesesakan.

Sebelum anda bermula, sila pastikan anda telah memasang perisian berikut:

  • PHP7.0 atau lebih tinggi.
  • Komposer: Pengurus pakej PHP.
  • Guzzle: Pustaka PHP untuk permintaan HTTP.
  • Redis: Pangkalan data nilai kunci dalam memori yang digunakan untuk menyimpan token dan pembilang had semasa.

Langkah 1: Tulis get laluan API asas

Pertama, kita perlu mencipta get laluan API asas untuk penghalaan permintaan kepada perkhidmatan mikro. Kami akan menggunakan Komponen Penghalaan Symfony untuk mengendalikan penghalaan.

Buat fail PHP baharu, sebut index.php, dan tambah kod berikut:

require_once 'vendor/autoload.php';

use SymfonyComponentRoutingRouteCollection;
use SymfonyComponentRoutingRoute;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingMatcherUrlMatcher;
use SymfonyComponentRoutingExceptionResourceNotFoundException;

$routes = new RouteCollection();

$routes->add('hello', new Route('/hello/{name}', array(
    'controller' => function ($request) {
        return new Response(sprintf("Hello, %s!", $request->attributes->get('name')));
    }
)));

$matcher = new UrlMatcher($routes, getRequest());

try {
    $request = Request::createFromGlobals();
    $parameters = $matcher->matchRequest($request);
    $response = call_user_func($parameters['controller'], $request);
} catch (ResourceNotFoundException $exception) {
    $response = new Response('Not Found', Response::HTTP_NOT_FOUND);
} catch (Exception $exception) {
    $response = new Response('An error occurred', Response::HTTP_INTERNAL_SERVER_ERROR);
}

$response->send();

Dalam kod ini, kami telah mencipta laluan yang dipanggil "hello" yang akan Permintaan dimajukan kepada kaedah pengawal tanpa nama. Apabila laluan ini diproses, ia akan mengembalikan "Helo, {name}!" dalam respons dengan {name} ialah parameter laluan.

Kami menggunakan kelas Permintaan dan Respons Symfony untuk membuat dan menghantar permintaan dan respons HTTP. Komponen Penghalaan Symfony bertanggungjawab untuk penghalaan permintaan kepada laluan yang sepadan dan memanggil kaedah pengawal yang sepadan.

Pada ketika ini, kita boleh menjalankan fail ini, lawati http://localhost:8080/hello/world, dan anda boleh melihat output "Hello, world!".

Langkah 2: Tambahkan fungsi mengehadkan semasa

Kami berharap get laluan API dapat mengehadkan permintaan setiap API untuk mengurangkan risiko lebihan beban pada bahagian pelayan. Untuk melakukan ini, kami boleh menggunakan Redis untuk menyimpan pembilang pendikit bagi setiap API.

Pertama, kita perlu memasang Predis menggunakan Composer, iaitu perpustakaan klien Redis dalam PHP:

composer require predis/predis

Kemudian, tambah kod berikut dalam index.php supaya setiap perkhidmatan mikro Semak kaunter sebelum meminta:

use PredisClient;

// ...

$redis = new Client();

// Limit requests to 100 per minute per user.
$maxRequests = 100;
$timeWindow = 60; // seconds

$ip = $_SERVER['REMOTE_ADDR'];
$key = "ratelimit:{$ip}";

$currentRequests = $redis->incr($key);
$redis->expire($key, $timeWindow);

if ($currentRequests > $maxRequests) {
    $response = new Response('Rate limit exceeded', Response::HTTP_TOO_MANY_REQUESTS);
    $response->headers->set('Retry-After', $timeWindow);
    $response->send();
    exit;
}

Dalam kod ini, kami menggunakan klien Predis untuk menyambung ke pelayan Redis dan menggunakan alamat IP setiap permintaan sebagai nama kunci. Kami menetapkan had 100 permintaan seminit bagi setiap pengguna dan menggunakan fungsi Incr untuk menambah pembilang.

Jika nilai semasa kaunter melebihi had maksimum, kembalikan respons "Terlalu Banyak Permintaan" HTTP 429 dan tetapkan pengepala "Cuba Semula Selepas" untuk memberitahu klien bila hendak mencuba permintaan itu semula.

Langkah 3: Tambah fungsi pengesahan dan kebenaran

Kami juga perlu menambah fungsi pengesahan dan kebenaran asas untuk setiap permintaan API. Untuk ini kami akan menggunakan standard JSON Web Token (JWT).

Untuk menggunakan JWT, sila pasang perpustakaan firebase/php-jwt dahulu:

composer require firebase/php-jwt

Kemudian, tambahkan kod berikut dalam index.php untuk melaksanakan pengesahan dan kebenaran standard JWT:

use FirebaseJWTJWT;

// ...

$key = 'secret';
$token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';

if ($token) {
    try {
        $decoded = JWT::decode($token, $key, array('HS256'));
        $user_id = $decoded->sub;
        $roles = $decoded->roles;
    } catch (Exception $e) {
        $response = new Response('Invalid token', Response::HTTP_UNAUTHORIZED);
        $response->send();
        exit;
    }

    // Check user roles and permissions here...
} else {
    $response = new Response('Token required', Response::HTTP_UNAUTHORIZED);
    $response->send();
    exit;
}

Dalam kod ini, kami menggunakan token JWT yang diekstrak daripada pengepala HTTP untuk mengenal pasti dan mengesahkan permintaan. Kami menggunakan perpustakaan JWT untuk menyahkod token dan mengesahkan tandatangan dan kesahihan. Jika token itu sah, ID pengguna dan maklumat peranan diekstrak daripadanya dan kebenarannya disemak. Jika token tidak sah, respons "Tidak Dibenarkan" HTTP 401 dikembalikan.

Langkah 4: Tambah fungsi statistik

Akhir sekali, kami menambah fungsi statistik mudah untuk merekodkan penggunaan API. Untuk melakukan ini, kami akan menggunakan Redis untuk menyimpan metrik seperti bilangan permintaan dan masa respons.

Pertama, kita perlu memasang sambungan phpredis:

sudo apt-get install php7.0-redis

Kemudian, tambah kod berikut dalam index.php untuk mencatat statistik setiap permintaan:

use PredisClient;

// ...

$redis = new Client();

$ip = $_SERVER['REMOTE_ADDR'];
$key = "stats:{$ip}";
$now = time();
$timestamp = strtotime(date('Y-m-d H:i:00', $now));

$redis->zincrby($key, 1, $timestamp);
$redis->expire($key, 3600);

Di Sini kod tersebut, kami mempertimbangkan bilangan permintaan bagi setiap alamat IP (iaitu setiap pengguna) dan meningkatkan nilai pembilang permintaan sebanyak 1 menggunakan arahan ZINCRBY Redis. Kami juga menggunakan penetapan masa tamat tempoh dalam Redis untuk memadam rekod tamat tempoh.

Langkah 5: Gunakan Gerbang API

Kini, kami telah menambah fungsi asas seperti penghalaan, sekatan, pengesahan, kebenaran dan statistik pada Gerbang API kami. Kami boleh menggunakan ia menggunakan pelayan web tradisional seperti Apache atau Nginx, atau menggunakan pelayan terbina dalam PHP untuk ujian.

Pertama, jalankan arahan berikut dalam terminal untuk memulakan pelayan terbina dalam PHP dan arahkan ke fail index.php kami:

php -S localhost:8080

Kemudian, kita boleh melawati http:/ / dalam pelayar /localhost:8080/, dan tambah laluan seperti /hello/world dalam laluan URL untuk menguji pelbagai fungsi get laluan API.

Ringkasan

Dalam artikel ini, kami menggunakan PHP7.0 dan pelbagai perpustakaan sumber terbuka untuk melaksanakan get laluan API asas dan menambah fungsi asas seperti sekatan, pengesahan, kebenaran dan statistik. Gerbang API ialah bahagian penting dalam seni bina perkhidmatan mikro, yang boleh membantu kami mencapai prestasi, keselamatan dan kebolehskalaan yang lebih baik.

Malah, kini terdapat banyak penyelesaian get laluan API yang berkuasa untuk dipilih, seperti Kong, Tyk, Gerbang API AWS, dll., yang menyediakan ciri dan penyepaduan yang lebih maju seperti pengimbangan beban, caching, keselamatan, pemantauan dan pengurusan dll.

Walau bagaimanapun, adalah penting untuk mengetahui cara membina get laluan API menggunakan perpustakaan seperti PHP dan Symfony, yang merupakan pilihan terbaik apabila anda perlu membina get laluan API ringkas dengan cepat.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan PHP7.0 untuk melaksanakan get laluan API dengan seni bina perkhidmatan mikro?. 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