微服务上云快速入门指引

软件架构 创建于:2023-05-29

导语

微服务产品团队为了广大开发者朋友们可以更好的使用腾讯云微服务产品,将持续为大家提供微服务上云快速入门的指引性文档,内容通俗易懂易上手,本篇为本系列的第一篇,欢迎大家收看。

微服务架构

下图是一个典型的微服务架构。从图中可以看到请求从前端进来之后,通常会有一个网关来承接所有的请求,这个网关通常承载的是负载均衡的作用,以及流量路由相关的一些功能。然后网关会把请求转发到后端的微服务中去,那么服务与服务之间互相调用,就会涉及到服务的注册与发现,需要有一个注册中心来管理所有的注册与发现,而服务所有的配置也需要进行统一管理,这个时候也需要有一个配置中心来负责所有服务的配置管理。服务在这个过程中,可能需要去做熔断限流以及动态路由这些操作,这就可能用到服务治理相关的框架或者工具来帮我们完成。同时在整个过程中都需要有完善的监控数据来帮助我们排查故障。最后这些服务调用底层的数据库,比如说MongoDB、MySQL,或者其他中间件消息队列等,以上就组合成了下图这个典型的微服务架构。

应用场景

在上述的微服务架构下,有哪些可以用到的应用场景呢?

微服务场景一:构建安全可靠、功能强劲的业务网关

典型Web架构:Nginx网关

一个典型的基于Nginx的web架构是什么样子呢?如上图所示,可以看到来自于网页、小程序、APP的请求进来后,会经过一个负载均衡,然后把请求转发到Nginx, Nginx负责把请求转发到后端的web服务中去,后端可能是PHP、Tomcat等,这个流程就是一个典型的web架构。

典型微服务架构:服务网关

而典型的微服务架构是什么样子呢?除了上图展示的Nginx和负载均衡的部分外,通常还会有一个服务网关,如图上所画的,会有Spring Cloud Gateway来作为服务网关去访问后端的服务,服务网关通常会和服务注册中心配合去做网关直通服务的自动发现,这样就可以实现网关直达服务的诉求。

微服务之 Nginx Ingress

另外一个场景,微服务Ingress的模式配合K8s,在网关层面创建一个Ingress Controller来负责和底层的服务以及K8s控制台实现从网关直达服务的场景。

以上三个是网关层面的典型的微服务架构下的应用场景,微服务的场景除了有网关,还会涉及到注册配置中心。

微服务场景二:构建轻量、高可用、易伸缩的微服务架构

微服务核心组件 = 网关 + 注册中心 + 配置中心

如上图所示,除了网关,我们还会配合注册配置中心来管理所有服务的实例,也会涉及到在这个过程中使用到监控和链路追踪来帮助我们更好的去查看业务的运行状况以及故障排查,最后会去访问底层的数据库和一些中间件,在这个过程中用到的注册中心涉及到的使用场景是什么样子的呢?

注册中心:使用场景

  • 服务注册与发现

如下图所示,提供者注册到服务之后,让消费者能够发现这个服务,服务消费者就通过服务注册中心去调用提供者。

  • 客户端健康检查

第二种场景是客户端健康检查,如果有100个服务,我们怎么确认100个服务都是正常运行的,这个时候就可以利用注册中心来去实现客户端的健康检查。注册中心提供健康检查的能力,基于心跳上报方式维持活性,服务端在x秒内如果没收到客户端的心跳请求,会将该实例设置为不健康,在x秒内没收到心跳,会将这个临时实例摘除。以确保服务的可用性。

  • 内网DNS访问

最后一种场景是通过注册中心提供DNS接入能力,支持将注册中心的数据以域名的形式暴露出来,客户端可以直接通过域名寻址进行直连服务的调用,无需使用CLB转发。

以上是注册中心的几大使用场景。接下来看一下配置中心。

配置中心:使用场景

配置中心的使用场景大致可以分为两类。

  • 业务配置

1、第一种情况:上线新功能的时候,如果想要根据地域用户等信息来去进行灰度,就可以通过配置中心动态管理想要灰度条件。

2、第二种情况:当进行促销活动的时候,通常会有抽奖,中奖的概率,参数的控制,我们期望是实时动态的控制,这个时候就可以利用配置中心实现。

3、第三种情况:可以通过配置中心动态的展示一条公告。

  • 基础组件配置

比如在开发过程中会用到数据库的访问密钥,以及日志的设置,或者其他组件设置参数,这些参数都可以通过配置中心来统一管理,这样就不需要对每个服务进行修改,减少工作量。

生产阶段:保证多活容灾

在一个典型的微服务架构里面,涉及到网关注册配置中心还有服务本身,怎么去保证整体架构的多货容灾呢?那么就会有下面这样一个部署架构了。云原生网关和注册配置中心可以帮助业务架构实现多活容灾:

  • 云原生网关和注册配置中心的服务端采用同城三可用区部署
  • 业务应用可以采用同城多可用区部署。一个应用的多个节点部署在不同的可用区,注册到同一个服务下。

图中红色的线是可用区的分割线,在上图里面展示了三个可用区。如果要做到一个架构的高可用,就得保证使用到的每一个组件都是跨可用区部署的,比如说我们的网关在这三个可用区都会部署一个节点,然后我们服务本身也是跨可用区,在多个可用区部署不同的节点,到了注册配置中心也是一样的,每个注册配置中心都是三节点来去部署,然后同时都是跨可用区的,这样就可以保证在实际的业务场景中,任何一个可用区挂了之后,整体的微服务架构仍然是可用的,从而实现多获容灾的一个场景。

微服务应用场景三:实现全链路的流量和服务治理

测试阶段:解决多测试环境的流量路由问题

如何解决测试环境的流量路由问题呢?

从上图看我们想要解决什么问题呢?开发者做微服务开发的时候,可能会有多个服务,如果想要进行联调,通常会到一个环境里面把所有的服务都部署一遍,然后做端到端的测试,但如果服务变多,开发团队并行工作变多,那就很难协调。

理想状况就是能不能通过一种方式让多个测试环境并存,同时又只需要按需部署,那不同的团队使用不同的环境,就能做到这样的测试需求呢?答案是有的,那就是利用TSE云原生网关加服务治理来实现这种多环境的流量路由。那么做法是什么呢?

首先通过服务治理对实例进行环境标签的实例打标,如上图所示,把测试环境分为三个环境,第一个是基线环境,基线环境就是正常部署测试的服务,以及两个特性环境,团队一就用左边的特性环境,团队二就用右边的特性环境,当团队一想要测试的时候,他只需要把需要测试的服务部署到左边的特性环境。然后对这些部署的实例进行一个标记,把它标为feature1,然后在云原生网关里面触发请求的时候,对请求也打一个标记,也把它标为feature1,这个时候就可以自动的把这个请求路由到我们标记好的实例里面来实现流量的路由。同时这样路由的过程中也可以实现跨环境标签路由,比如说我从左边的特性环境去访问基线环境,然后机线环境能够根据标签的路由回到这个特性环境里面,这样就实现了多测试环境的流量路由问题。

适用场景:某个微服务应用,在开发测试时,不需要部署所有的服务,仅部署本次有变更的服务,其他服务通过流量动态路由的方式复用基线环境服务资源。

优势

节约资源成本,开发/测试按需申请,用完即弃

提升研发效率,摆脱大量域名本地绑定 hosts 等配置化工作

实现方案

1、实例打标

K8s注册场景:在workload上通过添加pod labels打上环境标签。

微服务框架注册场景:对服务下所有实例进⾏分组,通过标签能够区分部署的环境。

2、流量染色

云原生网关可以对流量特性进⾏染色。例如:给特定uin的请求进行染色。

3、网关到后端服务的流量路由

通过标签路由,按照请求中的测试环境信息进行动态路由。

4、后端服务与服务间的路由

对链路上各服务能够根据请求流量特征对不同测试环境中的服务进⾏动态路由。

发布阶段:金丝雀、滚动或者蓝绿发布

另一个微服务架构下,会涉及到的问题就是发布。

目前有三种流行的发布方式,一种是金丝雀发布,一种是滚动发布,一种是蓝绿发布,这三种常见的发布策略原理都是一样,都是期望在发布的过程中,把要发布的新的版本都做到绝对的测试,让所有的用户用的过程中,避免说我的新版本有任何问题影响到所有的用户。但是在发布的过程中,这三种发布方式的策略会有一些不一样。

  • 金丝雀发布

金丝雀发布就是对于本次的发布,按比例去升级,一定的实例,没有问题的话,再逐步的放开这个比例,直到最终所有的流量都到了V2版本,这就实现了一个金丝雀。

  • 滚动发布

对于本次发布的服务,先升级一个/批实例,测试没问题了,再分批升级剩余实例,直到所有实例都升级到V2版本。

  • 蓝绿发布

蓝绿发布是把实例分为两个阵营,一个绿阵营和一个蓝阵营,正在运行的实例是V一版本,把它放到绿阵营,这个时候部署了新的实例V2版本到蓝阵营里面。然后对V2版本进行全面的测试,测试没问题了之后再通过负载均衡,把流量从V1切到V2,这样就实现了一个无缝的发布,同时保证新版本线上环境的全面测试.

发布阶段:全链路灰度

有了以上这几种发布策略,就可以实现另外一种大家想要的效果了,也就是全链路灰度。

全链路灰度是什么意思呢?比如说我们在用微信时可能会遇到一种情况,有些新功能我有了,但别人没有,其实就是你被选中作为灰度用户正在测试新功能,新功能在灰度环境测试没问题了,才会让所有的用户都用到这个功能。

在微服务的架构下怎么去实现这种效果呢?首先需要在生产环境把部署的实例分为两个环境,一个是正式环境,另外一个是灰度环境。如果想要升级,就需要对即将升级的服务进行灰度测试,按照之前所说的的方式把新的实例部署之后,通过实例打标的方式,把它标记为灰度环境里面的实例,比如说标记版本为V2,这个时候只需要在网关层面,在请求进来的时候,对于想要灰度的用户进行这个流量染色,比如说把上海地区的用户标记为V2,那么所有上海用户的流量都会进入到灰度环境里面进行灰度测试,灰度环境测试没有问题了,再把所有的服务都部署上来,然后把所有的流量都切到灰度环境,这样整个灰度就实现。这样可以帮助我们做到端到端的环境测试,也能做到隔离流量甬道,也可以做到一键切流。

优势

  • 全链路隔离流量泳道​
  • 端到端的稳定环境​
  • 流量一键切流​
  • 可观测能力

实现方案

1、实例打标

K8s注册场景:在workload上通过添加pod lables打上版本标签。

微服务框架注册场景:对服务下的所有实例进⾏分组,通过标签能够区分版本。

2、流量染色

网关对流量特性进⾏灰度染色。有动态染色与静态染色两种方式。

3、网关到后端服务的流量路由

通过标签路由,按照请求中的服务版本信息进行流量转发。

4、后端服务与服务间的路由

在链路上各服务能够根据请求流量特征进⾏动态路由。

生产阶段:就近访问和多活容灾

在生产阶段,微服务的架构里有两个比较重要的场景,第一个是就近访问,第二个是多活容灾。

什么是就近访问呢?一般大的微服务项目都会在不同的地区去部署,比如说某个微服务项目在上海和广州都有部署,有个上海的用户想要访问这个服务,但是请求转发到了广州,因为地域的原因会造成一定的网络延迟。那我们肯定更期望上海的用户就访问到上海的服务实例,广州的用户就访问到广州,这个时候就需要用到就近访问,就近访问就是帮我们把部署的实例进行一个地域标记。把地域信息标记到实例上,这样当有请求进来的时候,就可以根据这个地域信息找到最近的实例来提供这种就近访问的能力。

多活容灾分为两个层面,第一个是在入口层面做多活容灾,第二个是在应用层面做多活容灾。先说入口层,如下图所示,我们在网关层面去连接后端不同的可用区,一旦任何一个可用区挂了,网关都可以做到流量可跨可用区的切换,来保证我们的请求不会在网关层面给挂。那如果一个城市,比如说广州整个区都挂掉了之后,网关是可以把这个流量做跨城容灾切换的,把它全部切到上海区去,这样就可以保证请求在网关层面可以做到无缝切换,来保证我们入口层的多活容灾。

到了应用层,如下图所示,积分中心访问活动中心的时候,如果广州一区的活动中心挂掉了,那么我们就可以在这个服务层面去利用动态路由的能力,把积分中心访问活动中心做一个同城切换,切到广州二区的活动中心。那如果整个广州区都挂了的时候,就可以把这个请求直接跨城切换到上海区,让上海的服务的实例来响应这样的请求,这样就在应用层做到了多活容灾。

优势

通过云原生网关和北极星服务治理中心提供接入层与应用层的多活容灾与就近访问。实现故障快速恢复、容量快速扩容。

  • 自动获取服务实例的地域信息

  • 自动根据地域信息进行就近路由

  • 跨可用区、跨地域容灾切换

生产阶段:限流场景

限流阶段

1.接入层流量限流

2.服务间调用限流

限流维度

1.服务/接口/标签的限流

2.秒、分钟、小时、天等时间微服的限流

限流类型

1.单机限流:针对单个被调实例的级别的限流,流量限额只针对当前被调实例生效,不共享。

2.分布式限流:针对服务下所有实例级别的限流,多个服务实例共享同一个全局流量限额

下图是一个简单的架构图关于如何在入口层以及服务间做限流。

微服务上云案例演示

下图是演示内容示例架构图。

下面将会演示一个完整的微服务场景。

https://weixin.qq.com/sph/AQIoDw

总结

上面演示的这个Demo涉及到的腾讯云的产品叫做微服务引擎 TSE,它提供开源增强的云原生网关、注册配置中心和服务治理平台,帮助用户快速构建轻量、高可用和易伸缩的微服务架构。微服务引擎的使用方式完全兼容开源版本,在功能、可用性和可运维性等多个方面进行增强。

在以上演示中用到的TSE云原生网关结合了流量网关、安全网关和服务网关来实现一个统一的网关。具有安全认证、流量防护、流量路由、自定义插件等功能。

弹性微服务应用场景主要就是以上这些微服务的架构,像购物、php的应用等容器部署的都可以放到弹性微服务上面,或者为了解决这个流量波峰波谷这种需要扛住流量洪峰来提高资源利用率的这种场景也是非常适合用弹性微服务的。下一篇我们将会重点为大家带来《秒杀场景限流解决方案》。

原文地址:https://my.oschina.net/u/4587289/blog/5591052

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

腾讯云中间件