![spring](https://i-blog.csdnimg.cn/blog_migrate/1e9fefdca96aacd3dd06f7ca7470f3ce.png)
spring
朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试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 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]
}
如果要发布容器,则需要在上面的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>
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 ... done
JHipster注册表,用于使用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/jhipster
registration:
oidc:
client-id: internal
client-secret: internal
为什么选择Okta?
您可能想知道为什么应该使用Okta代替Keycloak? Keycloak非常适合开发和测试,如果您乘坐的飞机没有Wi-Fi,则效果特别好。 但是,在生产中,您需要一个始终处于运行状态的系统。 这就是Okta的所在。首先,您需要创建一个Okta帐户和一个带有该帐户的应用程序。
在Okta中创建Web应用程序
登录到您的1563开发者帐户(或者注册,如果你没有一个帐户)。
- 在“应用程序”页面上,选择添加应用程序。
- 在“创建新应用程序”页面上,选择“ Web” 。
- 为您的应用提供一个令人难忘的名称,将
http://localhost:8080/login/oauth2/code/okta
为登录重定向URI,选择刷新令牌(除了授权代码),然后点击完成。 - 要配置注销以在JHipster中工作,请编辑您的应用,添加
http://localhost:8080
作为注销重定向URI,然后单击保存。
使用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/default
registration:
oidc:
client-id: {yourClientId}
client-secret: {yourClientSecret}
注册表,网关,博客和存储应用程序均已配置为在启动时读取此配置。
重新启动所有容器,以使此配置生效。
docker-compose restart
在登录之前,您需要为JHipster Registry添加重定向URI,确保您的用户位于ROLE_ADMIN
组中,并且这些组包含在ID令牌中。
登录到Okta仪表板,编辑OIDC应用,然后添加以下登录重定向URI:
您还需要添加注销重定向URI:
然后,点击保存。
创建组并将其作为声明添加到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