如何安全快速的搭建一个微服务架构

当我第一次开始构建应用程序时,他们都是差不多的。幻灯片中所展示的单体架构也象征了应用程序的构造方式。

目前存在着某种类型的虚拟机(VM),对我来说,就是通常的Java。在虚拟机中应用的功能组件以对象的形式存在,这些对象是在内存中相互通讯的,它们将来来回回处理并进行方法调用。偶尔,你会采用诸如通知等机制来接触到其他系统以便获取数据或传递信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有了微服务之后,应用程序如何构建的范式是完全不同的了。你的功能组件会从在同一个主机的内存中通过虚拟机相互通讯转变到部署在容器中,并且使用Restful API调用通过HTTP来相互连接。

这是非常强大的,因为它赋予了你功能隔离。它为您提供了更细粒度的可伸缩性,并且你可以获得更好地处理故障的弹性。很多情况下这是简单的事实,你只需要使用HTTP进行跨网络调用。

现在,这种方法也有一些缺点。

一件轶事

====

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我有一个暗黑的秘密,我是一个微软的员工并且从事.Net开发已经很多年了。当我在那儿的时候,我搭建了一个他们的名为Showcase的视频发布平台。

Showcase是一个用来将微软内部发布的所有视频发布到网上的工具。人们可以观看这些视频并进行学习,比如Microsoft Word的使用提示和技巧。这是一个非常受欢迎的平台,我们有很多人使用它,并且其中很多人都会在我们发布的视频上发表评论。

Showcase从一开始就是一个.Net单体应用,随着它日益受欢迎,我们决定应该将它更换为SOA架构。转换是相对容易的。Visual Studio提供了本质上的翻转开关的能力,也就是将你的DLL调用转变为Restful API调用。随着一些小的重构,我们能够让我们的代码运行得相当好。我们也为这些评论和应用内的社区功能使用智能社区服务。

紧密的回路问题

=======

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看起来我们是SOA可行的,在我们的首次测试中,一切都工作正常,直到我们将系统切换到我们的Staging环境并开始使用生产环境数据时,我们就会看到一些严重的问题。这些问题在在页面上有很多评论。

这是一个非常受欢迎的平台,其中的一些页面已经有多达2000条评论了。当我们深入这些问题时,我们意识到这些页面需要花费一分钟进行渲染的原因是因为智能社区服务首先需要填充用户名,然后对每一个用户名都需要发起一个对于用户数据库的网络调用来获得用户详细信息并且填充在渲染页面上。这是非常低效的,需要一到两分钟来渲染页面,而在内存中进行通常只需要5到6秒钟。

缓解

==

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们经历了发现和解决问题的过程后,我们最终通过一些措施来调整优化系统,比如对所有的请求进行分组。我们缓存了一些数据,最终我们优化了网络来真正的提高性能。

所以,这与微服务有什么关系呢?对的,借助于微服务,你基本上是采用SOA架构的,并且会将其放入超光速引擎中。在SOA架构中所有的对象都是包含在单个虚拟机中并且在其内部管理,在内存中相互通讯,而现在微服务中是使用HTTP进行数据交换的。

当这样做没有问题时,你会获得很好的性能和线性可伸缩性。

Nginx能够很好地与微服务工作

================

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Nginx是一个你可以用来过渡到微服务的最佳工具之一。

关于Nginx和微服务的一些历史。我们从一开始就参与了微服务运动,还是第一个从Docker Hub下载应用的,我们的客户以及那些拥有一些世界上最大的微服务安装量的最终用户广泛地在他们的基础设施使用Nginx。

原因是Nginx很小、很快并且很可靠。

Nginx微服务参考架构

============

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还致力于在Nginx内部使用微服务工作已经有一段时间了。这是一个我们已经搭建的程式化的Nginx微服务参考架构,目前正在AWS上运行。

我们拥有6个核心的微服务,它们都运行在Docker容器里。我们决定建立一个多语种的应用,所以每个容器都可以运行不同的语言,我们目前使用了Ruby、Python、PHP、Java和Node.js。

我们搭建了这个使用十二要素应用的系统,稍加修改,就会使其更好地为微服务工作从而可以替代Roku平台。稍后,我们将向您展示一个实际上运行在demo里的应用。

MRA的价值

======

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么我们要建立这样一个参考的微服务架构呢?

我们建立这个参考架构是因为我们需要给我们的客户提供构建微服务的蓝图,我们也想在微服务上下文中测试Nginx和Nginx Plus的功能,弄清楚如何才能更好地利用它的优势。最后,我们要确保我们对于微服务生态系统以及其可以给我们提供什么有一个深入的理解。

网络问题

====

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们回到我们讨论的大转变。

从将运行在内存里并且被虚拟机管理的你的应用的所有功能组件迁移到通过网络进行工作并且相互通讯的方式,你会本质上引入一系列为了应用有效工作需要你解决的问题。

第一你需要服务发现,第二,你需要在架构中为所有不同的实例进行负载均衡,然后还有第三个,你需要操心性能和安全。

无论是好是坏,这些问题密不可分,你必须做权衡,有希望的是我们有一个可以解决所有这些问题的解决方案。

让我们更深入地看待每一个问题。

服务发现

====

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们来谈谈服务发现。在单体应用中,APP引擎会管理所有的对象关系,你永远不必担心一个对象与另一个对象的相对位置,你只需要简单的调用一个方法,虚拟机会连接到对象实例,然后在调用完毕后销毁。

然后有了微服务,你需要考虑那些服务的位置。不幸的是,这不是一个普遍的标准流程。您正在使用的各种服务注册中心,无论是Zookeeper、Consul、etcd或者其它的,都会以不同的方式进行工作。在这个过程中,你需要注册你的服务,还需要能够读取这些服务在哪里并且可以被连接。

负载均衡

====

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二个问题是关于负载均衡的。当您拥有多个服务实例时,您希望能够轻松地连接到它们,将您的请求在它们中高效地分发,并以最快的方式执行,所以不同实例之间的负载均衡是非常重要的问题。

不幸的是,最简单形式的负载均衡是非常低效的。当你开始使用不同的更加复杂的方案做负载均衡时,它也变得更加复杂并且不易于管理。理想情况下,您希望您的开发人员能够基于他们的应用程序的需求决定何种负载均衡方案。例如,如果你连接到一个有状态的应用程序,你需要拥有持久化,这样可以确保你的Session信息会被保留。

安全和快速通讯

=======

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

也许微服务最令人生畏的领域是性能和安全。

当在内存中运行时,一切都很快。现在,运行在网络上就会慢了一个数量级。

被安全地包含在一个系统中的信息,通常是二进制格式的,现在会被用文本格式在网络上传输。现在是比较容易在网络上布置嗅探器并能够监听你的应用正在被移动的所有数据。

如果要在传输层加密数据,那么会在连接速率和CPU使用率方面引入显著的开销。SSL/TLS在其全面实施阶段需要九个步骤来初始化一个请求。当你的系统每天需要处理成千上万、几万、数十万或数百万的请求时,这就成为性能的一个重要障碍了。

一个解决方案

======

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们已经在Nginx开发的一些解决方案,我们认为,会解决所有的这些问题,它赋予你健壮的服务发现、非常棒的用户可配置负载均衡以及安全和快速加密。

网络架构

====

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们来谈谈你可以安装和配置你的网络架构的各种方法。

我们提出了三种网络模型,它们本身并不相互排斥,但我们认为它们属于多种格式的。这三种模式是Proxy模式、Router Mesh模式和Fabric模式——这是最复杂的,并在许多方面在其头部进行负载均衡。

Proxy模式

=======

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Proxy模式完全聚焦于你的微服务应用的入站流量,并且事实上忽略内部通讯。

你会获得Nginx提供的所有的HTTP流量管理方面的福利。你可以有SSL/TLS终止、流量整形和安全,并且借助于最新版本的Nginx Plus和ModSecurity,你可以获得WAF能力。

你也可以缓存,你可以将Nginx提供给你的单体应用的所有东西添加到你的微服务系统里,并且借助于Nginx Plus,你可以实现服务发现。当你的API实例上下浮动时,Nginx Plus可以在负载均衡工具里动态地添加和减去它们。

Router Mesh模式

=============

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

img

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-snu8tCQz-1713634272503)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值