Модуль обработки сервисов NGINX
Предварительные условия
- Linux платформа
- Версия Nginx не ниже
1.9.11 - Установленные инструменты для компиляции NGINX
Функции модуля
- Запрос на службу/ответные сообщения - все в формате
json . Библиотека cJSON составлена по умолчанию. Разработчики бизнеса могут использовать его в пакетах Parse/Package, и, конечно, они также могут использовать другие библиотеки диаграммы json (см. example/third_test раздел) - Реализуя конкретный интерфейс, составьте службу в динамическую библиотеку и загрузите его в Nginx
преимущество
- Высокая производительность , используя многопроцессорную модель Nginx для обработки бизнеса, и разработчики бизнеса также могут использовать многопоточное в реализованном интерфейсе в соответствии с конкретными сценариями для дальнейшего повышения производительности, а также могут масштабироваться горизонтально за счет балансировки нагрузки.
- Сильный , когда сервис сбой, Nginx будет переименовать рабочую процесс, чтобы гарантировать, что бизнес не прекращает обработку
- Служба плавного перезапуска/обновления . С помощью функции плавного перезапуска/обновления NGINX, перезапуск/обновление службы может быть элегантно перезапустить/обновлять.
Строить
1. Скачать исходный код Nginx
# 这里以 nginx-1.24.0 为例, 也可以根据自己情况下载其他版本的 nginx 源码
wget http://nginx.org/download/nginx-1.24.0.tar.gz
2. Декакомпресс и введите каталог исходного кода NGINX
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
3. Потяните код этого проекта
# 这里拉取到 nginx 源码的目录下, 也可以根据情况拉取到其他目录
git clone https://github.com/xukeawsl/ngx_http_service_module.git
4. Добавьте модуль в nginx и установите его
# 如果你将项目代码放在其他路径, 则需要修改这里的模块路径
./configure --add-module=ngx_http_service_module
make
make install
Команды конфигурации
1. MODULE_PATH (можно настроить только в блоке HTTP)
- Эта команда настраивает путь, к которому принадлежит динамическая библиотека. Если он не настроен, установите поиск по поиску по умолчанию
- Первый параметр - это путь, за которым следует имя файла динамического библиотеки (полное имя)
module_path {
/ path/to /dir1 module1.so;
/ path/to /dir2 module2.so module3.so;
} 2. MODULE_DEPENDENDINENTY (можно настроить только в блоке HTTP)
- Эта конфигурация устанавливает зависимости между динамическими библиотеками
- Первый параметр - это динамическая библиотека, которая зависит от динамической библиотеки, она зависит от
module_dependency {
module1. so module2.so;
module3. so module2.so libjsoncpp.so;
} 3. Сервис (можно настроить только в блоке HTTP)
- Услуги, предоставленные этим модулем настройки конфигурации
- Первый параметр - это имя файла динамического библиотеки, за которым следует имя службы, предусмотренное для динамической библиотеки (Case Cellessive)
- Название сервиса должно быть во всем мире уникальным
service {
module1. so srv_echo srv_datetime;
module2. so srv_sayHello;
module3. so srv_getSum;
} 4. service_mode (http, сервер, блоки местоположения могут быть настроены)
- Используется для включения функций модуля, нельзя не будут обрабатываться для обслуживания
- Не включен по умолчанию, следующий пример включен глобально на указанном сервере, но запрос на маршрутизацию
/test не обрабатывается
http {
server {
sevice_mode on;
location /test {
service_mode off;
}
}
}Разработка интерфейса услуг
- Пользователи должны включить интерфейс
ngx_http_service_interface.h в проекте
// 接口形如下面的函数
#include "ngx_http_service_interface.h"
#include "cJSON.h"
void srv_sayHello ( const ngx_request_t * rqst , ngx_request_t * resp )
{
// do something...
} // 请求结构只包含一个 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 * );
};Правила вызова услуг
- Метод запроса требует
POST - Укажите услугу, которая будет вызвана значением HTTP Header
Service-Name -
Content-Type должен быть типа json - Следующим образом, позвоните в службу
srv_sayHello
curl -X POST " http://localhost/service_test "
-H ' Content-Type: application/json '
-H ' Service-Name: srv_sayHello '
-d ' {"data": "xxxx"} '