{"id":15674023,"url":"https://github.com/naxa777/spring-cloud-example","last_synced_at":"2025-05-06T22:49:32.546Z","repository":{"id":72380588,"uuid":"151472469","full_name":"naXa777/spring-cloud-example","owner":"naXa777","description":"Learning by doing: Spring Cloud","archived":false,"fork":false,"pushed_at":"2019-03-06T20:38:13.000Z","size":117,"stargazers_count":14,"open_issues_count":6,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-06T22:49:21.706Z","etag":null,"topics":["eureka","gradle-wrapper","hacktoberfest","hacktoberfest2023","hystrix-dashboard","hystrix-dashboard-turbine","kotlin","kotlin-demo","kotlin-examples","kotlin-spring-boot","microservices","microservices-demo","multimodule-kotlin-app","spring-boot-2","spring-boot-test","spring-cloud","spring-cloud-demo","spring-cloud-example","spring-cloud-netflix","turbine"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/naXa777.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-03T19:57:38.000Z","updated_at":"2023-10-17T11:09:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"626128ba-70a2-4363-96a0-ca164dd5cfff","html_url":"https://github.com/naXa777/spring-cloud-example","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naXa777%2Fspring-cloud-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naXa777%2Fspring-cloud-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naXa777%2Fspring-cloud-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naXa777%2Fspring-cloud-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/naXa777","download_url":"https://codeload.github.com/naXa777/spring-cloud-example/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252782464,"owners_count":21803380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["eureka","gradle-wrapper","hacktoberfest","hacktoberfest2023","hystrix-dashboard","hystrix-dashboard-turbine","kotlin","kotlin-demo","kotlin-examples","kotlin-spring-boot","microservices","microservices-demo","multimodule-kotlin-app","spring-boot-2","spring-boot-test","spring-cloud","spring-cloud-demo","spring-cloud-example","spring-cloud-netflix","turbine"],"created_at":"2024-10-03T15:43:25.640Z","updated_at":"2025-05-06T22:49:32.540Z","avatar_url":"https://github.com/naXa777.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Spring Cloud Example\n\n[![Статус сборки](https://travis-ci.com/naXa777/spring-cloud-example.svg?branch=master\u0026style=flat)](https://travis-ci.com/naXa777/spring-cloud-example)\n\nЭта открытая площадка предназначена для изучения [Spring Cloud](http://spring-projects.ru/projects/spring-cloud/) и [Kotlin](https://kotlinlang.ru/) на примерах.\n\nЧитать на других языках: \n* [In English](readme-translations/README.en.md)\n* [Bahasa Indonesia](readme-translations/README.id.md)\n* [In het Nederlands](readme-translations/README.nl.md)\n* [Em Português](readme-translations/README.br.md)\n\n## Вклад\n\n\u0026#x1F49A; Начните с известных проблем в [баг-трекере](https://github.com/naXa777/spring-cloud-example/issues).\n\n## Описание\n\n\u003e [Cloud-native](https://pivotal.io/de/cloud-native) - это подход к разработке приложений, который использует преимущества облачных вычислений и виртуализации инфраструктуры.\n\n\u003e Архитектурный стиль [микросервисов](https://pivotal.io/microservices) — это подход, при котором единое приложение строится как набор небольших сервисов, каждый из которых работает в собственном процессе и коммуницирует с остальными используя легковесные механизмы, как правило HTTP. Эти сервисы построены вокруг бизнес-потребностей и развертываются независимо с использованием полностью автоматизированной среды. Существует абсолютный минимум централизованного управления этими сервисами. Сами по себе эти сервисы могут быть написаны на разных языках и использовать разные технологии хранения данных.\n\n[(c) vkhorikov / Хабр](https://habr.com/post/249183/)\n\nМы разбиваем большие монолитные приложения на кусочки, называемые \"сервисами\". И каждый из сервисов может разворачиваться и масштабироваться независимо от других. \n_Как сервисы находят друг друга?_\n\n### Service Discovery\n\n|      Модуль      |          URL              |\n| :--------------: | :-----------------------: |\n| discovery-server | `http://host:8761/eureka` |\n\nВ Spring Cloud есть несколько способов обнаружения сервисов:\n\n* Spring Cloud [Consul](https://cloud.spring.io/spring-cloud-consul/)\n* Spring Cloud [Zookeeper](https://cloud.spring.io/spring-cloud-zookeeper/)\n* Spring Cloud [Netflix](https://cloud.spring.io/spring-cloud-netflix/)\n\nДанный проект уделяет основное внимание последнему из них - Spring Cloud Netflix. Американский гигант потокового телевещания Netflix полностью открыл код своего микросервисного стека.\n\nРади простоты демонстрации настраивается только один экземпляр сервера Eureka. Поэтому он сконфигурирован таким образом, чтобы не регистрироваться среди пиров (других экземпляров сервера Eureka).\nСкорей всего, вам потребуется запускать одновременно несколько серверов для обнаружения (Discovery servers) для того, чтобы гарантировать высокую доступность в продакшене. Для этого измените значения следующих свойств:\n\n    eureka.client.register-with-eureka=true\n    eureka.client.fetch-registry=true    \n\n#### Высокая доступность\n\nEureka постоянно проверяет, что сервисы, которые она возвращает клиентам, доступны и оперируют нормально. А также гарантирует, что в случае, если Discovery Server на какое-то время перестанет быть доступным, клиенты продолжат работать без него.\n\nEureka была разработана с учётом высокой доступности:\n\n * Реестр сервисов является распределённым (кэшируется на каждом клиенте).\n * Клиенты _могут_ оперировать без Discovery сервера.\n * Клиенты получают дельты изменений, чтобы обновить реестр.\n\n#### Приборная панель\n\nПриборная панель Eureka (aka панель управления, dashboard) включена по умолчанию. Она показывает полезную информацию о зарегистрированных сервисах.\n\nВ локальной среде доступна по адресу http://localhost:8761\n\n### Weather Service\n\n| Модуль          | URL                        |\n| :-------------: | :------------------------: |\n| weather-service | `http://host:port/weather` |\n\nАннотация `@EnableDiscoveryClient` используется, чтобы превратить приложение `WeatherServiceApplication` в клиента Discovery Server и заставить его зарегистрироваться в Discovery Server во время запуска.\n\n### Weather App\n\n| Модуль      | URL                                |\n| :---------: | :--------------------------------: |\n| weather-app | `http://host:port/current/weather` |\n\n### Datetime Service\n\n| Модуль           | URL                         |\n| :--------------: | :-------------------------: |\n| datetime-service | `http://host:port/datetime` |\n\nАннотация `@EnableDiscoveryClient` используется, чтобы превратить приложение `DatetimeServiceApplication` в клиента Discovery Server и заставить его зарегистрироваться в Discovery Server во время запуска.\n\n### Datetime App\n\n| Модуль       | URL                                 |\n| :----------: | :---------------------------------: |\n| datetime-app | `http://host:port/current/datetime` |\n\n### Client\n\n| Модуль  | URL                |\n| :-----: | :----------------: |\n| client  | `http://host:port` |\n\nАннотация `@EnableDiscoveryClient` используется, чтобы превратить приложение `ClientApplication` в клиента Discovery Server.\n\nНо клиентское приложение не регистрирует себя в Eureka, потому что нам не нужно, чтобы его кто-то обнаруживал. Поэтому свойство ниже установлено в false:\n\n    eureka.client.register-with-eureka=false\n    \n### Отказоустойчивость\n\nКогда имеешь дело с распределённой системой, можно быть абсолютно уверенным насчёт одного... ОТКАЗ НЕИЗБЕЖЕН.\n\nВ частности негативным последствием отказов в распределённой системе является каскадный отказ (cascading failure) - неисправность, вызывающая выход из строя других элементов или систем.\n\nКак правильно обработать отказ?\n\n * Проектирование под отказ.  \n    \u003e Любое обращение к сервису может не сработать из-за его недоступности. Клиент должен реагировать на это настолько терпимо, насколько возможно.\n * Изящная деградация (graceful degradation)\n    \u003e Принцип сохранения работоспособности при потере части функциональности.\n * Ограничение ресурсов\n\nШаблон \"Автоматический выключатель\" ([Circuit breaker design pattern](https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern)) - шаблон проектирования, применяемый в разработке современного ПО. Используется для обнаружения отказов и инкапсулирует логику предотвращения повторного возникновения отказа.\n\n#### Hystrix\n\n[Netflix Hystrix](https://github.com/Netflix/Hystrix) - ...\n\nСм. [Как это работает?](https://github.com/Netflix/Hystrix/wiki/How-it-Works)\n\n#### Приборная панель Hystrix\n\n| Модуль             | URL                        |\n| :----------------: | :------------------------: |\n| hystrix-dashboard  | `http://host:port/hystrix` |\n\nДокументация: [Circuit Breaker: Hystrix Dashboard](https://cloud.spring.io/spring-cloud-static/Edgware.SR4/multi/multi__circuit_breaker_hystrix_dashboard.html)\u003csup\u003e(на англ.)\u003c/sup\u003e\n\n#### Turbine\n\n| Module   | URL                               |\n| :------: | :-------------------------------: |\n| turbine  | `http://host:3000/turbine.stream` |\n\nПриборная панель Hystrix позволяет отслеживать только один микросервис. Если у вас много микросервисов, приходится переключаться между ними в панели, вручную меняя эндпойнт для сбора метрики. Это довольно утомительное занятие.\n\nTurbine (проект Spring Cloud Netflix) собирает потоки (streams) с метриками из нескольких экземпляров Hystrix и преобразовывает их в единый поток таким образом, чтобы в приборной панели Hystrix был доступен агрегированный вид.\n\nПример конфигурации:\n\n    turbine.app-config=weather-app,datetime-app\n    turbine.cluster-name-expression='default'\n\n## Собираем и запускаем локально\n\n### Подготовка\n\nПеред первой сборкой приложения необходимо предпринять несколько дополнительных шагов.\n\n 1. клонировать репозиторий.\n 2. определить несколько переменных окружения.\n 3. \u0026#x1F4D7; _TODO_\n\nВы обладаете свободой выбора средства для сборки этого проекта: [Gradle](https://gradle.org/) или любимая среда разработки.\n[IntelliJ IDEA](https://spring.io/guides/gs/intellij-idea/), [STS](https://stackoverflow.com/q/34214685/1429387) / [Eclipse](http://www.vogella.com/tutorials/EclipseGradle/article.html), или [NetBeans](https://netbeans.org/features/java/build-tools.html) должны справиться с этой задачей без проблем.\n\n### Используя обёртку Gradle\n\n    ./gradlew :discovery-server:bootRun\n    ./gradlew :weather-service:bootRun\n    ./gradlew :weather-app:bootRun\n    ./gradlew :client:bootRun\n    ./gradlew :datetime-service:bootRun\n    ./gradlew :datetime-app:bootRun\n    ./gradlew :turbine:bootRun\n    ./gradlew :hystrix-dashboard:bootRun\n\n### Используя IntelliJ IDEA\n\n1. Импортируйте корневой проект (файл build.gradle) в IntelliJ IDEA.\n2. Синхронизируйте настройки проекта с Gradle (первая синхронизация может запуститься автоматически после импорта, в таком случае дополнительных действий не требуется).\n3. После импорта и синхронизации у вас должны были появиться несколько конфигураций, по одной для каждого модуля. Запускайте их по порядку:\n    1. DiscoveryServerApplication\n    2. WeatherServiceApplication\n    3. WeatherAppApplication\n    4. ClientApplication\n    5. DatetimeServiceApplication\n    6. DatetimeAppApplication\n    7. TurbineApplication\n    8. HystrixDashboardApplication\n    \nПодсказка: убедитесь, что запускаете их на разных портах и что эти порты не заняты другими приложениями, во избежание конфликта.\n\n## Развёртывание в облаке\n\n\u0026#x1F4D7; _TODO_\n\n## Непрерывная интеграция\n\n| [Travis CI](https://travis-ci.com/) | [![Статус сборки](https://travis-ci.com/naXa777/spring-cloud-example.svg?branch=master\u0026style=flat)](https://travis-ci.com/naXa777/spring-cloud-example) |\n| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n\n## Лицензия\n\nДанный проект лицензирован на условиях [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.ru.html).\n\nНеофициальный перевод текста лицензии: [Google Code Archive](https://code.google.com/archive/p/gpl3rus/wikis/LatestRelease.wiki).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaxa777%2Fspring-cloud-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnaxa777%2Fspring-cloud-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaxa777%2Fspring-cloud-example/lists"}