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:
Sebelum anda bermula, sila pastikan anda telah memasang perisian berikut:
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!