带有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,一经查实,立即删除!

相关文章

pat 乙级 1026 程序运行时间(C++)

题目 要获得一个 C 语言程序的运行时间&#xff0c;常用的方法是调用头文件 time.h&#xff0c;其中提供了 clock() 函数&#xff0c;可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick&#xff0c;即“时钟打点”。同时还有一个常数 CLK_TC…

什么是命名空间 为什么C++需要使用命名空间

引言&#xff1a; 问题&#xff1a;学习过C&#xff0c;然后再学c的人可能会这么问&#xff0c;我#include<iostream>之后&#xff0c;不就是把头文件拉进来了吗&#xff0c;而cin cout等函数不就是iostream.h里面的函数吗&#xff0c;我使用cin cout时&#xff0c;编译器…

pat 乙级 1023 组个最小数(C++)

题目 给定数字 0-9 各若干个。你可以以任意顺序排列这些数字&#xff0c;但必须全部使用。目标是使得最后得到的数尽可能小&#xff08;注意 0 不能做首位&#xff09;。例如&#xff1a;给定两个 0&#xff0c;两个 1&#xff0c;三个 5&#xff0c;一个 8&#xff0c;我们得…

C++谷歌命名规范

1.文件命名规则 文件名全部小写&#xff0c;可以含下划线或连字符&#xff0c;按项目约定命名,且尽量保证文件名明确。比如&#xff1a;cmd_save_player_info_class.cc &#xff0c;my_use_full_class.cc 定义类的文件名一般是成对出现&#xff0c;如&#xff1a;foo_bar.h f…

pat 乙级 1028 人口普查(C++)

题目 某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的——假设已知镇上没有超过 200 岁的老人&#xff0c;而今天是 2014 年 9 月 6 日&#xf…

c++ 为什么要按它们声明的顺序初始化成员变量?

我今天正在写一些代码&#xff0c;并得到一个奇怪的编译错误&#xff0c;这似乎是由初始化成员变量的顺序不同于他们声明的。 class Test {int a;int b;public:Test() : b(1), a(2) {} };int main() {Test test;return 0; } 然后&#xff0c;如果我编译它与-Werror -Wall&…

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

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

Python 列表list与数组array的区别

1. 列表list与数组array的定义&#xff1a; 列表是由一系列按特定顺序排列的元素组成&#xff0c;可以将任何东西加入列表中&#xff0c;其中的元素之间没有任何关系&#xff1b; Python中的列表(list)用于顺序存储结构。它可以方便、高效的的添加删除元素&#xff0c;并且列…

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

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

python列表各元素修改为int类型

import numpy as np action np.trunc(action).astype(int).tolist() 函数去掉小数&#xff0c;但元素本身并不是整数。&#xff08; 例1. 或者 2. 没有小数&#xff0c;但也不是整数&#xff09; 要保证元素本身是int类型&#xff0c;则使用astype() &#xff08;得到 [ 1 2…

pat 乙级 1029 旧键盘(C++)

题目 旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字&#xff0c;请你列出肯定坏掉的那些键。 输入格式&#xff1a; 输入在 2 行中分别给出应该输入的文字、以及实际被输入的文…

1.0jpa 2.0_JPA 2.1类型转换器–持久枚举的更好方法

1.0jpa 2.0可以使用JPA 2.0保留枚举&#xff0c;但是没有很好的方法来实现。 使用Enumerated批注&#xff0c;可以使用EnumType.ORDINAL或EnumType.STRING将枚举值映射到其数据库表示形式。 但是这两种选择都有一些缺点&#xff0c;我们将在本文的第一部分中进行讨论。 在第二部…

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

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

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

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

Java恶意序列化背后的历史和动机

与Java的序列化机制有关的问题已广为人知。 有效的Java 1st Edition &#xff08;第10章&#xff09;和有效的Java 2nd Edition &#xff08;第11章&#xff09;的整个最后一章都专门讨论Java的序列化主题。 Effective Java 3rd Edition &#xff08;第12章&#xff09;的最后一…

深入浅出全面解析RDMA

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

pat 乙级 1030 完美数列(C++)

题目 给定一个正整数数列&#xff0c;和正整数 p&#xff0c;设这个数列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;则称这个数列是完美数列。 现在给定参数 p 和一些正整数&#xff0c;请你从中选择尽可能多的数构成一个完美数列。 输入格式&…

hypervisor介绍

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

pat 乙级 1031 查验身份证(C++)

题目 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xff0…

Selenium WebDriver中的TestNG侦听器及示例

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