朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试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                  ... 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-clientoauth2-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开发者帐户(或者注册 ,如果你没有一个帐户)。

  1. 在“ 应用程序”页面上,选择添加应用程序
  2. 在“创建新应用程序”页面上,选择“ Web”
  3. 为您的应用提供一个令人难忘的名称,将http://localhost:8080/login/oauth2/code/okta为登录重定向URI,选择刷新令牌 (除了授权代码 ),然后点击完成
  4. 要配置注销以在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/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:8761http://localhost:8080 ,系统将提示您使用Okta登录!



您如何使用Spring Cloud Config在一个地方配置服务注册表和所有微服务真是太漂亮了,您不觉得吗?

带有Spring Cloud Config和JHipster的Java微服务相关推荐

  1. 微服务等于Spring Cloud?一文告诉你微服务到底是什么

    作者:TIM XU 原文:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 1 微服务初探 ...

  2. Spring Cloud Gateway面试攻略,微服务网关的作用以及案例

    微服务系列导航 第一篇:初学者如何快速入门微服务,面试前如何快速熟悉微服务 第二篇:微服务Spring Cloud Alibaba之Nacos篇, Nacos 就是注册中心 + 配置中心的组合 第三篇 ...

  3. 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战

    文章目录 前言 I.微服务与Spring Cloud II.Nacos 注册中心 III.Spring Cloud Alibaba Nacos 实战 1.新建父工程 2.新建demo-a 服务 3.新 ...

  4. 【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战

    系列目录 [Spring Cloud Alibaba](一)微服务介绍 及 Nacos注册中心实战 本文目录 系列目录 前言 什么是RPC? Feign和OpenFeign都是什么? HTTP调用 v ...

  5. 阿里新框架发布!干掉Spring Cloud,换下Dubbo,微服务王者来了!

    目前,但凡谈及微服务技术选型,就必然会遇到一个两难的抉择,到底该采用Dubbo,还是该选择Spring Cloud呢? 当初阿里于2017年宣布重新开源Dubbo,近年来Dubbo发展速度和势头可谓是 ...

  6. 微服务应用-基于Spring Cloud和Reactor构建网上商店微服务(下)

    前言 上篇主要是讲解理论知识和项目架构要点,这篇将集中在微服务中使用spring Boot.Spring Cloud和Project Reactor实现事件溯源的原始主题.文章中也会介绍项目实现一些技 ...

  7. Spring Cloud之(十八)微服务网关GateWay

    十八.微服务网关GateWay Zuul 1.x 是一个基于阻塞 IO 的 API Gateway 以及 Servlet:直到 2018 年 5 月,Zuul 2.x(基于Netty,也是非阻塞的,支 ...

  8. Spring Cloud Gateway 之请求坑位[微服务IP不同请求会失败]

    问题产生背景 在使用Spring Cloud Gateway过程中,希望配置多Routes映射不同的微服务,因为Gateway 和Zuul的访问路径不同(zuul 会带有服务service Id),造 ...

  9. Spring Cloud【Finchley】-03将微服务注册到Eureka Server上 + 为Eureka Server添加用户认证

    文章目录 概述 将用户微服务micorservice-provider-user注册到Eureka Server上 pom中增加 spring-cloud-starter-netflix-eureka ...

最新文章

  1. 数据丢失如当头棒喝,数据备份重如山!
  2. Linux CentOS7 中 完美解决VMTools失效,windows 与 Liunx间完美复制文件,无报错的解决方案
  3. 某法院HP-P4500存储数据恢复案例
  4. oracle备份信息在控制文件丢失,恢复之利用备份在所有控制文件丢失情况下恢复(一)...
  5. 工作笔记-新系统安装deb文件失败
  6. Python组合数据类型:容器类型转换,list←→tuple←→set
  7. 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之22---BDS的分发流程...
  8. [PM2][ERROR] Script not found 和 npm in fork_mode
  9. 服装免费收银系统哪个好-云上铺会员管理软件
  10. C语言中空字符串长度,C语言中求字符串的长度
  11. ARKit之路-射线检测
  12. 飞思卡尔mc9s08烧录方法_飞思卡尔8位单片机MC9S08教程
  13. 软件测试选哪个技术方向分支_硬件测试转软件测试,应该选哪个方向
  14. Dell戴尔笔记本电脑Vostro 14 5410原装出厂WIN10系统恢复原厂OEM系统
  15. [置顶] 程序员的奋斗史(二十八)——寒门再难出贵子?
  16. echarts 添加百分号%
  17. 65个外贸小心思,让你稳步赢得客户
  18. 常见电平类型:TTL电平,CMOS电平,232/485电平,OC门,OD门
  19. 维修汽车服务器,汽修门店没有这些工具,千万别帮车主维修汽车电脑!
  20. ArcGIS中做一张新闻1+1演播厅背景图(附世界矢量地图.shp下载)

热门文章

  1. 【网络流】植物大战僵尸(P2805)
  2. 牛客国庆集训派对Day6
  3. 22、java中的注解
  4. Java进阶之对象克隆(复制)
  5. 独占锁、共享锁、更新锁,乐观锁、悲观锁
  6. 神奇!一行代码实现删除某集合下标20-30的元素
  7. 银行营业网点管理系统——dao包(BaseDao)
  8. mysql id生成器自定义_MybatisPlus使用自定义Id生成器数据自动填充
  9. stream进行分组统计
  10. js 方法传递对象参数