GetAddressByIP — сервис по определению геолокации устройства по IP-адресу
Введение
На современном рынке достаточно много сервисов, предоставляющих возможность отслеживать текущее местоположение цифрового устройства. Сегодня, практически любая операция, связанная с передвижением объекта в пространстве, может быть зафиксирована по маршруту и времени.
Многие компании прибегают к работе с такими сервисами для контроля и оптимизации своих бизнес процессов. Польза заключается в том, что приложение всегда в курсе, где находится устройство и, в зависимости от задач, предоставляет самую актуальную информацию по запросу, либо в качестве предложения.
Оперативное построение маршрута, добавление гео-метки в контенте пользователя, поиск поблизости объектов, интересующих пользователя, необходимость изменения интерфейса приложения, исходя из информации о новом местонахождении пользователя. Все вышеперечисленное и многое другое существенно облегчает жизнь пользователю, а приложению помогает быть по-настоящему полезным.
Краткое описание проекта
У нашего заказчика существует собственный парк устройств и приложений, которые работают на этих устройствах. В определенный момент возникла необходимость определения местоположения устройства из работающего на нем приложения.
Наша команда разработала собственный Mule REST-сервис (название — GetAdressByIP), который может использовать сторонние сервисы для определения геолокации. Для случаев, когда IP-адреса устройств, на которых развернуты приложения, недоступны, IP-адрес устройства определяется с помощью HTTP/HTTPS заголовка X-Forwarded-For.
Алгоритм работы GetAdressByIP следующий:
- GetAdressByIP принимает запрос на определение местоположения. Для ограничения доступа к приложению сторонних лиц, в параметрах запроса REST-интерфейс принимает api_key — уникальный идентификатор, используемый для аутентификации вызывающей программы.
- После успешной авторизации происходит извлечение IP-адреса из HTTP(S)-заголовка запроса, а для идентификации происхождения IP-адреса пользователя, к примеру, может применятся заголовок X-Forwarded-For.
- Далее формируется и отправляется запрос на получение местоположения пользователя в стороннее API, в соответствии с заданной конфигурацией. В конфигурации указывается, какой требуется использовать сторонний сервис для определения геолокации.
- Полученный ответ в поступает обратно в GetAdressByIP, где обрабатывается и отправляется приложению клиента, от которого пришел первоначальный запрос.
Обмен данными между клиентом и сервером производится в формате JSON. Схема работы приложения приведена на рисунке 1.
Одним из требований заказчика было минимизировать трудозатраты на этапах развертывания и тестирования. Разработчики должны максимально сконцентрироваться непосредственно на разработке программного продукта. Для выполнения данного требования был внедрен процесс Continuous Integration, Continuous Delivery (CI/CD) на базе Jenkins. На базе Jenkins автоматизировали 5 процессов:
- Сборка. Jenkins запускает сборку проекта после каждого коммита.
- Публикация. Этот расширяет версию продукта, создает новый тег в svn и делает публикацию созданного zip-архива в репозиторий Sonatype Nexus.
- Откат изменений. Если в процессе публикации произошли ошибки, этот процесс помогает выполнить откат внесенных изменений.
- Релиз. Он получает номер требуемой версии сервиса GetAdressByIP, загружает его из Nexus и развертывает на сервере Mule приложений.
- Сборка и деплой. Запускается вручную и выполняет то же самое, что и все описанные выше процессы, за исключением создания релиза. Оно предназначено для разработчика, который хочет проверить, как приложение работает на Mule сервере.
В итоге, это существенно сократило время разработчиков, которое они тратили на сборку, тестирование и деплоймент новых версий вручную.
На этапе тестирования был применен подход Data Driven Testing. Выполняемые интеграционные тесты покрывали широкий спектр кейсов.
Технологии
Stack: Mule ESB, JSON, Apache Maven, Sonatype Nexus.
Infrastructure: Jenkins, Git, Anypoint Studio.
Test Automation Libraries: MUnit.
Protocols: HTTP(S), REST.
Особенности проекта
- Сжатые сроки реализации проекта;
- Необходимость определять IP адрес как по HTTP(S)-заголовку, так и принимать его как параметр запроса (например, ?addr=123.123.123.123);
- Необходимость внедрения CI/CD.
Результат проекта
- Проект успешно реализован. Мы создали REST-интерфейс, который может работать с различными поставщиками сервиса определения адреса по IP, при этом смена поставщика не влияет на приложения, отправляющие запрос на наш сервис.
- Применена концепция CI/CD.
Достижения компании на проекте
- Основной функционал покрыт юнит-тестами.
- Многие из наших наработок по реализации Mule-решений на этом проекте послужили основой для создания статьи Лучшие практики использования Mule ESB.
Свяжитесь с нами, чтобы обсудить Ваш IT-проект