1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xueshiqing-PiggyMetrics

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README 29 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 07:14 a546659
### Piggy Metrics
**Простой способ разобраться с личными финансами**
## Использование shell для запуска всех компонентов — 18.3.2
### Предварительная работа
1. **Создание образов:**
* gateway: последний, a532a250efa1, 6 недель назад, размер 349 МБ;
* monitoring: последний, 1d4485f6c5ed, 6 недель назад, размер 352 МБ;
* notification-service: последний, a7b696ecf66a, 6 недель назад, размер 355 МБ;
* statistics-service: последний, 2464eaa4a1d7, 6 недель назад, размер 354 МБ;
* account-service: последний, fb3dcff48ff4, 6 недель назад, размер 354 МБ;
* auth-service: последний, 1bbbc17418ff, 6 недель назад, размер 350 МБ;
* account-mongo-service: последний, 2b0b84d3d8a1, 6 недель назад, размер 642 МБ;
* registry: последний, 216c1f736617, 6 недель назад, размер 348 МБ;
* config: последний, c3e41d5ae3c7, 6 недель назад, размер 333 МБ;
* rabbitmq: последний, 5a8b7f36d59f, 7 недель назад, размер 151 МБ;
* docker-base: последний, 17a1ba013238, 2 месяца назад, размер 100 МБ;
* redis: версия 3, 1200574c8af9, 2 месяца назад, размер 366 МБ;
* rabbitmq: версия 3-management, 6cb6e2f951a8, 2 месяца назад, размер 151 МБ;
* statistics-mongo-service: последний, 17a1ba013238, 2 месяца назад, размер 100 МБ;
* notification-mongo-service: последний, 17a1ba013238, 2 месяца назад, размер 100 МБ.
Все эти образы находятся в каталоге docker на узле yarn-node1 и имеют соответствующие имена. Рекомендуется использовать yarn-node1 напрямую, так как там есть JDK, который не был добавлен в git.
2. **Настройка среды:**
* STATISTICS_SERVICE_PASSWORD = root;
* MONGODB_PASSWORD = root;
* ACCOUNT_SERVICE_PASSWORD = root;
* NOTIFICATION_SERVICE_PASSWOR = root;
* CONFIG_SERVICE_PASSWORD = root;
* REDIS_IP = 192.168.4.201 (адрес redis);
* HOST_IP = 192.168.4.201 (IP хост-машины).
root — это пароль, который можно установить произвольно, но важно сохранить его согласованность.
### Шаги по запуску:
Обратите внимание, что все IP-адреса, начинающиеся с 192, должны быть заменены на собственные.
1. Запустите redis:
docker run -d --name redis -p 6379:6379 redis.
1. Запустите rabbitmq:
docker run -d -p 5672:5672 -p 15672:15672 --name=rabbitmq rabbitmq:3-management.
Проверьте, успешно ли запущен rabbitmq, посетив ip:15672/.
2. Запустите config — сервер конфигурации:
docker run -d -p 8888:8888 -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} --name=config config.
Убедитесь, что файл конфигурации успешно прочитан, посетив ip:8888/gateway/default.
3. Запустите eureka — реестр:
docker run -d -p 8761:8761 -e REGISTRY_PORT=8761 -e CONFIG_PORT=8888 -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} --add-host config:192.168.1.191 --add-host registry:192.168.1.191 --name=registry registry.
Посетите ip:8761 для проверки.
4. Запустите auth-service:
docker run -d -p 5000:5000 -e SERVICE_PORT=5000 -e AUTH_SERVICE_PORT=5000 -e HOST_IP=192.168.1.191 -e REDIS_IP=${REDIS_IP} -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} -e NOTIFICATION_SERVICE_PASSWORD=${NOTIFICATION_SERVICE_PASSWORD} -e STATISTICS_SERVICE_PASSWORD=${STATISTICS_SERVICE_PASSWORD} -e ACCOUNT_SERVICE_PASSWORD=${ACCOUNT_SERVICE_PASSWORD} -e MONGODB_PASSWORD=${MONGODB_PASSWORD} --add-host config:192.168.1.191 -e CONFIG_PORT=8888 --add-host registry:192.168.1.191 -e REGISTRY_PORT=8761 --name=auth-service auth-service.
Проверка выполняется через mongo 192.168.4.201/piggymetrics -u user -p root.
5. Запустите account-mongo-service:
docker run -d -p 7777:7777 -e SERVICE_PORT=7777 -e HOST_IP=192.168.1.191 -e REDIS_IP=${REDIS_IP} -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} -e INIT_DUMP=/account-service-dump.js -e NOTIFICATION_SERVICE_PASSWORD=${NOTIFICATION_SERVICE_PASSWORD} -e... **Инструкция по запуску сервисов**
1. Установить переменные окружения:
* STATISTICS_SERVICE_PASSWORD;
* ACCOUNT_SERVICE_PASSWORD;
* MONGODB_PASSWORD.
2. Запустить сервис account-mongo-service:
```
docker run -d --name=account-mongo-service account-mongo-service
```
3. Проверить регистрацию сервиса можно через панель Eureka.
4. Запустить service account-service:
```
docker run -d -p 6000:6000 -e SERVICE_PORT=6000 \
-e HOST_IP=192.168.1.191 -e REDIS_IP=${REDIS_IP} \
-e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} \
-e ACCOUNT_SERVICE_PASSWORD=${ACCOUNT_SERVICE_PASSWORD} \
-e MONGODB_PASSWORD=${MONGODB_PASSWORD} --add-host config:192.168.1.191 \
-e CONFIG_PORT=8888 --add-host registry:192.168.1.191 \
-e REGISTRY_PORT=8761 --add-host rabbitmq:192.168.1.191 \
-e RABBITMQ_PORT=5672 --add-host auth-service:192.168.1.191 \
-e AUTH_SERVICE_PORT=5000 --name=account-service account-service
```
5. Проверить регистрацию сервиса через панель Eureka.
6. Запустить gateway:
```
docker run -d -p 4000:4000 -e SERVICE_PORT=4000 -e HOST_IP=192.168.1.191 \
-e REDIS_IP=${REDIS_IP} -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} \
--add-host config:192.168.1.191 -e CONFIG_PORT=8888 \
--add-host registry:192.168.1.191 -e REGISTRY_PORT=8761 \
--add-host auth-service:192.168.1.191 -e AUTH_SERVICE_PORT=5000 \
--name=gateway gateway
```
7. Обратиться к сервису по адресу ip:4000.
8. Запустить statistics-mongo-service:
```
docker run -d -p 7778:7778 -e SERVICE_PORT=7778 -e HOST_IP=192.168.1.191 \
-e REDIS_IP=${REDIS_IP} -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} \
-e NOTIFICATION_SERVICE_PASSWORD=${NOTIFICATION_SERVICE_PASSWORD} \
-e STATISTICS_SERVICE_PASSWORD=${STATISTICS_SERVICE_PASSWORD} \
-e ACCOUNT_SERVICE_PASSWORD=${ACCOUNT_SERVICE_PASSWORD} \
-e MONGODB_PASSWORD=${MONGODB_PASSWORD} --add-host config:192.168.1.191 \
-e CONFIG_PORT=8888 --add-host registry:192.168.1.191 -e REGISTRY_PORT=8761 \
--add-host rabbitmq:192.168.1.191 -e RABBITMQ_PORT=5672 \
--add-host auth-service:192.168.1.191 -e AUTH_SERVICE_PORT=5000 \
--name=statistics-mongo-service statistics-mongo-service
```
9. Проверить регистрацию сервиса через панель Eureka.
10. Запустить statistics-service:
```
docker run -d -p 7000:7000 -e SERVICE_PORT=7000 -e HOST_IP=192.168.1.191 \
-e REDIS_IP=${REDIS_IP} -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} \
-e STATISTICS_SERVICE_PASSWORD=${STATISTICS_SERVICE_PASSWORD} \
-e MONGODB_PASSWORD=${MONGODB_PASSWORD} --add-host config:192.168.1.191 \
-e CONFIG_PORT=8888 --add-host registry:192.168.1.191 -e REGISTRY_PORT=8761 \
--add-host auth-service:192.168.1.191 -e AUTH_SERVICE_PORT=5000 \
--add-host rabbitmq:192.168.1.191 -e RABBITMQ_PORT=5672 \
--name=statistics-service statistics-service
```
11. Проверить регистрацию сервиса через панель Eureka.
12. Запустить notification-mongo-service:
```
docker run -d -p 7779:7779 -e SERVICE_PORT=7779 -e HOST_IP=192.168.1.191 \
-e REDIS_IP=${REDIS_IP} -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} \
-e NOTIFICATION_SERVICE_PASSWORD=${NOTIFICATION_SERVICE_PASSWORD} \
-e STATISTICS_SERVICE_PASSWORD=${STATISTICS_SERVICE_PASSWORD} \
-e ACCOUNT_SERVICE_PASSWORD=${ACCOUNT_SERVICE_PASSWORD} \
-e MONGODB_PASSWORD=${MONGODB_PASSWORD} --add-host config:192.168.1.191 \
-e CONFIG_PORT=8888 --add-host registry:192.168.1.191 -e REGISTRY_PORT=8761 \
--add-host rabbitmq:192.168.1.191 -e RABBITMQ_PORT=5672 \
--add-host auth-service:192.168.1.191 -e AUTH_SERVICE_PORT=5000 \
--name=notification-mongo-service notification-mongo-service
```
13. Проверить регистрацию сервиса через панель Eureka.
14. Запустить notification-service:
```
docker run -d -p 8000:8000 -e SERVICE_PORT=8000 -e HOST_IP=192.168.1.191 \
-e REDIS_IP=${REDIS_IP} -e CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} \
-e NOTIFICATION_SERVICE_PASSWORD=${NOTIFICATION_SERVICE_PASSWORD} \
-e MONGODB_PASSWORD=${MONGODB_PASSWORD} --add-host config:192.168.1.191 \
-e CONFIG_PORT=8888 --add-host registry:192.168.1.191 -e REGISTRY_PORT=8761 \
--add-host auth-service:192.168.1.191 -e AUTH_SERVICE_PORT=5000 \
--add-host rabbitmq:192.168.1.191 -e RABBITMQ_PORT=5672 \
--name=notification-service notification-service
```
15. Проверить регистрацию сервиса через панель Eureka.
16. Запустить monitoring:
```
docker run -d -p 8989:8989 -p 8080:8080 -e HOST_IP=192.168.1.191
``` **CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD} --add-host config:192.168.1.191 -e CONFIG_PORT=8888 --add-host registry:192.168.1.191 -e REGISTRY_PORT=8761 --add-host rabbitmq:192.168.1.191 -e RABBITMQ_PORT=5672 --name=monitoring monitoring**
*Через http://192.168.1.191:8080/hystrix в адресной строке введите http://192.168.1.191:8989 для просмотра мониторинга //todo здесь есть сопоставление портов, не знаю, как это будет выглядеть?*
Это приложение [proof-of-concept](http://my-piggymetrics.rhcloud.com), которое демонстрирует архитектуру микросервисной архитектуры с использованием Spring Boot, Spring Cloud и Docker.
Кстати, с довольно аккуратным пользовательским интерфейсом.
**Piggy Metrics**
## Функциональные сервисы
PiggyMetrics был разбит на три основных микросервиса. Все они являются независимо развертываемыми приложениями, организованными вокруг определенных бизнес-доменов.
#### Сервис учётных записей
Содержит общую логику ввода и проверки данных пользователя: элементы доходов/расходов, сбережения и настройки учётной записи.
| Метод | Путь | Описание | Аутентифицированный пользователь | Доступно из UI |
| --- | --- | --- | --- | ---|
| GET | /accounts/{account} | Получить указанные данные учетной записи | Нет | Нет |
| GET | /accounts/current | Получить текущие данные учетной записи | Да | Нет |
| GET | /accounts/demo | Получить данные демонстрационной учетной записи (предварительно заполненные доходы/расходы и т.д.) | Нет | Да |
| PUT | /accounts/current | Сохранить текущие данные учетной записи | Да | Нет |
| POST | /accounts/ | Зарегистрировать новую учетную запись | Нет | Нет |
#### Статистический сервис
Выполняет расчеты по основным статистическим параметрам и фиксирует временные ряды для каждой учетной записи. Точка данных содержит значения, нормализованные к базовой валюте и периоду времени. Эти данные используются для отслеживания динамики денежных потоков за время существования учетной записи.
| Метод | Путь | Описание | Аутентифицированный пользователь | Доступно из UI |
| --- | --- | --- | --- | ---|
| GET | /statistics/{account} | Получить указанную статистику учетной записи | Нет | Нет |
| GET | /statistics/current | Получить текущую статистику учетной записи | Да | Нет |
| GET | /statistics/demo | Получить демографическую статистику учетной записи | Нет | Да |
| PUT | /statistics/{account} | Создать или обновить точку данных временного ряда для указанной учетной записи | Нет | Нет |
#### Служба уведомлений
Хранит контактную информацию пользователей и настройки уведомлений (например, частоту напоминаний и резервного копирования). Запланированный работник собирает необходимую информацию от других служб и отправляет электронные письма подписчикам.
| Метод | Путь | Описание | Аутентифицированный пользователь | Доступно из UI |
| --- | --- | --- | --- |---|
| GET | /notifications/settings/current | Получить настройки уведомлений текущей учетной записи | Да | Нет |
| PUT | /notifications/settings/current | Сохранить настройки уведомлений текущей учетной записи | Да | Нет |
#### Примечания
- Каждый микросервис имеет свою собственную базу данных, поэтому нет возможности обойти API и получить прямой доступ к данным персистентности.
- В этом проекте я использую MongoDB в качестве основной базы данных для каждого сервиса. Также может иметь смысл иметь архитектуру полиглотной персистентности (выбрать тип БД, который лучше всего подходит для требований сервиса).
- Взаимодействие между сервисами довольно упрощено: микросервисы общаются только через синхронный REST API. Обычная практика в реальных системах заключается в использовании комбинации стилей взаимодействия. Например, выполните синхронный запрос GET для получения данных и используйте асинхронный подход через брокера сообщений для операций создания/обновления, чтобы разделить службы и буферизовать сообщения. Однако это приводит нас к миру [согласованности в конечном счете](http://martinfowler.com/articles/microservice-trade-offs.html#consistency).
## Инфраструктурные сервисы
Существует множество общих... **Ribbon**
Ribbon — это балансировщик нагрузки на стороне клиента, который предоставляет широкие возможности управления поведением HTTP и TCP-клиентов. В отличие от традиционного балансировщика нагрузки, здесь нет необходимости в дополнительном переходе для каждого вызова по сети — вы можете напрямую обращаться к нужному сервису.
Из коробки он интегрируется с Spring Cloud и Service Discovery. Eureka Client предоставляет динамический список доступных серверов, чтобы Ribbon мог балансировать между ними.
**Hystrix**
Hystrix — это реализация шаблона Circuit Breaker, который позволяет контролировать задержку и сбои зависимостей, доступных через сеть. Основная идея заключается в том, чтобы предотвратить каскадные сбои в распределённой среде с большим количеством микросервисов. Это помогает быстро выйти из строя и восстановиться как можно скорее — важные аспекты отказоустойчивых систем, которые самовосстанавливаются.
Помимо контроля за прерывателем цепи, Hystrix позволяет добавить резервный метод, который будет вызываться для получения значения по умолчанию в случае сбоя основной команды.
Кроме того, Hystrix генерирует метрики о результатах выполнения и задержке для каждой команды, которые мы можем использовать для мониторинга поведения системы.
**Feign**
Feign — это декларативный клиент Http, который легко интегрируется с Ribbon и Hystrix. Фактически, с одной зависимостью spring-cloud-starter-feign и аннотацией @EnableFeignClients у вас есть полный набор балансировщика нагрузки, прерывателя цепи и клиента Http с разумной готовой конфигурацией по умолчанию.
Вот пример из Account Service:
``` java
@FeignClient(name = "statistics-service")
public interface StatisticsServiceClient {
@RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
void updateStatistics(@PathVariable("accountName") String accountName, Account account);
}
```
— Всё, что вам нужно, — это просто интерфейс;
— Вы можете разделить часть @RequestMapping между контроллером Spring MVC и методами Feign;
— Приведённый выше пример определяет только желаемый идентификатор службы — statistics-service, благодаря автообнаружению через Eureka (но, очевидно, вы можете получить доступ к любому ресурсу с определённым URL).
### Монитор приборной панели
В конфигурации этого проекта каждый микросервис с Hystrix на борту отправляет метрики в Turbine через Spring Cloud Bus (с AMQP-брокером). Проект Monitoring представляет собой небольшое приложение Spring boot с Turbine и Hystrix Dashboard.
Смотрите ниже, как его запустить.
Давайте посмотрим на поведение нашей системы под нагрузкой: служба учётных записей вызывает службу статистики, и она отвечает с различной имитацией задержки. Порог тайм-аута ответа установлен на 1 секунду.
<img width="880" src="https://cloud.githubusercontent.com/assets/6069066/14194375/d9a2dd80-f7be-11e5-8bcc-9a2fce753cfe.png">
| 0 мс задержки | 500 мс задержки | 800 мс задержки | 1100 мс задержки |
| --- | --- | --- | --- |
| Хорошо работающая система. Пропускная способность составляет около 22 запросов в секунду. Небольшое количество активных потоков в службе статистики. Среднее время обслуживания составляет около 50 мс. | Количество активных потоков растёт. Мы видим фиолетовое число отказов пула потоков и, следовательно, примерно 30–40% ошибок, но цепь всё ещё закрыта. | Полуоткрытое состояние: отношение неудачных команд превышает 50%, | **Срабатывает прерыватель цепи.** По истечении времени окна ожидания, следующий запрос пропускается. | 100 процентов запросов завершаются неудачно. Цепь теперь постоянно разомкнута. Повторная попытка после времени ожидания не замкнёт цепь снова, потому что одиночный запрос слишком медленный.
### Анализ журнала
Централизованное ведение журнала может быть очень полезным при попытке выявить проблемы в распределённой среде. Стек Elasticsearch, Logstash и Kibana позволяет легко искать и анализировать журналы, данные об использовании и сетевой активности.
Готовая к использованию конфигурация Docker описана [в другом моём проекте](http://github.com/sqshq/ELK-docker).
## Безопасность
Расширенная конфигурация безопасности выходит за рамки этого проекта, представляющего собой доказательство концепции. Для более реалистичного моделирования реальной системы рассмотрите возможность использования https, хранилища ключей JCE для шифрования паролей микросервисов и содержимого свойств конфигурационного сервера (подробности см. в [документации](http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_security)).
## Автоматизация инфраструктуры
Развёртывание микросервисов с их взаимозависимостью — гораздо более сложный процесс, чем развёртывание монолитного приложения. Важно иметь полностью автоматизированную инфраструктуру. Мы можем достичь следующих преимуществ с помощью подхода непрерывной доставки:
* Возможность выпускать программное обеспечение в любое время.
* Любой билд может стать релизом.
* Создавать артефакты сборки один раз — развёртывать по мере необходимости.
Вот простой рабочий процесс непрерывной доставки, реализованный в этом проекте:
<img width="880" src="https://cloud.githubusercontent.com/assets/6069066/14159789/0dd7a7ce-f6e9-11e5-9fbb-a7fe0f4431e3.png">
В этой [конфигурации](https://github.com/sqshq/PiggyMetrics/blob/master/.travis.yml) Travis CI создаёт помеченные образы для каждого успешного git push. Таким образом, для каждого микросервиса на [Docker Hub](https://hub.docker.com/r/sqshq/) всегда есть образ `latest`, а также старые образы, помеченные хэшем коммита git. Легко развернуть любой из них и быстро откатиться назад, если это необходимо.
## Как всё запустить?
Имейте в виду, что вам придётся запустить 8 приложений Spring Boot, 4 экземпляра MongoDB и RabbitMq. Убедитесь, что у вас доступно 4 Гб оперативной памяти на вашем компьютере. Вы всегда можете запустить только жизненно важные службы: шлюз, реестр, конфигурационный сервер, сервис аутентификации и сервис учётных записей.
#### Перед запуском:
* Установите Docker и Docker Compose.
* Экспортируйте переменные среды: `CONFIG_SERVICE_PASSWORD`, `NOTIFICATION_SERVICE_PASSWORD`, `STATISTICS_SERVICE_PASSWORD`, `ACCOUNT_SERVICE_PASSWORD`, `MONGODB_PASSWORD` (убедитесь, что они были экспортированы: `printenv`).
* Обязательно соберите проект: `mvn package [-DskipTests]`.
#### Режим производства
В этом режиме все последние образы будут извлечены из Docker Hub. Просто скопируйте `docker-compose.yml` и запустите `docker-compose up`.
#### Режим разработки
Если вы хотите создавать образы самостоятельно (например, с некоторыми изменениями в коде), вам нужно клонировать весь репозиторий и собрать артефакты с помощью maven. Затем запустите `docker-compose -f docker-compose.yml -f docker-compose.dev.yml up`.
`docker-compose.dev.yml` наследует `docker-compose.yml`, но также предоставляет возможность локального создания образов и открытия всех портов контейнеров для удобства разработки.
#### Важные конечные точки:
* http://localhost:80 — шлюз.
* http://localhost:8761 — панель управления Eureka.
* http://localhost:9000/hystrix — панель мониторинга Hystrix (вставьте ссылку на поток турбины в форму).
* http://localhost:8989 — поток турбины (источник для панели мониторинга Hystrix).
* http://localhost:15672 — управление RabbitMq (по умолчанию логин/пароль: guest/guest).
#### Примечания
Все приложения Spring Boot требуют уже запущенного [Config Server](https://github.com/sqshq/PiggyMetrics#config-service) для запуска. Но мы можем запустить все контейнеры одновременно благодаря опции `depends_on` в docker-compose.
Кроме того, механизму обнаружения служб требуется некоторое время после запуска всех приложений. Любая служба недоступна для обнаружения клиентами до тех пор, пока экземпляр, сервер Eureka и клиент не получат одинаковые метаданные в своём локальном кэше, поэтому это может занять 3 такта пульса. Период пульса по умолчанию составляет 30 секунд.
## Обратная связь приветствуется ПиггиМетрикс имеет открытый исходный код, и мы будем очень признательны за вашу помощь. Не стесняйтесь обращаться ко мне с любыми вопросами.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/xueshiqing-PiggyMetrics.git
git@api.gitlife.ru:oschina-mirror/xueshiqing-PiggyMetrics.git
oschina-mirror
xueshiqing-PiggyMetrics
xueshiqing-PiggyMetrics
master