Рубрики
Без рубрики

Микросервисы Java с конфигурацией Spring Cloud и хипстером

В этом руководстве показано, как создать архитектуру микросервисов с помощью Spring Boot и конфигурации Spring Cloud с помощью JHipster. С пометкой “учебник”, “java”, “микросервисы”, “хипстер”.

Разработка микросервисной архитектуры с использованием Java и Spring Boot в наши дни довольно популярна. Это определенно одна из самых популярных комбинаций в экосистеме Java. Если вам нужны какие-либо доказательства, просто посмотрите на все подобные фреймворки, появившиеся за последние несколько лет: MicroProfile, Micronaut и Quarkus, и это лишь некоторые из них.

Spring Boot придал столь необходимую искру экосистеме Spring, когда она была впервые выпущена в 2014 году. Вместо того, чтобы заставлять разработчиков Java настраивать все аспекты своих компонентов Spring, он предоставлял “стартеры”, которые содержали предварительно настроенные компоненты с настройками по умолчанию. Это привело к меньшему количеству кода Java, а также предоставило возможность переопределять значения по умолчанию с помощью файла application.properties . Да, есть много способов изменить значения по умолчанию в приложении Spring Boot, но я пока опущу это.

В предыдущем уроке по микросервисам Java с Spring Boot и Spring Cloud я показал, как вы можете использовать OAuth 2.0 и OpenID Connect для обеспечения безопасности всего. Одна из проблем в этом примере заключается в том, что вам необходимо настроить свойства OIDC в каждом приложении. Это может быть настоящей болью, если у вас сотни микросервисов. Да, вы могли бы определить их как переменные среды, и это решило бы проблему. Однако, если у вас разные стеки микросервисов, использующие разные идентификаторы клиентов OIDC, этот подход будет затруднен.

Микросервисы Java с конфигурацией Spring Cloud

Spring Cloud Config – это проект, который предоставляет внешнюю конфигурацию для распределенных систем. Конфигурация Spring Cloud состоит из серверных и клиентских компонентов. Вы можете настроить сервер так, чтобы он считывал свою конфигурацию из файловой системы или хранилища исходного кода, например Git. На клиенте вы настраиваете вещи в файле конфигурации начальной загрузки, чтобы получать данные конфигурации с сервера. В среде микросервисов это обеспечивает элегантный способ настройки все ваши микросервисы из центрального расположения.

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

Используйте JHipster для создания архитектуры микросервисов Java

JHipster – это платформа разработки для создания, разработки и развертывания приложений Spring Boot + { Angular, React или Vue }. Кроме того, он поддерживает создание микросервисных архитектур на основе Spring. Фактически, если вы создадите проекты микросервисов и выберете OAuth 2.0/OIDC для аутентификации, вы будете использовать код, очень похожий на вышеупомянутый пример.

Чтобы использовать JHipster, вам необходимо иметь Node.js установлен. Вы также можете использовать start.hipster.технология , которая похожа на start.spring.io .

Наиболее распространенным способом установки Hipster является использование npm:

npm install -g generator-jhipster@6.0.1

ПРИМЕЧАНИЕ: Вы можете выполнить приведенную выше команду без номера версии, чтобы получить последнюю версию JHipster. Если это 6.x, этот учебник должен работать, но я не могу гарантировать, что это сработает.

В терминале создайте каталог для хранения всех проектов, которые вы собираетесь создать. Например, хипстер .

Создайте файл apps.jh в этом каталоге и вставьте в него следующий код.

application {
  config {
    baseName gateway,
    packageName com.okta.developer.gateway,
    applicationType gateway,
    authenticationType oauth2,
    prodDatabaseType postgresql,
    serviceDiscoveryType eureka,
    testFrameworks [protractor]
  }
  entities Blog, Post, Tag, Product
}

application {
  config {
    baseName blog,
    packageName com.okta.developer.blog,
    applicationType microservice,
    authenticationType oauth2,
    prodDatabaseType postgresql,
    serverPort 8081,
    serviceDiscoveryType eureka
  }
  entities Blog, Post, Tag
}

application {
  config {
    baseName store,
    packageName com.okta.developer.store,
    applicationType microservice,
    authenticationType oauth2,
    databaseType mongodb,
    devDatabaseType mongodb,
    prodDatabaseType mongodb,
    enableHibernateCache false,
    serverPort 8082,
    serviceDiscoveryType eureka
  }
  entities Product
}

entity Blog {
  name String required minlength(3),
  handle String required minlength(2)
}

entity Post {
  title String required,
  content TextBlob required,
  date Instant required
}

entity Tag {
  name String required minlength(2)
}

entity Product {
  title String required,
  price BigDecimal required min(0),
  image ImageBlob
}

relationship ManyToOne {
  Blog{user(login)} to User,
  Post{blog(name)} to Blog
}

relationship ManyToMany {
  Post{tag(name)} to Tag{post}
}

paginate Post, Tag with infinite-scroll
paginate Product with pagination

microservice Product with store
microservice Blog, Post, Tag with blog

// will be created under 'docker-compose' folder
deployment {
  deploymentType docker-compose
  appsFolders [gateway, blog, store]
  dockerRepositoryName "jmicro"
  consoleOptions [zipkin]
}

СОВЕТ: Вы захотите изменить имя репозитория docker в JDL выше, чтобы использовать ваше имя пользователя Docker Hub , если вы хотите опубликовать свои контейнеры. Это не является необходимым шагом для завершения данного руководства.

Этот код – JDL (язык домена Hipster), и вы можете использовать его для определения своего приложения, его сущностей и даже параметров развертывания. Вы можете узнать больше о JDL в Документация JHipster по JDL . Ниже приведен снимок экрана JDLStudio, который можно использовать для редактирования JDL и просмотра того, как объекты связаны друг с другом.

JDL, который вы только что ввели в apps.jh , определяет три приложения:

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

  • блог : сервис блогов, который взаимодействует с PostgreSQL.

  • магазин : служба хранения, использующая MongoDB.

Выполните следующую команду, чтобы создать эти проекты в вашей папке hipster .

jhipster import-jdl apps.jh

Это позволит создать все три проекта параллельно.

Создание образов докеров для микросервисных приложений

Когда конфигурация создается для Docker Compose, на консоль выводится предупреждение.

WARNING! Docker Compose configuration generated, but no Jib cache found
If you forgot to generate the Docker image for this application, please run:
To generate the missing Docker image(s), please run:
  ./mvnw -Pprod verify jib:dockerBuild in /Users/mraible/java-microservices-examples/jhipster/gateway
  ./mvnw -Pprod verify jib:dockerBuild in /Users/mraible/java-microservices-examples/jhipster/blog
  ./mvnw -Pprod verify jib:dockerBuild in /Users/mraible/java-microservices-examples/jhipster/store

Чтобы упростить создание образов Docker с помощью одной команды, создайте агрегатор pom.xml в корневом каталоге jhipster .



    4.0.0
    com.okta.developer
    jhipster-parent
    1.0.0-SNAPSHOT
    pom
    jhipster-parent
    
        gateway
        blog
        store
    

Затем “просто сдвиньте его”, используя Стрела .

mvn -Pprod verify com.google.cloud.tools:jib-maven-plugin:dockerBuild

совет: Если у вас не установлен Maven, используйте brew install maven на Mac или см. Документы по установке Maven .

[INFO] Skipping containerization because packaging is 'pom'...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Gateway 0.0.1-SNAPSHOT ............................. SUCCESS [02:44 min]
[INFO] Blog 0.0.1-SNAPSHOT ................................ SUCCESS [ 34.391 s]
[INFO] Store 0.0.1-SNAPSHOT ............................... SUCCESS [ 28.589 s]
[INFO] jhipster-parent 1.0.0-SNAPSHOT ..................... SUCCESS [  1.096 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:49 min
[INFO] Finished at: 2019-05-17T07:44:39-06:00
[INFO] ------------------------------------------------------------------------
Execution time: 3 min. 50 s.

Запустите свой стек микросервисов Java с помощью Docker Compose

Как только все будет готово, вставьте компакт-диск в каталог docker-compose и запустите все ваши контейнеры.

cd docker-compose
docker-compose up -d

совет: Удалить -d если вы хотите просмотреть все журналы в вашем текущем окне терминала.

Для запуска всех восьми ваших контейнеров потребуется несколько минут. Вы можете использовать Kitematic для отслеживания хода их запуска, если хотите.

Creating docker-compose_gateway-app_1 ... done
Creating docker-compose_gateway-postgresql_1 ... done
Creating docker-compose_blog-app_1 ... done
Creating docker-compose_store-mongodb_1 ... done
Creating docker-compose_keycloak_1 ... done
Creating docker-compose_blog-postgresql_1 ... done
Creating docker-compose_jhipster-registry_1 ... done
Creating docker-compose_store-app_1 ... done

Реестр хипстеров для обнаружения служб с помощью микросервисов Java

Этот стек микросервисов использует Eureka для обнаружения сервисов, точно так же, как в примере Spring Boot + Spring Cloud. Это было определено следующей строкой для каждого приложения в JDL.

serviceDiscoveryType eureka

Когда вы выбираете эврика для обнаружения службы, Используется Реестр хипстеров . Это приложение очень похоже на сервер Eureka, за исключением того, что оно имеет угловой пользовательский интерфейс и включает Spring Cloud Конфигурация

совет: JHipster также поддерживает Hashicorp Consul для обнаружения служб.

Поскольку вы выбрали OAuth 2.0/OID для аутентификации, вам необходимо создать запись в файле hosts ( /etc/hosts в Linux/Mac, C:\Windows\System32\Drivers\etc\hosts в Windows) для скрытия ключей.

127.0.0.1 keycloak

Это связано с тем, что сеть Docker распознает keycloak как зарегистрированное имя хоста, но оно также перенаправляет вас на keycloak . Ваш браузер не знает об этом имени хоста без записи hosts .

Откройте свой браузер и перейдите по ссылке http://localhost:8761 . Вы будете перенаправлены на Keycloak для входа в систему. Введите admin/администратор для учетных данных, и вы будете перенаправлены обратно в Реестр хипстеров. Вы увидите, что все ваши экземпляры микросервиса зарегистрированы.

Перейдите к http://localhost:8080 , нажмите войти , и вы войдете в шлюз. Вы можете перейти в Сущности > Блог и добавьте блог.

Перейти к Сущностям > Перейдите в раздел Сущности

Перейдите в раздел || Сущности || > || Продукт ||, и вы тоже сможете добавить продукт. Довольно ловко, тебе не кажется?! 🤓

Перейдите в раздел || Сущности || > || Продукт ||, и вы тоже сможете добавить продукт. Довольно ловко, тебе не кажется?! Настройте микросервисы Hipster для использования Okta для идентификации

Перейдите в раздел Сущности > Продукт , и вы тоже сможете добавить продукт. Довольно ловко, тебе не кажется?! Настройка микросервисов Hipster для использования Okta для идентификации Одна из проблем, которые вы видели в простой настройке Spring Boot + Spring Cloud, заключается в том, что вам необходимо настроить okta.oauth2. Перейдите в раздел Сущности > Продукт

spring:
  ...
  security:
    oauth2:
      client:
        provider:
          oidc:
            issuer-uri: http://localhost:9080/auth/realms/jhipster
        registration:
          oidc:
            client-id: internal
            client-secret: internal

Почему Окта?

Возможно, вам интересно, почему вы должны использовать Okta вместо Keycloak? Keycloak отлично подходит для разработки и тестирования, и особенно хорошо, если вы находитесь в самолете без Wi-Fi. Однако в производстве вам нужна система, которая всегда включена . Вот тут-то и вступает в дело Окта. Для начала вам нужно будет создать учетную запись Okta и приложение вместе с ней.

Создайте веб-приложение в Okta

Войдите в свою учетную запись разработчика Okta (или зарегистрируйтесь , если у вас нет учетной записи).

  1. На странице Приложения выберите Добавить приложение .

  2. На странице Создать новое приложение , выберите Веб .

  3. Дайте вашему приложению запоминающееся название, добавьте http://localhost:8080/login/oauth2/code/okta в качестве URL-адреса перенаправления для входа в систему выберите Обновить маркер (в дополнение к Коду авторизации ) и нажмите Готово .

  4. Чтобы настроить выход из системы для работы в JHipster, Отредактируйте свое приложение, добавьте http://localhost:8080 в качестве URL-адреса перенаправления для выхода из системы нажмите Сохранить .

Настройте параметры подключения OpenID с помощью конфигурации Spring Cloud

Вместо того, чтобы изменять каждое из ваших приложений для Okta, вы можете использовать конфигурацию Spring Cloud в реестре JHipster для этого. Откройте docker-compose/central-server-config/application.yml и добавьте свои настройки Okta.

Идентификатор клиента и секрет доступны на странице настроек вашего приложения. Вы можете найти эмитента в разделе API > Серверы авторизации .

spring:
  security:
    oauth2:
      client:
        provider:
          oidc:
            issuer-uri: https://{yourOktaDomain}/oauth2/default
        registration:
          oidc:
            client-id: {yourClientId}
            client-secret: {yourClientSecret}

Приложения реестра, шлюза, блога и магазина настроены для чтения этой конфигурации при запуске.

Перезапустите все ваши контейнеры, чтобы эта конфигурация вступила в силу.

docker-compose restart

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

Войдите в свою панель управления Okta, отредактируйте приложение OIDC и добавьте следующий URI перенаправления для входа:

  • http://localhost:8761/login/oauth2/code/oidc

Вам также нужно будет добавить URI перенаправления для выхода из системы:

  • http://localhost:8761

Затем нажмите Сохранить .

Создавайте группы и добавляйте их в качестве утверждений к идентификатору Знак

JHipster по умолчанию настроен для работы с двумя типами пользователей: администраторами и пользователями. Keycloak настраивается для пользователей и групп автоматически, но вам необходимо выполнить одноразовую настройку для вашей организации Okta.

Создать РОЛЕВУЮ администраторскую группу ( Пользователи > Группы > Добавить группу ) и добавьте в нее своего пользователя. Перейдите в API > Серверы авторизации и нажмите на сервер по умолчанию . Перейдите на вкладку Претензии и Добавить претензию . Назовите его группы и включите в идентификационный маркер. Установите тип значения равным Группы и установите фильтр в качестве регулярного выражения . * . Нажмите Создать .

Теперь, когда вы нажмете http://localhost:8761 или http://localhost:8080 , вам будет предложено войти в систему с помощью Okta!

Довольно здорово, как вы можете настроить свой реестр служб и все свои микросервисы в одном месте с помощью конфигурации Spring Cloud, не так ли?! 👌

Настройка конфигурации Spring Cloud с помощью Git

Реестр Hipster и его сервер конфигурации Spring Cloud поддерживают два вида источников конфигурации: собственный и мерзавец . Какой из них используется, определяется a spring.cloud.конфигурация.сервер.композитный свойство. Если вы заглянете в docker-compose/jhipster-registry.yml , вы увидите, что native включен, а git закомментирован.

- SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_TYPE=native
- SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_SEARCH_LOCATIONS=file:./central-config
# - SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_TYPE=git
# - SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_URI=https://github.com/jhipster/jhipster-registry/
# - SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_SEARCH_PATHS=central-config
# For Keycloak to work, you need to add '127.0.0.1 keycloak' to your hosts file

Вы можете увидеть конфигурацию Git по умолчанию по адресу @jhipster/jhipster-реестр/центральная конфигурация/приложение.yml . Вы можете узнать больше о конфигурации приложения с помощью конфигурации Spring Cloud в Документация по реестру JHipster . Он включает раздел о значениях конфигурации шифрования.

А Как Насчет Микросервисов Kotlin?

В первом посте этой серии я рассказал вам, почему я написал этот пост на Java:

“Я написал этот пост на Java, потому что это самый популярный язык в экосистеме Java. Однако, Котлин находится на подъеме , , согласно рейтингу языков программирования RedMonk за январь 2019 года.”

Spring имеет отличную поддержку Kotlin, и вы можете выбрать его в качестве языка на start.spring.io . У хипстера тоже есть поддержка Kotlin с его Проектом Kotlin ! На прошлой неделе был опубликован новый релиз , который позволяет создавать приложения JHipster на базе Kotlin с помощью hipster .

Если вы хотите, чтобы мы писали больше постов с помощью Kotlin, пожалуйста, дайте нам знать в комментариях!

Узнайте больше о конфигурации Spring Cloud, микросервисах Java и Hipster

Я надеюсь, вам понравилось изучать, как создавать архитектуры микросервисов Java с помощью JHipster и настраивать их с помощью конфигурации Spring Cloud. Вы узнали, как создавать все из одного файла JDL, упаковывать свои приложения в контейнеры Docker, запускать их с помощью Docker Compose и проходить аутентификацию с помощью OIDC с помощью Keycloak и Okta.

Вы можете найти весь код, показанный в этом руководстве на GitHub в каталоге hipster .

Мы большие поклонники Spring Boot, Spring Cloud и Hipster в этом блоге. Вот несколько других сообщений, которые могут показаться вам интересными:

Пожалуйста, следуйте за нами в Твиттере @ oktadev и подпишитесь на наш канал YouTube для получения дополнительных советов по безопасности весной и весной.

Оригинал: “https://dev.to/oktadev/java-microservices-with-spring-cloud-config-and-jhipster-14ji”