带有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并查看实体之间如何相互关联。

Java微服务

您刚刚放入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。 您会看到所有微服务实例都已注册。

Java微服务

导航到http://localhost:8080 ,单击登录 ,您将登录到网关。 您可以转到实体 > 博客并添加博客。

Java微服务

转到实体 > 产品 ,您也可以添加产品。

Java微服务

很漂亮,你不觉得吗?

配置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并将过滤器设置为.*的正则表达式。 点击创建

Java微服务

现在,当您点击http://localhost:8761http://localhost:8080 ,系统将提示您使用Okta登录!

Java微服务
Java微服务

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

使用Git配置Spring Cloud Config

JHipster Registry及其Spring Cloud Config服务器支持两种配置源: nativegit 。 使用哪个是由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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Java中使用Lombok删除样板安装程序获取器

你好朋友&#xff0c; 一次又一次反对Java的观点之一是&#xff0c;我们必须写很多样板 我们简单的POJO类的setter和getter形式的代码&#xff0c;不必要地增加了 我们代码的长度。 为了解决这个问题&#xff0c;有一个名为Project Lombok的开源项目可以解决这个问题。 通过…

Dev-C++使用技巧1(亲测)(超详细)(安装过程、修改语言、新建项目、配置C++ 11、开启警告信息和调试信息)

前言 Dev-C是一款内存占用小&#xff0c;支持C/C&#xff0c;支持调试&#xff0c;可以一键编译、运行的IDE&#xff08;集成开发环境&#xff09;。 下载链接&#xff1a;Dev-C - Download 如果上面那个不行或者下载比较慢&#xff0c;可以点链接: Dev-Cpp 提取码: xaby 。 …

从网络虚拟化,看智能网卡发展史

5G的到来无疑将加速网络虚拟化的进程&#xff0c;在电信领域&#xff0c;网络虚拟化不仅在核心网&#xff0c;也在网络的边缘。但是&#xff0c;仅仅通过软件解决方案不能提供足够的网络可靠性和服务质量&#xff0c;而具有高级可编程功能智能网卡&#xff08;Smart NIC&#x…

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版)

更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示&#xff0c;字体word有的基本都有&#xff0c;华文楷体、宋体&#xff0c;幼圆之类。西文字体默认字体Consloas就不错&#xff0c;中文的话幼圆、新宋体都挺不错。 幼圆效果&#xff1…

深入浅出全面解析RDMA

RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问&#xff0c;就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机&#xff0c;无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信&#xff0c;…

hypervisor介绍

hypervisor&#xff1a;一种运行在物理服务器和操作系统之间的中间层软件&#xff0c;可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统&#xff0c;可以协调访问服务器上的所有物理设备和虚拟机&#xff0c;所以又称为虚拟…

Selenium WebDriver中的TestNG侦听器及示例

Java提供了不同的接口&#xff0c;使您可以修改TestNG行为。 这些接口在Selenium WebDriver中进一步称为TestNG侦听器。 TestNG Listeners还允许您根据项目要求自定义测试日志或报告。 Selenium WebDriver中的TestNG侦听器是侦听某些事件并跟踪测试执行情况的模块&#xff0c;…

Ubantu键盘快捷键

Ubuntu系统 长按"Win"键可打开快捷键提示界面

win10安装python详细过程

关于python的安装 一切语言皆为工具接下来咱们就开始吧一切语言皆为工具 既然你决定安装它&#xff0c;那就已经告知自己要掌握这门工具&#xff0c; 但是有一定你一定要铭记于心那就是&#xff1a; python 是个工具时刻想着如何用它解决你的问题【哪怕是一个简单的想法】 接…

第18次csp认证 201912-1 报数(C++)

题目 分析 需要跳过的包括&#xff1a;7的倍数和包括7的数。跳过的同时n要加一&#xff08;总的报n个数&#xff0c;跳过的不算&#xff09;。声明一个全局数组count[4]方法1&#xff1a;i1开始到n&#xff0c;把输入的i转化为字符串&#xff0c;然后在字符串里找’7’或者7的…

C++ vector求均值和方差

1 定义 &#xff08;1&#xff09;均值 &#xff08;2&#xff09;方差 &#xff08;3&#xff09;标准差 2 代码实现 //std::vector< double> 或者 std::vector< int> 类型变量求均值和方差 #include <numeric> #include <iostream> #include <m…

第18次csp认证 201912-2 回收站选址(C++)

题目 分析 每一个垃圾堆放处都可能是回收站&#xff0c;所以两轮循环&#xff0c;找出所有可以成为回收站的坐标。再两轮循环&#xff0c;确定所有回收站的得分最后输出每种得分的回收站个数 AC代码 #include <iostream> #include<string> using namespace std;…

Python——列表中存放字典遇到的问题

Python——列表中存放字典遇到的问题 使用列表、字典之间的相互嵌套可以很容易的实现json数据格式&#xff0c;但是昨天在往列表中装入字典时遇到了问题&#xff1a; 直接使用append方法将字典添加到列表中&#xff0c;如果需要更改字典中的数据&#xff0c;那么列表中的内容也…

pat 乙级 1036 跟奥巴马一起编程(C++)

题目 美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形…

Sublime删除所有包含特定值的行

1、选中包含的字符 2、全部选中包含这个字符&#xff1a; ALTF3 3、全选整行&#xff1a; 台式机&#xff1a;Shiftend 笔记本&#xff1a;ShiftFnend 4、删除所有数据&#xff1a; DELETE 5、删除所有空白行&#xff1a; 使用快捷方式直接删除空行&#xff0c;前提是进行如下…

Excel完成将多行多列数据转化为一列

想要把Excel的数据用Word转成一行。那么第一步当然是将excel中的数据先复制下啦&#xff0c;复制好了之后打开word&#xff0c;然后进行粘贴&#xff0c;注意这里要选择“只保留文本”哦。 接下来我们要用鼠标选中每一行的两个数据中间保留的空格&#xff0c;就像小编这样哦…

Kogito,ergo规则—第2部分:规则的全面执行模型

这是第二后 一系列更新的Kogito主动性和我们的努力&#xff0c;使Drools的云。 在这篇文章中&#xff0c;我们将深入研究规则单元的细节&#xff0c;并向您展示为什么我们对它们感到兴奋。 规则的全包执行模型 如果您一直在仔细检查Drools手册&#xff0c;以在每个最新发行版中…

使用Angular,Ionic 4和Spring Boot构建移动应用

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 我是Ionic的忠实粉丝。 几年前&#xff0c;我基于AngularJS开始使用它。 作为开发人员&#…

1039 到底买不买(pat乙级、C++)

题目 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告诉她有多少多余的珠子&#xff1…

使用Selenium Webdriver进行全屏截图

在任何网页测试人员中&#xff0c;执行效果最好的操作之一就是对网页进行截图。 每当测试人员发现并报告错误时&#xff0c;如果不支持该问题的屏幕截图甚至视频&#xff0c;就不会认真对待该错误。 不论您进行的测试类型是什么&#xff0c;包括硒自动化测试&#xff0c;都是如…