朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。
好的设计原则要求微服务架构是可观察的,并提供集中的监视工具。 该工具使开发团队可以验证整个系统的运行状况,检查日志和错误以及在部署后获取反馈。 那么什么是弹性(或ELK)堆栈?为什么它是满足此需求的绝佳选择?
在本教程中,您将学习如何...
- 在Docker容器中设置并运行ELK堆栈
- 设置JHipster控制台以监视微服务基础架构
- 使用JHipster创建微服务架构
- 使用JHipster控制台启用监视
- 为微服务配置OpenID Connect身份验证
弹性堆栈的演变
首字母缩写词ELK代表Elasticsearch,Logstash和Kibana ,这三个开源项目构成了功能强大的堆栈,用于日志摄取和可视化,日志搜索,事件分析以及用于监视应用程序的有用的可视化指标。
E lasticsearch是堆栈的核心:一个基于JSON的搜索和分析引擎,可分布式且可扩展。 它基于Apache Lucene构建,并提供JSON REST API,集群管理,高可用性和容错能力。
L ogstash是一种ETL(提取,转换,加载)工具,用于丰富文档,运行数据处理管道。 这些管道从多个来源获取数据,进行转换并将其发送到Elasticsearch。
K ibana提供可视化前端,这是进入Elastic Stack的窗口。 借助仪表板和可视化元素,可以浏览,汇总和分析存储在Elasticsearch中的数据。
从版本7开始,ELK堆栈被重命名为Elastic Stack ,并将Beats添加到堆栈中。 Beats是与Elasticsearch和Logstash一起使用的轻量级数据托运人系列。
设置弹性堆栈
Elastic发布了Docker Compose配置 ,以演示单台计算机上的堆栈组件。 安装Docker和Docker Compose并按照以下步骤启动堆栈:
Windows用户必须配置2个环境变量,查看堆栈docker github存储库上的说明
至少为容器提供4GB的RAM,并查看有关您的环境的说明
- 克隆
stack-docker
存储库
git clone https://github.com/elastic/stack-docker.git
- 使用Docker Compose设置堆栈
cd stack-dockerdocker-compose -f setup.yml up
设置完成后,它将输出弹性用户的密码 。 如果连接速度较慢,则最多可能需要20分钟。 完成后,您将看到以下日志:
setup_1 | Setup completed successfully. To start the stack please run:setup_1 | docker-compose up -dsetup_1 |setup_1 | If you wish to remove the setup containers please run:setup_1 | docker-compose -f docker-compose.yml -f docker-compose.setup.yml down --remove-orphanssetup_1 |setup_1 | You will have to re-start the stack after removing setup containers.setup_1 |setup_1 | Your 'elastic' user password is: Z8GFVXu9UVsBrM6nup5fHw==stack-docker_setup_1 exited with code 0
- 启动堆栈
在前台启动堆栈以查看容器日志:
docker-compose up
当您看到Kibana记录了Beats家族发送的对健康检查请求的响应,并且您在日志中看到至少一个心跳条目时,可以尝试登录(下面的步骤4):
kibana | {"type":"response","@timestamp":"2019-09-23T20:38:47Z","tags":[],"pid":1,"method":"get","statusCode":200,"req":{"url":"/login?next=%2F","method":"get","headers":{"host":"kibana:5601","user-agent":"Go-http-client/1.1","referer":"http://kibana:5601"},"remoteAddress":"172.25.0.9","userAgent":"172.25.0.9","referer":"http://kibana:5601"},"res":{"statusCode":200,"responseTime":30,"contentLength":9},"message":"GET /login?next=%2F 200 30ms - 9.0B"}...heartbeat | 2019-09-23T20:38:52.213Z INFO [monitoring] log/log.go:144 Non-zero metrics in the last 30s {"monitoring": {"metrics": {"beat":{"cpu":{"system":{"ticks":160,"time":{"ms":50}},"total":{"ticks":430,"time":{"ms":120},"value":430},"user":{"ticks":270,"time":{"ms":70}}},"handles":{"limit":{"hard":1048576,"soft":1048576},"open":9},"info":{"ephemeral_id":"d8d4f6a2-39fa-41cb-9e9c-520438d49a9e","uptime":{"ms":93132}},"memstats":{"gc_next":4194304,"memory_alloc":3365792,"memory_total":12191384,"rss":327680}},"libbeat":{"config":{"module":{"running":0}},"output":{"events":{"acked":24,"batches":6,"total":24},"read":{"bytes":5970},"write":{"bytes":16878}},"pipeline":{"clients":4,"events":{"active":0,"published":24,"total":24},"queue":{"acked":24}}},"system":{"load":{"1":4.83,"15":2.43,"5":3.44,"norm":{"1":1.2075,"15":0.6075,"5":0.86}}}}}}
您可能会在日志输出中注意到异常。 对于此演示,可以安全地忽略它们。 如果遇到docker问题,可以重新开始:
docker container ls -a | cut -c1-12 | xargs docker container rm --force docker images | cut -c69-80 | xargs docker rmi docker system prune -a
注意:这将销毁所有docker容器,图像和网络,因此使用后果自负。
- 转到http:// localhost:5601登录到Kibana。
登录后(使用弹性用户和您在上面捕获的密码),通过左侧菜单从“仪表板”部分中浏览已安装的仪表板。 心跳是Beat服务之一,可从提供的URL列表中监视您的服务正常运行时间。 打开仪表板Heartbeat HTTP监视,并查看堆栈的功能以进行数据可视化。
JHipster控制台
Jhipster控制台是基于Elastic Stack的出色监控解决方案,可随着时间的推移可视化和分析JHipster应用程序指标。 控制台提供了预配置的仪表板,以监视微服务基础架构。 您可以在JHipster Console的文档中查看功能的完整列表。
从JHipster控制台启动的一种更简单的方法是部署应用程序,并使用docker -compose子生成器启用监视。 您将使用它来:
- 使用JHipster创建微服务架构
- 使用JHipster控制台启用监视
- 配置OpenID Connect以对微服务进行身份验证
使用JHipster创建Java微服务架构
要安装一个版本JHipster的,将在这里工作,你需要安装Node.js的 。
安装JHipster
npm install -g generator-jhipster@6.3.1
jhipster --version
版本命令应输出如下内容:
INFO! Using JHipster version installed globally
6.3.1
为项目创建目录:
mkdir jhipster
cd jhipster
创建apps.jh
以使用JHipster域语言(JDL)定义商店,博客和网关微服务。 我们将重新创建本教程之前构建的基于Java的微服务架构示例。
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
现在,在您的jhipster
文件夹中,运行import-jdl generator 。
jhipster import-jdl apps.jh
使用
在项目文件夹中,为docker-compose
配置创建一个子文件夹,然后运行该子生成器。
mkdir docker-compose
cd docker-compose
jhipster docker-compose
生成器将要求您定义以下配置:
- 应用程序类型:微服务应用程序
- 网关类型: 基于Zuul的JHipster
- 包括哪些应用程序: 博客 , 网关 , 商店
- 如果数据库是集群的: 否
- 如果必须启用监视: 是,使用JHipster控制台
- 监视其他技术: Zipkin
- JHipster注册表的密码: 默认
您可以在下面的记录中查看其工作原理。
当发电机快要用完时,输出中将显示警告:
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 package -Pprod verify jib:dockerBuild in /home/indiepopart/jhipster/blog./mvnw package -Pprod verify jib:dockerBuild in /home/indiepopart/jhipster/gateway./mvnw package -Pprod verify jib:dockerBuild in /home/indiepopart/jhipster/store
您可以按照上述说明创建微服务映像,或创建聚合器pom.xml
并仅使用一个命令来构建所有映像,如我们在Java微服务上的文章中所述。
为微服务设置Okta OpenID Connect(OIDC)身份验证
默认情况下,微服务架构通过Keycloak进行身份验证。 更新设置以将Okta用作身份验证提供程序:
首先,前往Okta以获得免费的开发者帐户 。
登录后,点击您的单位 ,它将带您进入开发者控制台 。 转到“ 应用程序”部分,并添加一个新的Web应用程序 。 设置以下身份验证设置:
- 名称:为您的应用程序命名
- 基本URI:
http://localhost:8761
和http://localhost:8080
- 登录重定向URI:
http://localhost:8080/login/oauth2/code/oidc
和http://localhost:8761/login/oauth2/code/oidc
- 允许的授予类型:授权码和刷新令牌
为简单起见,本教程仅创建Web App,并且其凭据将用于所有服务。 在实际环境中,每个服务必须使用其自己的凭据进行标识,并且您应该在Okta控制台中为每个服务创建一个Web应用程序或服务。
复制Client ID和Client secret ,因为我们将使用它来进行应用程序的设置。 在Okta信息中心的右上角找到组织URL 。
创建具有以下内容的docker-compose/.env
文件:
OIDC_CLIENT_ID=<client_id>
OIDC_CLIENT_SECRET=<client_secret>
RESOURCE_ISSUER_URI=<org_url>/oauth2/default
编辑docker-compose/docker-compose.yml
并更新服务blog-app
, gateway-app
和store-app
的SECURITY_*
设置:
SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_OIDC_ISSUER_URI=${RESOURCE_ISSUER_URI}
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_OIDC_CLIENT_ID=${OIDC_CLIENT_ID}
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET}
必须为JHipster注册表设置相同的身份验证。 编辑docker-compose/jhipster-registry.yml
并设置与gateway-app
的environment部分相同的值。
JHipster应用程序需要特定的用户角色ROLE_USER
和ROLE_ADMIN
作为ID令牌中的声明。 在Okta开发人员控制台中,转到“ 用户” >“ 组”,并为每个JHipster角色创建一个组,然后将用户添加到每个组。
现在转到“ API” >“ 授权服务器” ,选择默认服务器,然后使用以下设置添加“声明 ”:
- 名称:团体
- 包含在令牌类型中:ID令牌,始终
- 值类型:组
- 过滤器:匹配正则表达式,将正则表达式设置为
.*
启用调试日志和Zipkin
要将调试日志发送到JHipster控制台,让我们更新prod配置文件中的日志级别。 编辑src/main/resources/config/application-prod.yml
以将com.okta.developer.*
记录器的每个服务( blog-app
, store-app
和gateway-app
)的级别设置为DEBUG 。 例如,在博客的application-prod.yml
:
logging:level:com.okta.developer.blog: DEBUG
另外,对于每个服务,更新产品概要文件处于活动状态时要加载的LoggingAspectConfiguration
。 更改@Profile
批注:
@Configuration
@EnableAspectJAutoProxy
public class LoggingAspectConfiguration {@Bean@Profile({JHipsterConstants.SPRING_PROFILE_DEVELOPMENT, JHipsterConstants.SPRING_PROFILE_PRODUCTION})public LoggingAspect loggingAspect(Environment env) {return new LoggingAspect(env);}
}
Zipkin是一个分布式跟踪系统,可帮助解决微服务体系结构中的延迟问题。 通过在服务之间传播traceId,可以将对不同服务的调用进行关联并作为同一流的一部分进行分析。 JHipster控制台提供了Zipkin服务器和UI,并且JHipster应用程序可以通过Spring Cloud Sleuth与Zipkin集成。 要启用Zipkin跟踪,请将zipkin
配置文件添加到zipkin
docker-compose/docker-compose.yml
blog-app
, gateway-app
和store-app
。
- SPRING_PROFILES_ACTIVE=prod,swagger,zipkin
您还需要使用以下Maven命令使用zipkin
配置文件为blog-app
, store-app
和gateway-app
重建Docker映像:
./mvnw package -Pprod -Pzipkin verify jib:dockerBuild -DskipTests
ProTip:如果您使用的是具有bash shell的系统(例如Linux或MacOs),则可以从
jhipster
文件夹执行此操作,以一次构建每个项目:
for i in blog gateway store do cd $i ./mvnw package -Pprod -Pzipkin verify jib:dockerBuild -DskipTests cd .. done
运行受监视的微服务架构
您准备好了吗? 转到docker-compose
文件夹,并使用以下命令启动服务:
docker-compose up
jhipster-registry_1 | ----------------------------------------------------------
jhipster-registry_1 | Application 'jhipster-registry' is running! Access URLs:
jhipster-registry_1 | Local: http://localhost:8761
jhipster-registry_1 | External: http://172.20.0.2:8761
jhipster-registry_1 | Profile(s): [composite, dev, swagger, oauth2]
jhipster-registry_1 | ----------------------------------------------------------
使用Okta用户凭据登录到http://localhost:8761
的JHipster注册表,并检查服务的运行状况。
所有服务启动后,登录到网关应用程序并创建一些博客和帖子以产生流量。 为此,请使用应用程序左上方的“ 实体”菜单。 网关的主页位于http://localhost:8080
。
有趣的部分! 通过http://localhost:5601
访问JHipster控制台。 转到“仪表板”部分,然后打开“ requests-dashboard” 。 您应该会看到一些漂亮的曲线:
由于您将JHipster控制台与Zipkin UI集成在一起,因此在traces-dashboard中,您可以在左侧找到最长的跟踪持续时间。 如果单击右侧的traceId,它将在UI中打开跟踪,您将能够检查流。
了解有关JHipster和Elastic Stack的更多信息
我希望您喜欢本教程以及Elastic Stack和JHipster Console用于监视微服务架构的功能。 要继续扩展您对JHipster监控和Okta与Elastic Stack集成的知识,请查看以下链接:
- Github上的JHipster控制台
- JHipster监视文档
- SAML身份验证和弹性堆栈
- Kibana中的身份验证
如果您喜欢这篇文章,那么您很可能会喜欢我们在JHipster和微服务上的其他文章:
- 带有Java 12和JHipster 6的更好,更快,更轻量的Java
- 通过Java Hipster升级Spring Security OAuth和JUnit测试
- 带有Spring Boot和Spring Cloud的Java微服务
- 带有Spring Cloud Config和JHipster的Java微服务
- 使用Spring Cloud Gateway保护反应式微服务
要在我们发布新帖子时得到通知, 请在Twitter上关注@oktadev 。 我们还会定期将截屏视频发布到我们的YouTube频道 。
ELK堆栈入门最初于2019年9月26日发布在Okta开发者博客上。
朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。
翻译自: https://www.javacodegeeks.com/2019/10/get-started-with-the-elk-stack.html