Spring Cloud 如何引入云原生网关,创新微服务架构
作者: 赵炳堃(秉钧)
在传统的微服务体系中,Spring Cloud Alibaba 和 Zuul 常被用作配合 Spring Cloud 使用的微服务网关。然而,这些传统的 Java 网关在面对大规模流量的场景下仍存在种种问题。例如 Zuul 由于采用了非异步 IO 的架构,导致了其在面对高流量的情况下容易出现阻塞的现象,Spring Cloud Gateway 也会在流量很大的情况下产生 Full GC 的情况,导致请求 RT 变长,影响用户体验和业务稳定性。因此我们需要寻找一个新的选项,来替代这些传统的微服务网关。
Higress: Spring Cloud生态下微服务网关的新选择
Higress 是阿里巴巴开源的一款下一代云原生微服务网关。Higress 可以对接多种注册中心,包括Nacos/Zookeeper/Eureka 等,能够无缝集成 Spring Cloud 应用,对 Dubbo/Sentinel/OpenSergo 等微服务生态也有着深度的集成。与此同时,Higress 采用 C++内核,相比于传统的 Java 网关来说性能更高,更稳定,对比Spring Cloud Gateway 和 Zuul 来说,性能可以提升至2-4倍。另外,Higress 还天然兼容 K8s 的Ingress/Gateway API 标准,是一款更符合云原生时代标准的微服务网关。
更多性能压测试验,请参考:https://mp.weixin.qq.com/s/45ZAc5CGfND46Ao3lbHefQ
Higress无缝对接Spring Cloud应用发布实战
在现代软件架构逐渐走向微服务化、云原生化的过程中,应用的更新和迭代的频率变得越来越快,如何在尽可能保证用户体验不受影响的情况下完成应用的迭代发布就显得至关重要。目前业界普遍采用的几种典型的应用发布策略包括蓝绿发布、金丝雀发布、A/B Testing发布等。接下来本文将介绍如何使用Higress来实现Spring Cloud Alibaba应用发布的最佳实践。
前提条件
- 安装Higress,并安装Istio CRD,参考Higress安装部署文档。
- 安装Naocs,参考Nacos安装部署文档。
Higress支持将Nacos,Spring Cloud应用部署于K8s集群内,或者独立于K8s进行部署。为了演示方便,本文将Higress,Nacos,Spring Cloud应用都部署在本地K8s集群。
1. 通过Higress实现Spring Cloud应用的服务发现和路由
1.1. 部署SpringCloudAlibaba应用
apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-demo-v1 spec: replicas: 1 selector: matchLabels: app: spring-cloud-demo template: metadata: labels: app: spring-cloud-demo spec: containers: - name: server image: higress-registry.cn-hangzhou.cr.aliyuncs.com/samples/spring-cloud-demo:v1 imagePullPolicy: IfNotPresent env: # 注册到的nacos的地址 - name: NACOS_REGISTRY_ADDRESS value: nacos-server.default.svc.cluster.local # 注册时携带的version元信息 - name: SPRING_CLOUD_NACOS_DEMO_VERSION value: v1
我们在k8s集群中部署如上Deployment,其中通过NACOS_REGISTRY_ADDRESS和SPRING_CLOUD_NACOS_DEMO_VERSION两个环境变量指定了Nacos的地址以及注册时携带的version元信息。SpringCloud应用的application.properties配置会读取这两个环境变量,如下所示:
spring.cloud.nacos.discovery.server-addr=${NACOS_REGISTRY_ADDRESS}:8848 spring.cloud.nacos.discovery.metadata.version=${SPRING_CLOUD_NACOS_DEMO_VERSION}
1.2. 配置服务来源
Higress支持多种服务来源,包括Nacos/Zookeeper/DNS/固定IP,通过创建Nacos服务来源,Higress就可以发现注册到Nacos上的服务,从而完成转发请求到这些服务上。
进入Higress控制台(http://console.higress.io/),点击 服务来源-创建服务来源 以创建服务来源。这里选择Nacos 2.X,然后填写注册中心的地址,端口,命名空间,服务分组等信息。注册中心的地址可以填写ip或者域名,本文将Nacos部署在本地K8s中,通过K8s service暴露Nacos端口,因此这里填写对应的service域名。
Higress 控制台:http://console.higress.io/
配置好Nacos服务来源后,我们可以在服务列表中看到我们刚刚部署好的应用。
1.3. 创建域名和路由
在Higress控制台上点击域名管理-创建域名,创建一条demo.springcloud.com域名用于后续的访问。
点击路由配置-创建路由,创建一条名为demo的路由,域名选择我们刚刚创建好的demo.springcloud.com,目标服务选择我们在1.2中看到的Spring Cloud应用,path配置为/version。
1.4. 请求验证
接下来我们就可以用配置好的路由来访问SpringCloud应用了,在请求时需要将demo.springcloud.com域名解析到本地ip,如下所示,可以成功得到返回结果。
注:如果您将Higress的80和443端口通过LoadBalancer的方式暴露出来,这里需要将本地ip替换为对应LoadBalancer的ip,详见Higress快速开始文档。
2. 利用Higress进行蓝绿发布
在蓝绿发布中,有两套相同的运行环境,一套是当前正在使用的生产环境(蓝色环境),另一套是新版本的测试环境(绿色环境)。新版本的代码只在绿色环境中运行,测试通过后,直接将流量切换到绿色环境中,从而完成新版本的上线。与此同时蓝色环境作为热备环境,当绿色环境出现问题需要回滚时,也可以直接将流量全部再切换回蓝色环境。
2.1. 部署新版本应用
在本地K8s集群中apply如下资源,以部署v2版本的SpringCloud应用。
apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-demo-v2 spec: replicas: 1 selector: matchLabels: app: spring-cloud-demo template: metadata: labels: app: spring-cloud-demo spec: containers: - name: server image: higress-registry.cn-hangzhou.cr.aliyuncs.com/samples/spring-cloud-demo:v2 imagePullPolicy: IfNotPresent env: - name: NACOS_REGISTRY_ADDRESS value: nacos-server.default.svc.cluster.local - name: SPRING_CLOUD_NACOS_DEMO_VERSION value: v2
部署完毕后,我们可以在Higress控制台的服务列表中看到应用已经有两个endpoint了,如下图所示:
2.2. 为服务划分子集
部署完v2版本的应用后,我们可以在Nacos控制台(http://localhost:8848/nacos)上看到service-provider这个服务有两个ip,它们的metadata中的version字段分别为v1和v2。Higress可以根据服务的元信息将服务划分为不同的子集(subset),从而将请求转发到新版本或者老版本的应用中去。
在本地K8s集群中apply如下资源,从而根据应用元信息中的version字段将服务划分为v1和v2两个子集。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: demo namespace: higress-system spec: host: service-provider.DEFAULT-GROUP.public.nacos subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2
2.3. 修改ingress路由规则
新版本应用上线后,我们需要把流量全部切到新版本应用中去,这时只需要简单地修改一下我们在1.3中创建的路由即可。我们可以在本地K8s集群中找到如下ingress资源,这对应了我们在1.3中创建的那条路由。
我们直接编辑这条ingress资源,将higress.io/destination这条annotation的value改为service-provider.DEFAULT-GROUP.public.nacos v2,即可将路由的目标服务修改为v2子集。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: higress.io/destination: service-provider.DEFAULT-GROUP.public.nacos v2 higress.io/ignore-path-case: "false" labels: higress.io/domain_demo.springcloud.com: "true" higress.io/resource-definer: higress name: demo namespace: higress-system spec: ingressClassName: higress rules: - host: demo.springcloud.com http: paths: - backend: resource: apiGroup: networking.higress.io kind: McpBridge name: default path: /version pathType: Prefix
2.4. 请求验证
我们再发送请求,可以看到此时得到的是v2版本应用的返回结果,如此便实现了新版本的上线发布。
如果发现已上线的新版本出现问题需要回滚,只需要修改ingress路由中的higress.io/destination,将值更改为service-provider.DEFAULT-GROUP.public.nacos v1即可完成回滚。
3. 利用Higress进行金丝雀发布
金丝雀发布是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的实例。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。
3.1. 修改ingress路由规则
Higress可以通过一条Ingress注解轻松完成应用的金丝雀发布。我们编辑2.3中的ingress资源,将ingress中的higress.io/destination注解按如下方式进行修改:
metadata: annotations: higress.io/destination: | 80% service-provider.DEFAULT-GROUP.public.nacos v1 20% service-provider.DEFAULT-GROUP.public.nacos v2
这样Higress就可以把80%的流量转发到v1版本的应用,将20%的流量转发到v2版本的应用。
3.2. 请求验证
连续发送20条请求,可以看到v1和v2的比例符合我们在ingress中配置的比例。随着灰度的进行,可以逐渐调大v2版本的流量比例,最终完成新版本的平滑上线。
4. 利用Higress进行A/B Testing发布
A/B测试基于用户请求的元信息将流量路由到新版本,这是一种基于请求内容匹配的灰度发布策略。只有匹配特定规则的请求才会被引流到新版本,常见的做法包括基于HTTP Header和Cookie。基于HTTP Header方式,例如User-Agent的值为Android的请求 (来自安卓系统的请求)可以访问新版本,其他系统仍然访问旧版本。基于Cookie方式,Cookie中通常包含具有业务语义的用户信息,例如普通用户可以访问新版本,VIP用户仍然访问旧版本。
4.1. 修改ingress路由规则
在本示例中,我们通过HTTP header中的User-Agent对流量进行区分,将Android系统的流量转发到v2版本,其他系统的流量仍保持v1版本。首先修改2.3中名叫demo的ingress资源,将higress.io/destination修改为v1版本,代表目前线上的流量全部会打到原来的v1版本:
metadata: annotations: higress.io/destination: service-provider.DEFAULT-GROUP.public.nacos v1
当新版本部署完成后,再新建一条如下所示的ingress路由。这里采用正则匹配的方式,当User-Agent中含有Android时,将请求转发到v2版本的服务。
kind: Ingress metadata: annotations: higress.io/destination: service-provider.DEFAULT-GROUP.public.nacos v2 higress.io/canary: "true" higress.io/canary-by-header: "User-Agent" higress.io/canary-by-header-pattern: ".*Android.*" higress.io/ignore-path-case: "false" labels: higress.io/domain_demo.springcloud.com: "true" higress.io/resource-definer: higress name: demo-ab namespace: higress-system spec: ingressClassName: higress rules: - host: demo.springcloud.com http: paths: - backend: resource: apiGroup: networking.higress.io kind: McpBridge name: default path: /version pathType: Prefix
4.2. 请求验证
可以看到来自安卓系统的请求被转发到了v2版本,其余系统仍访问v1版本。
当新版本验证完毕需要全量上线时,只需要将demo路由的higress.io/destination注解修改为v2版本,并删除demo-ab路由,这样所有流量就都会访问v2版本了。
加入Higress和Spring Cloud Aliaba社区
Spring Cloud Alibaba社区交流群:钉钉群号2415000986
Higress社区交流群:钉钉群号7685011250
Higress 社区交流钉钉群中有历次 Higress 社区周会录屏,包括本文中提到的结合 Spring Cloud 应用发布的完整实操视频。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
用这个开源项目,网络小白也能搞定容器网络问题排查
作者:溪恒、谢石、遐宇 Kubernetes 本身比较复杂,使用门槛较高,用户在开始容器化迁移时经常遇到各种各样的问题,由于缺乏故障定位的技能和工具,用户常常产生挫败感,甚至放弃业务容器化。其中网络问题表现尤为突出,Kubernetes 网络虚拟化导致网络问题排查的难度巨大。 KubeSkoop 是阿里云容器服务团队开源的 Kubernetes 容器网络诊断工具,支持主流的网络插件和云厂商的 Kubernetes 集群诊断。它正是为了降低网络问题排查难度,让没有网络知识的人也可以自动化地定位网络问题。 Kubernetes 容器网络诊断工具:https://github.com/alibaba/kubeskoop KubeSkoop 能够自动构建出给定源和目的地址在容器网络中的访问路径,自动化地采集和分析链路上每一个网络节点的配置,结合 eBPF 内核监控以及 IaaS 层的网络配置检查,定位出导致网络不通的根因,极大地降低了网络问题定位的时间,即使没有任何网络技能的用户也可以使用。目前在阿里云容器服务的环境中,作为自运维工具解决了大量客户在大规模 Kubernetes 集群场景下遇到...
- 下一篇
拈花云科基于 Apache DolphinScheduler 在文旅业态下的实践
作者|云科NearFar X Lab团队 左益、周志银、洪守伟、陈超、武超 一、导读 无锡拈花云科技服务有限公司(以下简称:拈花云科)是由拈花湾文旅和北京滴普科技共同孵化的文旅目的地数智化服务商。2022年底,拈花云科NearFar X Lab团队开始测试DolphinScheduler作为交付型项目和产品项目的任务调度工具。本文主要分享了拈花云科在任务调度工具的选择、迭代和实践过程中的经验,希望对大家有所启发。 二、业务背景 我们的服务对象主要是国内各个景区、景点,业务范围涵盖文旅行业的多个板块,如票务、交通、零售、住宿、餐饮、演绎、游乐、影院、KTV、租赁、服务、会务、康乐、康养、电商、客服、营销、分销、安防等。由于业务系统来源较多,多系统下的数据源类型差异化较大,所以在实施数据项目时我们需要能够支持多种数据来源(Mysql、Oracle、SqlServer、Hive、Excel……)的数据集成任务。同时根据大部分景区为国有化的特点,我们也需要具备能够提供私有化交付部署及SAAS化数据中台产品解决方案的双重服务支撑能力。 三、DolphinScheduler 调度系统选型过程 在团...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启