带有Spring Cloud Config和JHipster的Java微服务
朋友不允許朋友寫用戶身份驗證。 厭倦了管理自己的用戶? 立即嘗試Okta的API和Java SDK。 在幾分鐘之內即可對任何應用程序中的用戶進行身份驗證,管理和保護。
如今,使用Java和Spring Boot開發微服務架構非常流行。 它絕對是Java生態系統中最受歡迎的組合之一。 如果需要任何證據,只需看看過去幾年出現的所有類似框架:MicroProfile,Micronaut和Quarkus,僅舉幾例。
Spring Boot于2014年首次發布時,便為Spring生態系統提供了急需的火花。它沒有使Java開發人員配置其Spring Bean的所有方面,而是提供了“啟動器”,其中包含具有默認設置的預配置Bean。 這樣可以減少Java代碼的數量,還可以通過application.properties文件覆蓋默認值。 是的,有許多方法可以在Spring Boot應用程序中修改默認值,但是我現在將跳過這些內容。
在之前的有關帶有Spring Boot和Spring Cloud的Java微服務的教程中 ,我展示了如何使用OAuth 2.0和OpenID Connect保護所有內容。 此示例的問題之一是,您必須在每個應用程序中配置OIDC屬性。 如果您有數百個微服務,這可能是一個真正的痛苦。 是的,您可以將它們定義為環境變量,這樣就可以解決問題。 但是,如果您具有使用不同OIDC客戶端ID的不同微服務堆棧,則此方法將很困難。
帶有Spring Cloud Config的Java微服務
Spring Cloud Config是一個為分布式系統提供外部化配置的項目。 Spring Cloud Config具有服務器和客戶端組件。 您可以配置服務器以從文件系統或源代碼存儲庫(如Git)中讀取其配置。 在客戶端上,您可以在引導程序配置文件中配置事物以從服務器獲取配置數據。 在微服務環境中,這提供了一種從中央位置配置所有微服務的優雅方法。
今天,我想向您展示這是如何工作的,并使用我曾經使用過的最時髦的微服務解決方案進行演示。
使用JHipster生成Java微服務架構
JHipster是一個開發平臺,用于生成,開發和部署Spring Boot + {Angular或React或Vue}應用程序。 此外,它支持創建基于Spring的微服務架構。 實際上,如果您創建微服務項目并選擇OAuth 2.0 / OIDC進行身份驗證,則將使用與上述示例非常相似的代碼。
要使用JHipster,你需要有Node.js的安裝。 您也可以使用start.jhipster.tech ,它類似于start.spring.io。
安裝JHipster的最常見方法是使用npm:
npm install -g generator-jhipster@6.0.1您可以運行上面沒有版本號的命令以獲取最新版本的JHipster。 如果是6.x,則本教程應該可用,但我不能保證它可以。
在終端中,創建一個目錄來保存要創建的所有項目。 例如, jhipster 。
在此目錄中創建一個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 paginationmicroservice Product with store microservice Blog, Post, Tag with blog// will be created under 'docker-compose' folder deployment {deploymentType docker-composeappsFolders [gateway, blog, store]dockerRepositoryName "jmicro"consoleOptions [zipkin] }如果要發布容器,則需要在上面的JDL中更改dockerRepositoryName以使用Docker Hub用戶名。 這不是完成本教程的必要步驟。
該代碼是JDL(JHipster域語言),您可以使用它來定義您的應用,其實體,甚至是部署設置。 您可以在JHipster的JDL文檔中了解有關JDL的更多信息。 下面是JDL Studio的屏幕截圖,可用于編輯JDL并查看實體之間如何相互關聯。
您剛剛放入apps.jh的JDL定義了三個應用程序:
- 網關 :您的微服務的單個入口,其中將包括UI組件。
- blog :與PostgreSQL對話的博客服務。
- store :使用MongoDB的商店服務。
運行以下命令在jhipster文件夾中創建這些項目。
jhipster import-jdl apps.jh 這將并行創建所有三個項目。 您可以觀看下面的控制臺記錄,以查看其外觀。 創建所有內容所需的時間取決于您的計算機和Internet的速度。
為微服務應用創建Docker映像
為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映像更加容易,請在jhipster根目錄中創建一個聚合器pom.xml 。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.okta.developer</groupId><artifactId>jhipster-parent</artifactId><version>1.0.0-SNAPSHOT</version><packaging>pom</packaging><name>jhipster-parent</name><modules><module>gateway</module><module>blog</module><module>store</module></modules> </project>然后使用Jib “只是輕輕松松”
mvn -Pprod verify com.google.cloud.tools:jib-maven-plugin:dockerBuild如果您尚未安裝Maven, brew install maven在Mac上使用brew install maven ,或參閱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.使用Docker Compose運行Java微服務堆棧
一切構建完成后,將CD插入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 ... doneJHipster注冊表,用于使用Java微服務進行服務發現
該微服務堆棧使用Eureka進行服務發現,就像準系統Spring Boot + Spring Cloud示例一樣。 這是由JDL中每個應用程序的以下行確定的。
serviceDiscoveryType eureka當您選擇eureka服務發現, JHipster注冊使用。 此應用程序與Eureka Server非常相似,不同之處在于它具有Angular UI并包括Spring Cloud Config等功能。
JHipster還支持Hashicorp Consul進行服務發現。
由于您選擇了OAuth 2.0 / OIDC進行身份驗證,因此需要在hosts文件中(對于Linux / Mac是/etc/hosts對于C:\Windows\System32\Drivers\etc\hosts )創建一個條目。
127.0.0.1 keycloak這是因為Docker網絡將keycloak識別為已注冊的主機名,但也會將您重定向到keycloak 。 沒有hosts條目,您的瀏覽器將不知道該主機名。
打開瀏覽器并導航到http://localhost:8761 。 您將被重定向到Keycloak進行登錄。 輸入admin/admin作為憑據,您將被重定向回JHipster Registry。 您會看到所有微服務實例都已注冊。
導航到http://localhost:8080 ,單擊登錄 ,您將登錄到網關。 您可以轉到實體 > 博客并添加博客。
轉到實體 > 產品 ,您也可以添加產品。
很漂亮,你不覺得嗎?
配置JHipster微服務以使用Okta進行身份驗證
在基本的Spring Boot + Spring Cloud設置中看到的問題之一是,您必須在每個微服務中配置okta.oauth2.*屬性。 JHipster不使用Okta Spring Boot啟動器。 它改為使用oauth2-client和oauth2-resource-server Spring Boot啟動程序。 OAuth 2.0的配置包含在每個應用程序的src/main/resources/config/application.yml文件中。
spring:...security:oauth2:client:provider:oidc:issuer-uri: http://localhost:9080/auth/realms/jhipsterregistration:oidc:client-id: internalclient-secret: internal為什么選擇Okta?
您可能想知道為什么應該使用Okta代替Keycloak? Keycloak非常適合開發和測試,如果您乘坐的飛機沒有Wi-Fi,則效果特別好。 但是,在生產中,您需要一個始終處于運行狀態的系統。 這就是Okta的用處。首先,您需要創建一個Okta帳戶和一個帶有該帳戶的應用程序。
在Okta中創建Web應用程序
登錄到您的1563開發者帳戶(或者注冊 ,如果你沒有一個帳戶)。
使用Spring Cloud Config配置您的OpenID Connect設置
您可以使用JHipster Registry中的Spring Cloud Config來代替Okta修改每個應用程序。 打開docker-compose/central-server-config/application.yml并添加您的Okta設置。
客戶端ID和密碼可在您的應用設置頁面上找到。 您可以在API > 授權服務器下找到發行者。
spring:security:oauth2:client:provider:oidc:issuer-uri: https://{yourOktaDomain}/oauth2/defaultregistration:oidc:client-id: {yourClientId}client-secret: {yourClientSecret}注冊表,網關,博客和存儲應用程序均已配置為在啟動時讀取此配置。
重新啟動所有容器,以使此配置生效。
docker-compose restart在登錄之前,您需要為JHipster Registry添加重定向URI,確保您的用戶位于ROLE_ADMIN組中,并且這些組包含在ID令牌中。
登錄到Okta儀表板,編輯OIDC應用,然后添加以下登錄重定向URI:
- http://localhost:8761/login/oauth2/code/oidc
您還需要添加注銷重定向URI:
- http://localhost:8761
然后,點擊保存 。
創建組并將其作為聲明添加到ID令牌
默認情況下,JHipster配置為與兩種類型的用戶一起使用:管理員和用戶。 Keycloak會自動為用戶和組配置,但是您需要為Okta組織進行一些一次性配置。
創建一個ROLE_ADMIN組(“ 用戶” >“ 組” >“ 添加組” )并將您的用戶添加到其中。 導航到API > 授權服務器 ,然后單擊default服務器。 點擊索賠標簽,然后添加索賠 。 將其命名為groups ,并將其包含在ID令牌中。 將值類型設置為Groups并將過濾器設置為.*的正則表達式。 點擊創建 。
現在,當您點擊http://localhost:8761或http://localhost:8080 ,系統將提示您使用Okta登錄!
您如何使用Spring Cloud Config在一個地方配置服務注冊表和所有微服務真是太漂亮了,您不覺得嗎? 👌
使用Git配置Spring Cloud Config
JHipster Registry及其Spring Cloud Config服務器支持兩種配置源: native和git 。 使用哪個是由spring.cloud.config.server.composite屬性確定的。 如果查看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您可以在@ jhipster / jhipster-registry / central-config / application.yml中查看Git的默認配置。 您可以在JHipster Registry的文檔中了解有關使用Spring Cloud Config進行應用程序配置的更多信息。 它包括有關加密配置值的部分。
那么Kotlin微服務呢?
在本系列的第一篇文章中,我告訴您了為什么我用Java撰寫這篇文章:
我用Java寫這篇文章是因為它是Java生態系統中最受歡迎的語言。 然而,根據RedMonk從2019年1月開始的編程語言排名, Kotlin呈上升趨勢 。
Spring對Kotlin有很好的支持,您可以在start.spring.io上選擇它作為語言。 JHipster的Kotlin藍圖也支持Kotlin ! 上周發布了一個新版本,使您可以使用khipster創建基于Kotlin的JHipster應用程序。
如果您希望我們使用Kotlin寫更多帖子,請在評論中告訴我們!
了解有關Spring Cloud Config,Java微服務和JHipster的更多信息
我希望您喜歡學習如何使用JHipster構建Java微服務架構以及如何使用Spring Cloud Config對其進行配置。 您學習了如何從單個JDL文件生成所有內容,如何將應用程序打包在Docker容器中,使用Docker Compose運行它們,以及使用Keycloak和Okta使用OIDC進行身份驗證。
您可以在GitHub的jhipster目錄中找到本教程中顯示的所有代碼。
我們是此博客上Spring Boot,Spring Cloud和JHipster的忠實擁護者。 這是您可能會發現有趣的其他幾篇文章:
- 帶有Spring Boot和Spring Cloud的Java微服務
- 使用Spring Boot和Kubernetes構建微服務架構
- 構建Spring微服務并對其進行Dockerize生產
- 帶有Java 12和JHipster 6的更好,更快,更輕量的Java
請在Twitter @oktadev上關注我們,并訂閱我們的YouTube頻道,以獲取更多Spring和Spring Security提示。
“帶有Spring Cloud Config和JHipster的Java微服務”最初于2019年5月23日發布在Okta開發者博客上
朋友不允許朋友寫用戶身份驗證。 厭倦了管理自己的用戶? 立即嘗試Okta的API和Java SDK。 在幾分鐘之內即可對任何應用程序中的用戶進行身份驗證,管理和保護。
翻譯自: https://www.javacodegeeks.com/2019/07/java-microservices-spring-cloud-config-jhipster.html
總結
以上是生活随笔為你收集整理的带有Spring Cloud Config和JHipster的Java微服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想电脑指纹识别怎么设置(联想电脑指纹识
- 下一篇: 如何在Java中使用Lombok删除样板