Giter VIP home page Giter VIP logo

spring-cloud-example's Introduction

Spring Cloud Example

Статус сборки

Эта открытая площадка предназначена для изучения Spring Cloud и Kotlin на примерах.

Читать на других языках:

Вклад

💚 Начните с известных проблем в баг-трекере.

Описание

Cloud-native - это подход к разработке приложений, который использует преимущества облачных вычислений и виртуализации инфраструктуры.

Архитектурный стиль микросервисов — это подход, при котором единое приложение строится как набор небольших сервисов, каждый из которых работает в собственном процессе и коммуницирует с остальными используя легковесные механизмы, как правило HTTP. Эти сервисы построены вокруг бизнес-потребностей и развертываются независимо с использованием полностью автоматизированной среды. Существует абсолютный минимум централизованного управления этими сервисами. Сами по себе эти сервисы могут быть написаны на разных языках и использовать разные технологии хранения данных.

(c) vkhorikov / Хабр

Мы разбиваем большие монолитные приложения на кусочки, называемые "сервисами". И каждый из сервисов может разворачиваться и масштабироваться независимо от других. Как сервисы находят друг друга?

Service Discovery

Модуль URL
discovery-server http://host:8761/eureka

В Spring Cloud есть несколько способов обнаружения сервисов:

Данный проект уделяет основное внимание последнему из них - Spring Cloud Netflix. Американский гигант потокового телевещания Netflix полностью открыл код своего микросервисного стека.

Ради простоты демонстрации настраивается только один экземпляр сервера Eureka. Поэтому он сконфигурирован таким образом, чтобы не регистрироваться среди пиров (других экземпляров сервера Eureka). Скорей всего, вам потребуется запускать одновременно несколько серверов для обнаружения (Discovery servers) для того, чтобы гарантировать высокую доступность в продакшене. Для этого измените значения следующих свойств:

eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true    

Высокая доступность

Eureka постоянно проверяет, что сервисы, которые она возвращает клиентам, доступны и оперируют нормально. А также гарантирует, что в случае, если Discovery Server на какое-то время перестанет быть доступным, клиенты продолжат работать без него.

Eureka была разработана с учётом высокой доступности:

  • Реестр сервисов является распределённым (кэшируется на каждом клиенте).
  • Клиенты могут оперировать без Discovery сервера.
  • Клиенты получают дельты изменений, чтобы обновить реестр.

Приборная панель

Приборная панель Eureka (aka панель управления, dashboard) включена по умолчанию. Она показывает полезную информацию о зарегистрированных сервисах.

В локальной среде доступна по адресу http://localhost:8761

Weather Service

Модуль URL
weather-service http://host:port/weather

Аннотация @EnableDiscoveryClient используется, чтобы превратить приложение WeatherServiceApplication в клиента Discovery Server и заставить его зарегистрироваться в Discovery Server во время запуска.

Weather App

Модуль URL
weather-app http://host:port/current/weather

Datetime Service

Модуль URL
datetime-service http://host:port/datetime

Аннотация @EnableDiscoveryClient используется, чтобы превратить приложение DatetimeServiceApplication в клиента Discovery Server и заставить его зарегистрироваться в Discovery Server во время запуска.

Datetime App

Модуль URL
datetime-app http://host:port/current/datetime

Client

Модуль URL
client http://host:port

Аннотация @EnableDiscoveryClient используется, чтобы превратить приложение ClientApplication в клиента Discovery Server.

Но клиентское приложение не регистрирует себя в Eureka, потому что нам не нужно, чтобы его кто-то обнаруживал. Поэтому свойство ниже установлено в false:

eureka.client.register-with-eureka=false

Отказоустойчивость

Когда имеешь дело с распределённой системой, можно быть абсолютно уверенным насчёт одного... ОТКАЗ НЕИЗБЕЖЕН.

В частности негативным последствием отказов в распределённой системе является каскадный отказ (cascading failure) - неисправность, вызывающая выход из строя других элементов или систем.

Как правильно обработать отказ?

  • Проектирование под отказ.

    Любое обращение к сервису может не сработать из-за его недоступности. Клиент должен реагировать на это настолько терпимо, насколько возможно.

  • Изящная деградация (graceful degradation)

    Принцип сохранения работоспособности при потере части функциональности.

  • Ограничение ресурсов

Шаблон "Автоматический выключатель" (Circuit breaker design pattern) - шаблон проектирования, применяемый в разработке современного ПО. Используется для обнаружения отказов и инкапсулирует логику предотвращения повторного возникновения отказа.

Hystrix

Netflix Hystrix - ...

См. Как это работает?

Приборная панель Hystrix

Модуль URL
hystrix-dashboard http://host:port/hystrix

Документация: Circuit Breaker: Hystrix Dashboard(на англ.)

Turbine

Module URL
turbine http://host:3000/turbine.stream

Приборная панель Hystrix позволяет отслеживать только один микросервис. Если у вас много микросервисов, приходится переключаться между ними в панели, вручную меняя эндпойнт для сбора метрики. Это довольно утомительное занятие.

Turbine (проект Spring Cloud Netflix) собирает потоки (streams) с метриками из нескольких экземпляров Hystrix и преобразовывает их в единый поток таким образом, чтобы в приборной панели Hystrix был доступен агрегированный вид.

Пример конфигурации:

turbine.app-config=weather-app,datetime-app
turbine.cluster-name-expression='default'

Собираем и запускаем локально

Подготовка

Перед первой сборкой приложения необходимо предпринять несколько дополнительных шагов.

  1. клонировать репозиторий.
  2. определить несколько переменных окружения.
  3. 📗 TODO

Вы обладаете свободой выбора средства для сборки этого проекта: Gradle или любимая среда разработки. IntelliJ IDEA, STS / Eclipse, или NetBeans должны справиться с этой задачей без проблем.

Используя обёртку Gradle

./gradlew :discovery-server:bootRun
./gradlew :weather-service:bootRun
./gradlew :weather-app:bootRun
./gradlew :client:bootRun
./gradlew :datetime-service:bootRun
./gradlew :datetime-app:bootRun
./gradlew :turbine:bootRun
./gradlew :hystrix-dashboard:bootRun

Используя IntelliJ IDEA

  1. Импортируйте корневой проект (файл build.gradle) в IntelliJ IDEA.
  2. Синхронизируйте настройки проекта с Gradle (первая синхронизация может запуститься автоматически после импорта, в таком случае дополнительных действий не требуется).
  3. После импорта и синхронизации у вас должны были появиться несколько конфигураций, по одной для каждого модуля. Запускайте их по порядку:
    1. DiscoveryServerApplication
    2. WeatherServiceApplication
    3. WeatherAppApplication
    4. ClientApplication
    5. DatetimeServiceApplication
    6. DatetimeAppApplication
    7. TurbineApplication
    8. HystrixDashboardApplication

Подсказка: убедитесь, что запускаете их на разных портах и что эти порты не заняты другими приложениями, во избежание конфликта.

Развёртывание в облаке

📗 TODO

Непрерывная интеграция

Travis CI Статус сборки

Лицензия

Данный проект лицензирован на условиях GNU GPL v3.

Неофициальный перевод текста лицензии: Google Code Archive.

spring-cloud-example's People

Contributors

duskmirage avatar fpkmatthi avatar myakiju avatar naxa777 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

spring-cloud-example's Issues

Improve README

Improve README.md and/or README.en.md. Or add a new README in your own language.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.