Практика открытия шлюза API (1) — проектирование шлюза API

Java
Практика открытия шлюза API (1) — проектирование шлюза API

Как спроектировать и внедрить легкий открытый шлюз API.

Адрес статьи:blog.Park Ruiqing.com/2019/08/05/…

предисловие

С развитием бизнеса подключается все больше третьих лиц, и каждая бизнес-система сталкивается с одной и той же проблемой:如何让第三方安全快速接入, В настоящее время становится особенно важным иметь службу шлюза API, которая объединяет такие функции, как проверка подписи, аутентификация, ограничение тока и переход на более раннюю версию.

Далее я расскажу, как спроектировать и реализовать легкий открытый шлюз API, включая дизайн интерфейса, дизайн базы данных, схему проверки подписи, аутентификацию и т. д. В этой статье основное внимание уделяется общему дизайну, а конкретные детали реализации будут представлены в последующих статьях. .

Введение в шлюз API

Шлюз API особенно важен в микросервисах, которые абстрагируют функции, общие для различных бизнес-систем, такие как аутентификация, ограничение тока и переход на более раннюю версию, и действуют как барьер за пределами многих внутренних бизнес-систем.

основные потребности

  1. Подпись и проверка
  2. Аутентификация
  3. маршрутизация
  4. Управление разрешениями и ресурсами

общий дизайн

Такие функции, как проверка подписи и аутентификация, обрабатываются в порядке цепочки ответственности.Шлюз выполняет маршрутизацию в соответствии с конфигурацией и добавляет параметры для взаимодействия с бизнес-системой для обработки (например, фильтрация данных и т. д.).Краткая обработка запросов поток выглядит следующим образом:

дизайн интерфейса

Самая основная функция шлюза — пересылка запросов.Обычным способом является переадресация запросов внутренним службам в соответствии с правилами маршрутизации в конфигурации, такими как:

будет/order/*Запрос направляется во внутреннюю систему заказов,/user/*Запрос перенаправляется во внутреннюю пользовательскую систему, которая часто используется в основном шлюзе, отвечающем за всю бизнес-систему.

Дизайн этой бумаги服务于第三方的开放API网关, не использует описанный выше подход, а помещает запрошенный ресурс в качестве параметра в тело запроса по следующим причинам:

  1. Открытый API обслуживает третьи стороны, защищает внутренние пути и способствует предоставлению унифицированных и стандартизированных интерфейсов.
  2. Отображение интерфейса запросов поддерживается таблицей маршрутизации шлюза, а внутренний интерфейс обновляется или даже переключается на новый сервис, а внешний интерфейс остается неизменным.
  3. Он может выполнять контроль разрешений, текущее ограничение, статистику и т. Д. Для интерфейса более детально.

адрес

Открытый шлюз API обеспечивает единственный внешний вход, а конкретные запрошенные ресурсы передаются в качестве параметров.

общедоступный параметр

Чтобы упростить операции подписи и проверки, а также повысить гибкость, единственная запись имеет фиксированные общедоступные параметры и возвращаемые значения, как показано ниже:

параметры публичного запроса

имя параметра Это необходимо тип Пример Примечание
app_id да string Идентификатор приложения
method да string aaa.bbb.ccc метод запроса
charset да string UTF-8 кодирование
format да string JSON формат бизнес-параметров
sign_type да string RSA2 Тип подписи
sign да string подписать
timestamp да number 1564929661796 Отметка времени, единица измерения: миллисекунды
nonce да string 63DCB93D270E44D49499F9E5D55705FE Случайная строка (рекомендуется UUID)
version да string 1.0 версия интерфейса
biz_content да string {"start_time":"1564929661796", ...} Запрос бизнес-параметров
  • app_id: идентификатор приложения, идентификатор приложения является предметом авторизации и личность вызывающего абонента
  • method: метод запроса, соответствующий внутреннему URL-адресу, поддерживаемому таблицей маршрутизации шлюза.
  • timestampиnonceИспользуется для предотвращения повторных атак.
  • biz_content: Бизнес-параметр, этот параметр будет передан во внутреннюю бизнес-систему.

общедоступный возвращаемый параметр

имя параметра Это необходимо тип Пример Примечание
code да number 0 код ошибки
message нет string сообщение об ошибке
charset да string UTF-8 кодирование
format да string JSON формат возвращаемого параметра
sign_type да string RSA2 Тип подписи
sign да string подписать
timestamp да number Отметка времени, единица измерения: миллисекунды
biz_content да string {"id":"1564929661796", ...} Возврат бизнес-параметров
  • biz_content: возвращает бизнес-параметры, шлюз пересылает возвращаемое значение бизнес-системы.
[Уведомление об авторских правах]
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.

схема подписи

И вызывающая сторона, и сервер генерируют2048немногоRSAСекретный ключ, открытый ключ обмена, закрытый ключ используется для подписи, открытый ключ используется для проверки подписи, а внешний интерфейс открытого API-шлюза используетсяhttps, поэтому в настоящее время дополнительное шифрование не требуется.

Алгоритм подписи

Название алгоритма подписи Имя стандартного алгоритма подписи Примечание
RSA2 SHA256WithRSA Обеспечьте длину ключей RSA не менее 2048

Правила подписи

Содержимое параметра подписи

выбраковыватьsignВсе параметры после этого.

Порядок параметров подписи

по имени параметраASCIIСортировка по возрастанию кода (алфавитная сортировка).

Как сгенерировать подпись

Отсортированный список параметров объединяется в参数名a=参数值a&参数名b=参数值b&...&参数名z=参数值zстроку и использовать私钥генерироватьsign.

Дизайн базы данных

База данных используется для хранения конфигураций, таких как разрешения ключей, и между программой и базой данных существует несколько уровней кеша для повышения скорости доступа.Краткая диаграмма ER выглядит следующим образом:

  • app: Принципал вызывающей стороны, используемый для идентификации запрашивающей стороны.
  • group: Группа,appсгруппировано поgroupЕдиная авторизация.
  • subject: основная часть (приложение/группа).
  • resource: ресурсы, поддерживать отношения сопоставления между ресурсами запроса и внутренними интерфейсами,url+http_methodСоответствует уникальному resource_id.

Технический отбор

В дополнение к удовлетворению функциональных требований к шлюзу необходимо также учитывать требования к производительности, поскольку производительность шлюза как единственного внешнего входа в каждую бизнес-систему может стать узким местом всей бизнес-системы. несложно, требования к производительности высоки, и программирование ответа — хороший выбор.

  • Spring WebFlux + netty: адаптивный веб-фреймворк.
  • Spring Data Reactive Redis + Lettuce: реактивный клиент Redis.
  • Guava: Google Toolkit, используяLoadingCacheкак внутрипроцессный кеш.

Эпилог

Шлюз выступает в качестве барьера и входа за пределы внутренней системы.В дополнение к основным функциям и требованиям к производительности необходимо учитывать мониторинг, статистику, журналы и т. д. Существует множество продуктов с открытым исходным кодом для шлюзов, но вы должны учитывать свое собственное дело при выборе, исходя из предпосылки, которая вам подходит, обратитесь к каждой зрелой программе для практики.

Если эта статья была вам полезна, ставьте лайк ( ̄▽ ̄)"

Серия статей:

Добро пожаловать в публичный аккаунт:

[Уведомление об авторских правах]
Эта статья была опубликована вБлог Пак Жуцин, перепечатка для некоммерческого использования разрешена, но перепечатка должна сохранить оригинального автораПарк Жуйцини ссылка:blog.piaoruiqing.com. Если есть какие-либо переговоры или сотрудничество с точки зрения авторизации, пожалуйста, свяжитесь с адресом электронной почты:piaoruiqing@gmail.com.