1. 什么是微服务架构主流的微服务如何实现
简单地说,微服务架构就是以业务域或业务功能为边界,将一个大而全的应用拆分为可以独立开发,独立部署,独立测试,独立运行的一组小的应用,并且使用轻量级,通用的机制在这组应用间进行通信。
主流的微服务包括:
1、SpringCloud
Spring Cloud , 来自Spring,具有Spring 社区的强大支撑,还有Netflix强大的后盾与技术输出。Netflix作为一家成功实践微服务架构的互联网公司在几年前就把几乎整个微服务框架栈开源贡献给了社区,这些框架开源的整套服务架构套件是Spring Cloud的核心。
- Eureka:服务注册发现框架;
- Zuul:服务网关;
- Karyon:服务端框架;
- Ribbon:客户端框架;
- Hystrix:服务容错组件;
- Archaius:服务配置组件;
- Servo:Metrics组件;
- Blitz4j:日志组件;
2、Dubbo
Dobbo是一个分布式服务框架,是阿里开放的微服务化治理框架,致力于提高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分(官网)
- 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式;
- 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持;
- 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo 也是采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo的配置即可,Dubbo 基于 Spring 的 Schema 扩展进行加载。当然也支持官方不推荐的 API 调用方式。
3、lstio
lstio 作为用于微服务聚合层管理的新锐项目,是Google、IBM、Lyft(海外共享出行公司、Uber劲敌),首个共同联合开源的项目,提供了统一的连接,安全,管理和监控微服务的方案。
目前首个测试版是针对Kubernetes环境的,社区宣称在未来几个月内会为虚拟机和Cloud Foundry 等其他环境增加支持。lstio将 流量管理添加到微服务中,并为增值功能(如安全性、监控、路由、连接管理和策略)创造了基础。
- HTTP、gRPC 和 TCP 网络流量自动负载均衡;
- 提供了丰富的路由规则,实现细颗粒度的网络流量行为控制;
- 流量加密、服务件认证,以及强身份声明;
- 全范围(Fleet-wide)的策略执行;
- 深度遥测和报告。
2. Spring微服务灰度发布(热部署)的实现(二)
接着上篇说,我们微服务中用到的nepxion discovery主要采用了三种灰度发布方式,一种是web图形化界面发布,二是zuul过滤器灰度发布,三是业务参数策略灰度发布。下面将重点介绍三种方式的实现。
一、web图形化界面灰度发布
因为我们项目用到了eureka注册中心,所以选择web图形化界面灰度发布比较合适。
1) 首先需要建立一个discovery控制台工程console, 端口为2222,控制台工程负责web图形化界面请求的处理,运行console工程。
2) 下载discovery ui,地址:https://github.com/Nepxion/DiscoveryUI,运行discovery UI,端口为8090
3)浏览器中输入localhost:8090,即可打开控制台,如下
注意:全链路灰度发布需要在“配置中心”下才可用。灰度发布配置中心,负责存储全链路灰度发布规则,并将规则推送到各个微服务中。而配置中心可用nacos,redis等,Discovery 中提供了相应配置中心的插件包。
二、zuul网关过滤器灰度发布
通过网关过滤器传递Http Header的方式传递全链路灰度路由规则。下面代码只适用于Zuul和Spring Cloud Gateway网关,Service微服务不需要加该方式。
三、业务参数在策略类中自定义灰度路由规则
通过策略方式自定义灰度路由规则。下面代码既适用于Zuul和Spring Cloud Gateway网关,也适用于Service微服务,同时全链路中网关和服务都必须加该方式
上面说了具体灰度规则发布方式,那究竟怎么定义灰度规则呢??
规则是基于XML或者Json为配置方式,存储于本地文件或者远程配置中心,可以通过远程配置中心修改的方式达到规则动态化。其核心代码参考discovery-plugin-framework以及它的扩展、discovery-plugin-config-center以及它的扩展和discovery-plugin-admin-center等,规则示例
XML示例(Json示例见discovery-springcloud-example-service下的rule.json)
黑/白名单的IP地址注册的过滤规则
微服务启动的时候,禁止指定的IP地址注册到服务注册发现中心。支持黑/白名单,白名单表示只允许指定IP地址前缀注册,黑名单表示不允许指定IP地址前缀注册。规则如何使用,见示例说明
最大注册数的限制的过滤规则
微服务启动的时候,一旦微服务集群下注册的实例数目已经达到上限(可配置),将禁止后续的微服务进行注册。规则如何使用,见示例说明
黑/白名单的IP地址发现的过滤规则
微服务启动的时候,禁止指定的IP地址被服务发现。它使用的方式和“黑/白名单的IP地址注册的过滤规则”一致
版本访问的灰度发布规则
版本权重的灰度发布规则
全局版本权重的灰度发布规则
区域权重的灰度发布规则
全局区域权重的灰度发布规则
网关端全链路路由策略的灰度发布规则
注意 路由策略的入口有三个(以{"discovery-springcloud-example-a":"1.0", "discovery-springcloud-example-b":"1.0", "discovery-springcloud-example-c":"1.0;1.2"})为例:
其作用的优先级为外界传入>网关Filter指定>配置中心或者本地rule.xml配置
您可以根据自己需求,自由定义灰度发布规则,灵活实现微服务的灰度发布。
源码位置:https://github.com/Nepxion/Discovery
3. 如何用Nginx快速搭建一个安全的微服务架构
教你如何用Nginx搭建一个安全的、快速的微服务架构
今天我们要谈论微服务以及如何使用Nginx构建一个快速的、安全的网络系统。最后,我们将向您展示一个使用Fabric模式如何非常快速和轻松地构建一个微服务的demo。
在我们探讨Fabric模式之前,我想谈一谈微服务并且从Nginx的角度来看这意味着什么。
0:56 - 大转变
微服务已经引起了应用程序架构的重大转变。
当我第一次开始构建应用程序时,他们都是差不多的。幻灯片中所展示的单体架构也象征了应用程序的构造方式。
目前存在着某种类型的虚拟机(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模式
Router Mesh模式类似于Proxy模式,在其中我们有一个前端代理服务来管理接入流量,但它也在服务之间添加了集中式的负载均衡。
每个服务连接到集中式的Router Mesh,它管理不同服务之间的连接分发。Router Mesh模式还允许你在熔断器模式中搭建,以便可以对你的应用添加弹性并允许你采取措施来监控和拉回你的失效的服务实例。
不幸的是,因为该模式增加了一个额外的环节,如果你不得不进行SSL/TLS加密,它事实上加剧了性能问题。这就是引入Fabric模式的原因。
Fabric模式
Fabric模式是将其头部的所有东西翻转的模式。
就像之前的另外两个模式一样,在前面会有一个代理服务器来管理流入流量,但与Router Mesh模式不同的地方就是你用运行在每个容器里的Nginx Plus来替代了集中式的Router。
这个Nginx Plus实例对于所有的HTTP流量作为反向和正向代理,使用这个系统,你可以获得服务发现、健壮的负载均衡和最重要的高性能加密网络。
我们将探讨这是如何发生的,以及我们如何处理这项工作。让我们先来看看一个服务如何连接和分发他们的请求结构的正常流程。
正常的流程
在这个图中,你可以看到投资管理器需要跟用户管理器通讯来获取信息。投资管理器创建了一个HTTP客户端,该客户端针对服务注册中心发起了一个DNS请求并获得返回的一个IP地址,接着初始化了一个到用户管理器的SSL/TLS连接,该连接需要通过九阶段的协商或者是”握手”过程。一旦数据传输完毕,虚拟机会关闭连接并进行HTTP客户端的垃圾回收。
整个过程就是这样。这是相当简单和易于理解的。当你把它分解成这些步骤时,您可以看到该模式是如何真正完成请求和响应过程的。
在Fabric模式中,我们已经改变了这一点。
Fabric模式的细节
你会注意到的第一件事是Nginx Plus是运行在每一个服务里的,并且应用程序代码是在本地与Nginx Plus通信的。因为这些是本地连接,你不需要担心加密问题。它们可以是从Java或者PHP代码到Nginx Plus实例的HTTP请求,并且都是在容器内的本地HTTP请求。
你也注意到Nginx Plus会管理到服务注册中心的连接,我们有一个解析器,通过异步查询注册中心的DNS实例来获取所有的用户管理器实例,并且预先建立连接,这样当Java服务需要从用户管理器请求一些数据的时候,可以使用预先建立的连接。
持久的SSL/TLS连接
微服务之间的有状态的、持久化的并且可以加密的连接是真正的益处。
记得在第一个图中服务实例是如何通过一些流程的吧,比如创建HTTP客户端、协商SSL/TLS连接、发起请求并关闭的吗?在这里,Nginx预先建立了微服务之间的连接,并使用Keepalive特性,保持调用之间的持续连接,这样你就不必为每一个请求处理SSL/TLS协商了。
本质上,我们创建了一个迷你的从服务到服务的VPN连接。在我们最初的测试中,我们发现连接速度增加了77%。
熔断器Plus
在Fabric模式以及Router Mesh模式中,你也可以从创建和使用熔断器模式中获得好处。
本质上,您定义了一个在服务内部的活跃的健康检查,并设置缓存,以便在服务不可用的情况下保留数据,从而获得完整的熔断器功能。
所以,现在我可以确定你认为Fabirc模式听起来很酷,并且想在实际环境中跃跃欲试。