想要设计自己的微服务?看这篇文章就对了

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由我就静静地看 发表于云+社区专栏

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

该代码在Github上可用,并且可以在Docker Hub上获得图像。只需一个命令即可启动整个系统。

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

功能服务

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

img

帐户服务

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

METHODPATHDESCRIPTIONUSER AUTHENTICATEDAVAILABLE FROM UI
GET/accounts/{account}Get specified account data
GET/accounts/currentGet current account data××
GET/accounts/demoGet demo account data (pre-filled incomes/expenses items, etc) ×
PUT/accounts/currentSave current account data××
POST/accounts/Register new account

统计服务

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

METHODPATHDESCRIPTIONUSER AUTHENTICATEDAVAILABLE FROM UI
GET/statistics/{account}Get specified account statistics
GET/statistics/currentGet current account statistics××
GET/statistics/demoGet demo account statistics ×
PUT/statistics/{account}Create or update time series datapoint for specified account

通知服务

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

METHODPATHDESCRIPTIONUSER AUTHENTICATEDAVAILABLE FROM UI
GET/notifications/settings/currentGet current account notification settings××
PUT/notifications/settings/currentSave current account notification settings××

注意

  • 每个微服务都有自己的数据库,因此无法绕过API并直接访问持久性数据。
  • 对于这个项目,我使用MongoDB作为每个服务的主数据库。拥有多语言持久性体系结构(以便选择最适合服务要求的数据库类型)也是有意义的。
  • 服务到服务通信非常简单:微服务仅使用同步REST API进行通信。现实世界系统中的常见做法是使用交互方式的组合。例如,执行同步GET请求以检索数据并通过Message broker使用异步方法进行创建/更新操作,以便解耦服务和缓冲消息。这带给我们 一致性 。

基建服务

分布式系统中有许多常见模式,可以帮助我们使所描述的核心服务工作。Spring cloud 提供了强大的工具,可以增强Spring Boot应用程序的行为以实现这些模式。我简要介绍一下:

img

配置服务

Spring Cloud Config 是分布式系统的水平可扩展集中配置服务。它使用可插入的存储库层,目前支持本地存储,Git和Subversion。

在这个项目中,我使用 native profile,它只是从本地类路径加载配置文件。你可以在Config服务资源中查看 share 目录 。现在,当Notification-service请求它的配置时,使用shared/notification-service.yml 和 配置服务响应 shared/application.yml (在所有客户端应用程序之间共享)。

客户端使用

只需构建具有spring-cloud-starter-config 依赖性的Spring Boot应用程序 ,自动配置将完成剩下的工作。

现在,你的应用程序中不需要任何嵌入属性。只需提供 bootstrap.yml 应用程序名称和配置服务URL:

spring:application:name: notification-servicecloud:config:uri: http://config:8888fail-fast: true

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

例如, EmailService bean 使用注释 @RefreshScope。这意味着你可以更改电子邮件文本和主题行,而无需重建和重新启动Notification Service应用程序。

首先,在Config服务器中更改所需的属性。然后,对Notification服务执行刷新请求: curl -H "Authorization: Bearer #token#" -XPOST http://127.0.0.1:8000/notifications/refresh

你还可以使用 webhooks自动执行此过程。

注意

  • 动态刷新有一些限制。 @RefreshScope 不适用于 @Configuration 类,不能影响 @Scheduled 方法。
  • fail-fast property表示如果Spring Boot应用程序无法连接到Config Service,则会立即失败启动。当你同时启动所有应用程序时,这非常有用 。
  • 下面有重要的安全说明。

验证服务

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

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

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

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

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

@PreAuthorize("#oauth2.hasScope('server')")
@RequestMapping(value = "accounts/{name}", method = RequestMethod.GET)
public List<DataPoint> getStatisticsByAccountName(@PathVariable String name) {
    return statisticsService.findByAccountName(name);
}

API网关

如你所见,有三种核心服务,它们将外部API暴露给客户端。在现实世界的系统中,这个数字可以非常快速地增长,并且整个系统的复杂性也会增加。实际上,渲染一个复杂的网页可能涉及数百种服务。

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

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

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

zuul:
  routes:
    notification-service:
        path: /notifications/**
        serviceId: notification-service
        stripPrefix: false

这意味着所有以请求开头的请求 /notifications 都将路由到Notification服务。可以看到,没有硬编码的地址。Zuul使用 服务发现 机制来定位Notification服务实例以及 Circuit Breaker和Load Balancer。

Service Discovery

另一种众所周知的架构模式是Service Discovery。它允许自动检测服务实例的网络位置,这些服务实例可能由于自动扩展,故障和升级而动态分配地址。

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

使用Spring Boot,你可以轻松地使用spring-cloud-starter-eureka-server 依赖项, @EnableEurekaServer 注释和简单配置属性构建Eureka Registry 。

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

spring:application:name: notification-service

现在,在应用程序启动时,它将向Eureka Server注册并提供元数据,例如主机和端口,运行状况指示器URL,主页等.Eureka从属于服务的每个实例接收消息。如果故障超过可配置的时间表,则实例将从注册表中删除。

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

img

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

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

Ribbon

Ribbon是一个客户端负载均衡器,可以让你对HTTP和TCP客户端的行为进行大量控制。与传统的负载均衡器相比,每次线上调用都不需要额外的跳过 - 你可以直接联系所需的服务。

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

Hystrix

Hystrix是Circuit Breaker模式的实现 ,它可以控制通过网络访问的依赖关系的延迟和故障。主要思想是在具有大量微服务的分布式环境中停止级联故障。这有助于快速失败并尽快恢复 - 自我修复的容错系统的重要方面。

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

此外,Hystrix会为每个命令生成执行结果和延迟的指标,我们可以使用它来 监控系统行为。

Feign

Feign是一个声明式HTTP客户端,可与Ribbon和Hystrix无缝集成。实际上,通过一个 spring-cloud-starter-feign 依赖关系和 @EnableFeignClients 注释,你可以拥有一整套负载均衡器,断路器和HTTP客户端,并具有合理的即用型默认配置。

以下是帐户服务的示例:

@FeignClient(name = "statistics-service")
public interface StatisticsServiceClient {@RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)void updateStatistics(@PathVariable("accountName") String accountName, Account account);
}
  • 你需要的只是一个界面
  • 你可以在Spring MVC控制器和Feign方法之间共享 @RequestMapping
  • 以上示例指定了所需的服务ID - statistics-service感谢Eureka的自动发现(但显然你可以访问具有特定URL的任何资源)

监控仪表板

在此项目配置中,每个带有Hystrix的微服务都通过Spring Cloud Bus(使用AMQP代理)将指标推送到Turbine。Monitoring项目只是一个带有Turbine 和 Hystrix Dashboard的小型Spring启动应用程序 。

让我们看看我们在负载下的系统行为:帐户服务调用统计服务,它响应模仿延迟。响应超时阈值设置为1秒。

img

0 ms delay500 ms delay800 ms delay1100 ms delay
表现良好的系统。吞吐量约为22个请求/秒。统计服务中的活动线程数量很少。中位服务时间约为50毫秒。活动线程的数量正在增长。我们可以看到紫色线程池拒绝的数量,因此大约有30-40%的错误,但电路仍然关闭。半开状态:失败命令的比例超过50%,断路器启动。睡眠窗口的时间量后,下一个请求通过。100%的请求失败。电路现在永久开放。睡眠时间后重试不会再次关闭电路,因为单个请求太慢。

日志分析

在尝试识别分布式环境中的问题时,集中日志记录非常有用。Elasticsearch,Logstash和Kibana堆栈使你可以轻松搜索和分析日志,利用率和网络活动数据。我的其他项目中描述随时可用的Docker配置 。

安全

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

基建自动化

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

  • 随时发布软件的能力。
  • 任何构建都可能最终成为一个版本。
  • 构建工件一次,根据需要进行部署。

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

img

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

如何运行所有的东西?

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

在你开始之前

  • 安装Docker和Docker Compose。
  • 出口环境变量: CONFIG_SERVICE_PASSWORDNOTIFICATION_SERVICE_PASSWORDSTATISTICS_SERVICE_PASSWORDACCOUNT_SERVICE_PASSWORDMONGODB_PASSWORD

生产模式

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

发展模式

如果你想自己构建映像(例如,在代码中进行一些更改),则必须使用Maven克隆所有存储库并构建工件。然后,运行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 Spring Boot属性和 restart: always docker-compose选项。这意味着所有相关容器将尝试重新启动,直到Config Server启动并运行。

此外,Service Discovery机制在所有应用程序启动后需要一些时间。在实例,Eureka服务器和客户端在其本地缓存中都具有相同的元数据之前,客户端无法发现任何服务,因此可能需要3次侦听。默认侦听时间为30秒。

原文标题《Microservice Architectures With Spring Cloud and Docker》

作者:Alexander Lukyanchikov

译者:我就静静地看

不代表云加社区观点,更多详情请查看原文链接

问答
微服务架构的优势与不足?
相关阅读
Web应用程序开发指南
深度学习和神经网络的六大趋势
如何编写自己的jQuery插件?
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区!

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

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

相关文章

mysql 开发进阶篇系列 41 mysql日志之慢查询日志

一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒&#xff09;&#xff0c;获得表锁定的时间不算作执行时间。慢日志默认写入到参数datadir(数据目录)指定的路径下。默认文件名是[hostname]_slow.log&#xff0c;默认超时是10秒&#xff0c;默认不开…

分数相同名次排名规则C语言,如何给数据排名(相同分数相同名次)-excel篇

使用Rank函数来做数据排名该函数是返回一个数值在一个数字列表中的排名。语法&#xff1a;RANK(number,ref,order)RANK(对象,范围,参数)number(必填参数):是特定单位格中的数据&#xff0c;需要在整个数字列表中排名的单个对象。ref(必填参数):是指需要排名的整体数列。即范围&…

MySql的连接查询

若一个查询同时涉及到两个或者两个以上的表&#xff0c;则称之为连接查询。常见的包括&#xff1a;等值连接查询&#xff0c;自然连接查询&#xff0c;非等值连接查询&#xff0c;自身连接查询&#xff0c;外连接查询&#xff08;左右连接&#xff09;。 1.等值与非等值连接查询…

qt运行C语言后无显示,qt designer启动后不显示界面问题的原因与解决办法-站长资讯中心...

Qt 5.6.1无论是在vs里双击ui文件还是直接启动designer.exe都一直无法显示界面&#xff0c;但任务管理器中可以看到该进程是存在的。前几天还正常的&#xff0c;但昨天加了一块NVIDIA的显卡(机器自带核显)&#xff0c;可能与此有关。幸好还可以通过QtCreator打开ui文件进行编辑。…

OpenSolaris北京用户组的第一次活动

OpenSolaris北京用户组的第一次活动作者: BadcoffeeEmail: blog.olivergmail.comBlog: http://blog.csdn.net/yayong2005年10月10月15号&#xff0c;OpenSolaris北京用户组在北京西郊宾馆会议厅组织了成立以来的第一次活动。尽管OpenSolaris早在2005年6月14日就正式开放源代码&…

Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

Android PermissionUtils&#xff1a;运行时权限工具类及申请权限的正确姿势 ifadai 关注 2017.06.16 16:22* 字数 318 阅读 3637评论 1喜欢 6PermissionUtil 经常写Android运行时权限申请代码&#xff0c;每次都是复制过来之后&#xff0c;改一下权限字符串就用&#xff0c;把…

Linux基础监控小工具nmon

nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具&#xff0c; nmon所记录的信息是比较全面的&#xff0c;它能在系统运行过程中实时地捕捉系统资源的使用情况&#xff0c;并且能输出结果到文件中。nmon工具可以帮助在一个屏幕上显示所有重要的性能优化信息&…

vue的配置环境篇

1.电脑已经安装的nodejs和webpack。 2.1&#xff09;打开cmd。winr。可以直接输入node -v查看版本。安装淘宝镜像 npm install -g cnpm --registryhttp://registry.npm.taobao.org &#xff0c;安装成功可以查看下&#xff0c;cnpm -v 3.安装vue脚手架&#xff0c;输入命令&am…

Agilent RF fundamentals (4)- Impedance match and distortions

1 Impedance match&#xff1a; 2 distortions&#xff1a; Solar radiation produces background noise 转载于:https://www.cnblogs.com/huangbaobaoi/p/9650937.html

android论坛功能开发教程,Android教程 如何免费生成论坛App

介绍按照快速集成文档&#xff0c;您可以很容易的把BBSSDK提供的功能集成到您的应用中&#xff0c;然后使用BBSSDK来做开发。在集成前&#xff0c;您也可以先下载示例Sample的源码工程(包含应用内打开pdfoffice等格式文件)。使用Android Studio打开后&#xff0c;编译出网站上提…

自动化测试===adb 解锁手机的思路

在adb里有模拟按键/输入的命令 比如使用 adb shell input keyevent <keycode> 命令&#xff0c;不同的 keycode 能实现不同的功能&#xff0c;完整的 keycode 列表详见 KeyEvent&#xff0c;摘引部分我觉得有意思的如下&#xff1a; keycode含义3HOME 键4返回键5打开拨号…

android 编译器有问题,Android Studio 3.0 Beta 2发布:解决编译器bug

5月18日&#xff0c;IT之家曾经报道&#xff0c;谷歌发布了Android Studio 3.0的测试版&#xff0c;新增了对Kotlin语言的支持&#xff0c;而日前&#xff0c;谷歌发布了Android Studio 3.0的Beta 2版本。此版本并无新功能加入&#xff0c;不过修复了一个困扰开发人员的bug&…

Kali安装magescan评估工具

Magento &#xff08;麦进斗&#xff09; 是一套专业开源的电子商务系统。Magento设计得非常灵活&#xff0c;具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。其面向企业级应用&#xff0c;可处理各方面的需求&#xff0c;以及建设一个多种用途和适用面的电子…

领域驱动设计在马蜂窝优惠中心重构中的实践

前言 正如领域驱动设计之父 Eric Evans 所著一书的书名所述&#xff0c;领域驱动设计&#xff08;Domain Driven Design&#xff09;是一种软件核心复杂性应对之道。 在我们解决现实业务问题时&#xff0c;会面对非常复杂的业务逻辑。即使是同一个事物&#xff0c;在多个子业务…

鸿蒙系统发布会是什么时候,鸿蒙系统2.0发布时间是什么时候?或将与EMUI11一同发布!...

对于鸿蒙系统OS一直以来就备受大家的关注&#xff0c;作为华为自主研发的操作系统&#xff0c;它是华为之光&#xff01;很多人翘首盼望着它的到来&#xff0c;自1.0版本后鸿蒙系统2.0发布时间似乎确定下来了&#xff01;届时会与EMUI11一同向大家介绍&#xff01;今日&#xf…

HZNU 2019 Summer training 8

A - Petya and Origami CodeForces - 1080A 题意&#xff1a;制造一份邀请函需要2份a物品&#xff0c;5份b物品&#xff0c;8份c物品&#xff0c;一个盒子里面有k份物品&#xff08;可以为a或b或c&#xff09;问你制造n份邀请函需要用多少个盒子 题解&#xff1a;加起来就行了…

android layer-list,Android layer-list的属性和使用具体解释

Android layer-list的属性和使用具体解释。layer-list是用来多个图层堆叠显示的&#xff0c;借这个特性能够做一些特别的效果(比方&#xff1a;阴影、以下的效果等)&#xff0c;也能够投机取巧。1.代码片2.布局代码和效果图 (一定要注意在使用RadioGroup的时候要记的写RadioBut…

数据库字段属性配置工具界面[用于代码生成]

在CodeSmith中为了实现对数据库中表字段的选择和针对字段来设置属性&#xff0c;决定用XML文件作为中间数据的交换方式&#xff0c;在CodeSmith中读取数据库对象的信息不再使用SchemaExplorer来读取&#xff0c;而是转为直接对XML文件的读取。<?xml:namespace prefix o ns…

Zookeeper环境安装

源码包下载&#xff1a; http://archive.apache.org/dist/zookeeper/zookeeper-3.4.10 集群环境&#xff1a; master 192.168.1.99 slave1 192.168.1.100 slave2 192.168.1.101 下载安装包&#xff1a; # Mater wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.1…

鸿蒙系统用没有安卓的代码,套壳?不存在!纯鸿蒙系统不含任何安卓代码,其他手机厂商可使用...

众所周知&#xff0c;华为的鸿蒙系统已经应用于许多华为机型上&#xff0c;例如Mate40、MataX2等&#xff0c;同时不少家电厂商也和华为合作推出了基于鸿蒙的终端设备&#xff0c;比如美的、老板等。那么&#xff0c;和华为处于竞争关系的手机厂商可以使用鸿蒙系统吗&#xff1…