Modul Pemrosesan Layanan Nginx
Prasyarat
- Platform Linux
- Versi nginx tidak lebih rendah dari
1.9.11 - Alat yang diinstal untuk kompilasi nginx
Fitur Modul
- Pesan Permintaan/Respons Layanan semuanya dalam format
json . Perpustakaan cJSON disusun secara default. Pengembang Bisnis Dapat Menggunakannya untuk Parse/Paket Paket, dan tentu saja mereka juga dapat menggunakan Pustaka Parsing json lainnya (lihat example/third_test ) - Dengan mengimplementasikan antarmuka tertentu, kompilasi layanan ke dalam pustaka dinamis dan memuatnya ke Nginx
keuntungan
- Kinerja tinggi , menggunakan model multi-proses NGINX untuk memproses bisnis, dan pengembang bisnis juga dapat menggunakan multi-threading dalam antarmuka yang diimplementasikan sesuai dengan skenario spesifik untuk lebih meningkatkan kinerja, dan juga dapat skala horizontal melalui penyeimbangan beban.
- Kuat , saat layanan macet, Nginx akan memulai kembali proses kerja untuk memastikan bahwa bisnis tidak berhenti memproses
- Layanan restart/upgrade yang lancar . Dengan bantuan fungsi restart/upgrade Nginx yang halus, layanan restart/peningkatan layanan dapat restart/upgrade yang elegan.
Membangun
1. Unduh kode sumber nginx
# 这里以 nginx-1.24.0 为例, 也可以根据自己情况下载其他版本的 nginx 源码
wget http://nginx.org/download/nginx-1.24.0.tar.gz
2. Decompress dan masukkan Direktori Kode Sumber Nginx
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
3. Tarik kode proyek ini
# 这里拉取到 nginx 源码的目录下, 也可以根据情况拉取到其他目录
git clone https://github.com/xukeawsl/ngx_http_service_module.git
4. Tambahkan modul ke nginx dan instal
# 如果你将项目代码放在其他路径, 则需要修改这里的模块路径
./configure --add-module=ngx_http_service_module
make
make install
Perintah Konfigurasi
1. MODULE_PATH (hanya dapat dikonfigurasi di blok http)
- Perintah ini mengkonfigurasi jalur yang dimiliki oleh pustaka dinamis. Jika tidak dikonfigurasi, instal pencarian jalur pencarian default
- Parameter pertama adalah jalur, diikuti oleh nama file pustaka dinamis (nama lengkap)
module_path {
/ path/to /dir1 module1.so;
/ path/to /dir2 module2.so module3.so;
} 2. MODULE_Dependency (hanya dapat dikonfigurasi di blok http)
- Konfigurasi ini menetapkan dependensi antara pustaka dinamis
- Parameter pertama adalah pustaka dinamis yang tergantung, diikuti oleh pustaka dinamis yang tergantung pada
module_dependency {
module1. so module2.so;
module3. so module2.so libjsoncpp.so;
} 3. Layanan (hanya dapat dikonfigurasi di blok http)
- Layanan yang disediakan oleh Modul Pengaturan Konfigurasi ini
- Parameter pertama adalah nama file pustaka dinamis, diikuti oleh nama layanan yang disediakan untuk pustaka dinamis (sensitif case)
- Nama layanan harus unik secara global
service {
module1. so srv_echo srv_datetime;
module2. so srv_sayHello;
module3. so srv_getSum;
} 4. Service_Mode (http, server, blok lokasi semuanya dapat dikonfigurasi)
- Digunakan untuk mengaktifkan fungsi modul, bagian yang tidak dapat diaktifkan tidak akan diproses untuk layanan
- Tidak diaktifkan secara default, contoh berikut diaktifkan secara global di server yang ditentukan, tetapi permintaan routing untuk
/test tidak diproses
http {
server {
sevice_mode on;
location /test {
service_mode off;
}
}
}Pengembangan Antarmuka Layanan
- Pengguna perlu memasukkan file antarmuka
ngx_http_service_interface.h dalam proyek
// 接口形如下面的函数
#include "ngx_http_service_interface.h"
#include "cJSON.h"
void srv_sayHello ( const ngx_request_t * rqst , ngx_request_t * resp )
{
// do something...
}- Struktur Permintaan/Respons
// 请求结构只包含一个 const char * 指针指向 json 请求字符串
struct ngx_json_request_s {
const char * data ;
};
// 响应结构包含一个 char * 指针指向 json 响应字符串和一个回调函数用于释放响应字符串的内存
// 因为对于 c++ 实现的服务可能使用 new 来分配内存, 那就需要指定正确的内存释放方式
struct ngx_json_response_s {
char * data ;
void ( * release )( void * );
};Aturan panggilan layanan
- Metode permintaan membutuhkan
POST - Tentukan layanan yang akan dipanggil dengan nilai
Service-Name header http -
Content-Type harus dari tipe json - Sebagai berikut, hubungi Layanan
srv_sayHello
curl -X POST " http://localhost/service_test "
-H ' Content-Type: application/json '
-H ' Service-Name: srv_sayHello '
-d ' {"data": "xxxx"} '