本文通过使用Spring Boot,Spring Cloud和Docker构建一个应用程序的示例,为了解常见的微服务架构模式提供了一个起点。

作为这个系统的基础,我选择了一个旧项目,其后端曾经是一个整体。该应用程序提供了一种处理个人财务,组织收入和支出,管理储蓄,分析统计数据和创建简单预测的方法。

功能服务


整体应用程序被分解为三个核心微服务。所有这些都是可独立部署的应用程序,围绕某些业务功能组织。

帐户服务

包含一般用户输入逻辑和验证:收入/费用项目,帐户设置。

方法 路径 描述 用户通过身份验证 可从UI获得

GET

/accounts/{account}

获取指定的帐户数据

GET

/accounts/current

获取当前帐户数据

× ×

GET

/accounts/demo

获取模拟账户数据(预先填写的收入/费用项目等)

×

PUT

/accounts/current

保存当前帐户数据

× ×

POST

/accounts/

注册新帐户

×

统计服务

对主要统计参数执行计算并捕获每个帐户的时间序列。数据点包含标准化基本货币和时间段的值。此数据可用于跟踪帐户生命周期中的现金流动态。

方法 路径 描述 用户通过身份验证 可从UI获得

GET

/statistics/{account}

获取指定的帐户统计信息

GET

/statistics/current

获取当前帐户统计信息

× ×

GET

/statistics/demo

获取模拟账户统计信息

×

PUT

/statistics/{account}

为指定的帐户创建或更新时间序列数据点

通知服务

存储用户的联系信息和通知设置(如提醒和备份频率),工作人员从其他服务收集所需信息,并向订阅客户发送电子邮件。

方法 路径 描述 用户通过身份验证 可从UI获得

GET

/notifications/settings/current

获取当前帐户通知设置

×

×

PUT

/notifications/settings/current

保存当前帐户通知设置

×

×

笔记

  • 每个微服务都有自己的数据库,因此无法绕过API直接访问数据。

  • 对于这个项目,我使用MongoDB作为每个服务的主数据库。

  • 服务到服务的通信非常简单:微服务只使用同步REST API进行通信。在实际系统中常见的实践是使用组合。例如,执行同步GET请求来检索数据,并通过Message broker为创建/更新操作使用异步方法,以便解耦服务和缓冲区消息,这给我们带来了最终的一致性。

基建服务

Spring cloud提供了强大的工具,可以增强Spring引导应用程序的行为来实现这些模式。请看下图

配置服务


它使用一个可插入的存储库层,目前支持本地存储、Git和Subversion。

在这个项目中,我使用本机配置文件,它只是从本地类路径加载配置文件。您可以在配置服务资源中看到shareddirectory。现在,当notificationservice请求它的配置时,配置服务将使用共享/ notificationservice响应。yml和共享/应用程序。yml(在所有客户机应用程序之间共享)。

客户端使用

只需使用Spring -cloud-starter-config依赖项构建Spring引导应用程序,剩下的工作将由autoconfiguration完成。

现在,您不需要在应用程序中嵌入任何属性。只是提供引导。带有应用程序名称和配置服务url的yml:

使用Spring Cloud Config,您可以动态更改应用程序配置

这意味着您可以更改电子邮件文本和主题行,而无需重新构建和重新启动通知服务应用程序。

首先,更改配置服务器中所需的属性。然后,对通知服务执行刷新请求:

curl -H "Authorization: Bearer #token#" -XPOST http://127.0.0.1:8000/notifications/refresh

您还可以使用webhook来自动化这个过程。

笔记

  • 不过,动态刷新也有一些限制。@RefreshScope不能使用@Configuration类,也不能影响@Scheduled方法。

  • fail-fast属性意味着,如果Spring引导应用程序不能连接到配置服务,那么它将立即启动失败。在一起启动所有应用程序时,这非常有用。

  • 下面有一些重要的安全注意事项。

验证服务

授权验证被完全提取到单独的服务器,该服务器 为后端资源服务授予  OAuth2令牌。Auth Server用于用户授权以及周边内部的安全机器到机器通信。

在这个项目中,我使用  Passwordcredentials 授权类型进行用户授权(因为它仅由本机应用程序UI使用),并  Client Credentials 用作微服务授权的授权类型。

Spring Cloud Security提供方便的注释和自动配置,使服务器和客户端都能轻松实现。您可以在文档中了解有关它的更多信息,   并检查Auth Server代码中的配置详细信息  。

从客户端来看,一切都与传统的基于会话的授权完全相同。您可以Principal 从请求中检索  对象,使用基于表达式的访问控制和@PreAuthorize 注释检查用户角色和其他内容  。

PiggyMetrics中的每个客户端(帐户服务,统计服务,通知服务和浏览器)都有一个范围:  server用于后端服务,以及  ui -用于浏览器。因此,我们还可以保护控制器免受外部访问,例如:

API网关

实际上,渲染一个复杂的网页可能涉及数百种服务。

理论上,客户端可以直接向每个微服务发出请求。但显然这个选项存在挑战和局限,例如必须知道所有端点地址,分别对每个信息和平执行http请求,在客户端合并结果。另一个问题是非网络友好协议,可能会在后端使用。

通常,更好的方法是使用API网关。它是系统的单一入口点,用于通过将请求路由到适当的后端服务或通过调用多个后端服务并聚合结果来处理请求  。此外,它还可用于身份验证,洞察,压力和金丝雀测试,服务迁移,静态响应处理,主动流量管理。

Netflix开源了这样的优质服务,现在使用Spring Cloud,我们可以通过一个@EnableZuulProxy注释启用它  。在这个项目中,我使用Zuul存储静态内容(UI应用程序)并将请求路由到适当的微服务。以下是Notification服务的简单基于前缀的路由配置:

这意味着所有以/ Notification开头的请求都将路由到Notification service,如您所见,这里没有硬编码地址。Zuul使用服务发现机制来定位通知服务实例,以及断路器和负载均衡器。

服务发现

另一个常见的体系结构模式是服务发现。它允许自动检测服务实例的网络位置,由于自动伸缩、故障和升级,服务实例可以动态分配地址。

服务发现的关键部分是注册表。我在这个项目中使用了Netflix的Eureka。当客户端负责确定可用服务实例的位置(使用注册表服务器)并在它们之间平衡负载请求时,Eureka是客户端发现模式的一个很好的例子。

使用Spring Boot,您可以使用Spring -cloud-starter- Eureka -server依赖项、@EnableEurekaServer注释和简单的配置属性轻松构建Eureka注册表。

通过@EnableDiscoveryClient 注释和  bootstrap.yml 应用程序名称启用客户端支持  :

现在,在应用程序启动时,它将注册到Eureka服务器并提供元数据,如主机和端口、指示器URL、主页等。Eureka从属于服务的每个实例接收心跳消息。如果heartbeat在可配置的时间表上失败,则将从注册表中删除该实例。

此外,Eureka提供了一个简单的接口,您可以在其中跟踪正在运行的服务和可用实例的数量:http://localhost:8761

负载均衡器,断路器和HTTP客户端

Netflix OSS提供了另一套很棒的工具。

Ribbon

Ribbon是一个客户端负载均衡器,可以让您对HTTP和TCP客户端的行为进行大量控制。

开箱即用,它本身与Spring Cloud和ServiceDiscovery集成。 Eureka Client  提供可用服务器的动态列表,因此Ribbon可以在它们之间取得平衡。

Hystrix

Hystrix是断路器模式的实现,它提供了对通过网络访问的依赖项造成的延迟和故障的控制。其主要思想是在具有大量微服务的分布式环境中停止级联故障,这有助于快速找出错误并尽快恢复——这是自修复容错系统的重要方面。

除了断路器控制之外,使用Hystrix还可以添加一个回退方法,当主命令失败时,将调用该方法获取默认值。

此外,Hystrix为每个命令生成关于执行结果和延迟的度量,我们可以使用这些度量来监视系统行为。

Feign

Feign是一个声明式HTTP客户机,它与Ribbon和Hystrix无缝集成。实际上,使用spring-cloud-start -佯装依赖项和@EnableFeignClients注释,您就拥有了一套完整的负载平衡器、断路器和HTTP客户机,以及一个合理的现成默认配置。

下面是来自Account Service的一个例子:

  • 你所需要的只是一个界面

  • 您可以在Spring MVC控制器和Feign方法之间共享@RequestMapping部分

  • 上面的示例指定了所需的服务id - statistics-service,这多亏了通过Eureka自动发现(但显然您可以使用特定的ur访问任何资源)

监控仪表板

在这个项目配置中,每个带有Hystrix的微服务都通过Spring云总线(带有AMQP代理)将指标推送到监控台。监视项目只是一个带有Hystrix仪表板的小型Spring启动应用程序。

让我们看看负载下的系统行为:Account服务调用统计服务,而它的响应具有不同的模拟延迟。响应超时阈值设置为1秒。

                
0 ms delay 500 ms delay 800 ms delay 1100 ms delay

表现良好的系统。吞吐量约为22个请求/秒。统计服务中的活动线程数量很少。中位服务时间约为50毫秒。

活动线程数正在增长。我们可以看到紫色线程池拒绝的数量,因此大约有30-40%的错误,但电路仍然关闭。

半开状态:失败命令的比例超过50%,断路器启动。睡眠窗口的时间量后,下一个请求通过。

100%的请求失败。电路现在永久开放。睡眠时间后重试不会再次关闭电路,因为单个请求太慢。

日志分析

Elasticsearch、Logstash和Kibana堆栈允许您轻松地搜索和分析日志、利用率和网络活动数据。我的另一个项目描述了就绪Docker配置。

安全

高级安全配置超出了此概念验证项目的范围。要更真实地模拟真实系统,请考虑使用https和JCE密钥库来加密微服务密码和配置服务器属性内容。

构建自动化

与部署整体应用程序相比,部署微服务具有相互依赖性,这是一个复杂得多的过程。拥有完全自动化的基础架构非常重要。我们可以通过持续交付方法获得以下好处:

  • 随时发布软件的能力。

  • 任何构建都可能最终成为一个版本。

  • 构建工件一次,根据需要进行部署。

这是一个简单的Continuous Delivery工作流程,在此项目中实施:

在此 配置中,Travis CI为每个成功的Git推送构建标记图像。因此,Docker Hub上的每个微服务始终都有一个  映像   ,旧映像使用Git commit hash进行标记。如果需要,可以轻松部署其中任何一个并快速回滚。

如何运行所有的东西?

这真的很容易,我建议你试试。请记住,您将启动8个Spring Boot应用程序,4个MongoDB实例和RabbitMq。确保您4 Gb 的计算机上有  可用的RAM。您始终可以通过网关,注册表,配置,身份验证服务和帐户服务运行重要服务。

在你开始之前

  • 安装Docker和Docker组合。

  • 导出环境变量:CONFIG_SERVICE_PASSWORD、NOTIFICATION_SERVICE_PASSWORD、STATISTICS_SERVICE_PASSWORD、ACCOUNT_SERVICE

生产模式

在此模式下,所有最新镜像都将从Docker Hub中提取。只需复制  docker-compose.yml 并点击即可  docker-compose up -d

发展模式

如果您想自己构建映像(例如,代码中有一些更改),则必须使用Maven克隆所有存储库并构建代码。然后, run: docker-compose-f docker-compose.yml -f docker-compose.dev.yml up -d

docker-compose.dev.yml 继承  docker-compose.yml 了在本地构建映像的额外可能性,并公开所有容器端口以便于开发。

重要的端口

  • localhost:80 - 网关

  • localhost:8761 - Eureka Dashboard

  • localhost:9000 - Hystrix仪表板

  • localhost:8989 - 监控(Hystrix仪表板的来源)

  • localhost:15672 - RabbitMq管理

笔记

所有Spring Boot应用程序都需要运行  Config Server  才能启动。但是我们可以同时启动所有容器,因为  fail-fast SpringBoot属性和  restart: always docker-compose选项。这意味着所有相关容器都将尝试重新启动,直到ConfigServer启动并运行。

长按二维码 ▲

订阅「架构师小秘圈」公众号

如有启发,帮我点个在看,谢谢↓

想知道spring boot+cloud+docker的微服务体系架构如何使用吗?相关推荐

  1. 使用Spring Boot和Kubernetes构建微服务架构

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 在本教程 ...

  2. 如何使用消息队列,Spring Boot和Kubernetes扩展微服务

    by Daniele Polencic 由Daniele Polencic 如何使用消息队列,Spring Boot和Kubernetes扩展微服务 (How to scale Microservic ...

  3. 使用spring boot+kubernetes构建完整微服务平台

    微服务架构被认为是构建大型复杂系统的最佳理论指导,其采用了分而治之.单一职责.关注点分离等方法论来设计系统架构.微服务的实现方式和思路有很多种,本文简述基于kubernetes的微服务平台建设思路及技 ...

  4. 流量暴增,掌门教育如何基于 Spring Cloud Alibaba 构建微服务体系?

    作者 | 童子龙  掌门教育基础架构部架构师 **导读:**本文整理自作者于 2020 年云原生微服务大会上的分享<掌门教育云原生落地实践>,本文主要介绍了掌门教育云原生落地实践,主要围绕 ...

  5. 基于Spring Boot 2.5.1 微服务框架发布(Eurynome Cloud )

    企业级技术中台微服务架构与服务能力开发平台(Eurynome Cloud ) Eurynome Cloud是一款企业级技术中台微服务架构与服务能力开发平台.基于Spring Boot 2.5.1.Sp ...

  6. Spring Cloud + Spring Boot + Mybatis + shiro + RestFul + 微服务

    摘要: Commonservice-system是一个大型分布式.微服务.面向企业的JavaEE体系快速研发平台,基于模块化.服务化.原子化.热插拔的设计思想,使用成熟领先的无商业限制的主流开源技术构 ...

  7. spring cloud + spring boot + springmvc+mybatis分布式微服务云架构

    做一个微服务架构需要的技术整理: View: H5.Vue.js.Spring Tag.React.angularJs Spring Boot/Spring Cloud: Zuul.Ribbon.Fe ...

  8. spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求

    有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧, 但是细想想,是真的么?,忙到这几个字都没时间打么?毕竟大家都很忙的,所以忙并不是啥理由. 那是因为啥呢? ...

  9. Spring Boot与Docker(一):微服务架构和容器化概述

    本文讲的是Spring Boot与Docker(一):微服务架构和容器化概述,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列四部曲的第一篇,本篇将会对我们 ...

最新文章

  1. 3D神经接口系统可以感知和操纵“微型脑“
  2. 「土行孙」机器人登上Science子刊封面,用气流在地下穿梭自如,速度达每秒4.8米...
  3. 中国半导体最强助攻来了!十年免税、上下游一揽子扶持,明确「集成电路」为一级学科...
  4. 网站的高性能架构-性能测试方法
  5. 基于注释的Spring MVC Web应用程序入门
  6. node webkit(nw.js) 设置自动更新
  7. axios.delete()请求方式(含代码)- 应用篇
  8. 主板没有rgb接口怎么接灯_性价比稳定的RGB水冷散热器:乔思伯天使眼TW2-240测评...
  9. 从开源爱好者到 Apache 董事,他花了 11 年
  10. 计算机专业考研不想走编程,考研的这些弯路,不要走,好吗?
  11. MVC一个action对应多个视图的写法
  12. 基于深度学习的自动化行人检测和监控系统
  13. Python 函数的嵌套
  14. linux如何查看内存命令
  15. 计算机运行速度靠什么,怎么让电脑运行速度变快?一招搞定
  16. access和tagware_NDoc 用户指南
  17. 【打卡】汽车领域多语种迁移学习挑战赛
  18. android app整包更新,uniapp热更新和整包更新
  19. ride运行时报错ERROR
  20. Ravpower苹果20W充电器,充电快又稳,使用更安全

热门文章

  1. python实现密码的强度_字符串处理函数(二)python语言实现密码强度校验
  2. 计算机教师个人诊改方案,教师个人诊改报告-20210716124929.doc-原创力文档
  3. STM32配置一般过程(持续更新中)
  4. android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...
  5. 不通过AppStore,在iOS设备上直接安装应用程序的原理
  6. [转]在cocos2d-x中让一个项目适配iphone、iphone retina、ipad、ipad retina四种分辨率
  7. 装饰模式(Decorator Pattern)--------结构型模式
  8. Microsoft Hyper-V Server 2012开启虚拟化-虚拟机管理
  9. inux下如何查看CPU信息, 包括位数和多核信息
  10. 空空排错日志:OCS错误日志14501等解决办法