基于 Kong 和 Kubernetes 的 WebApi 多版本解决方案

前言

大家好,很久没有写博客了,最近半年也是比较的忙,所以给关注我的粉丝们道个歉。去年和朱永光大哥聊的时候提了一下我们的这个方案,他说让我有空写篇博客讲一下,之前是非常的忙,所以这次趁着有些时间就写一下我们这边关于版本控制的方案吧。

那么今天给大家分享一个我们正在使用的一个基于k8s以及kong网关的WebApi多版本管理的解决方案,这种方案已经在我们的生产环境运行了将近两年,也迭代了很多个版本,我们觉得这个方案非常的适合用在微服务当中。

什么是 WebApi 多版本

版本的概念大家应该都知道,那么什么是 WebApi 的版本呢?

开发App后端的兄弟应该都非常清楚了,在给 App 提供 WebApi 接口的时候,由于安装在用户手机上的 App 存在多个客户端版本的问题,这些版本大部分时候需要进行共存,由于现在 Android 和 IOS 基本上都不允许App内置升级功能,当然有些时候是用户不愿意或者拒绝升级,很多时候业务需求在不停的变化,就避免不了对接口进行调整和增加新功能,所以我们需要保证后端接口的向前兼容性,那些没有升级的客户端App仍然要让它们能够正常工作,这就需要使用到多个不同版本的Api接口来进行控制,很多时候我们是保留旧接口,增加新接口,为了区分不同的客户端,然后给接口进行版本编号,这就是WebApi的多版本控制管理。

应用场景

了解了WebApi多版本的概念之后,应用场景就自然也就明白了。

除了 App 的服务端会用到之后,同样也适用于那些客户端非浏览器的项目的服务端,例如给一些桌面程序提供接口等等。

有些时候针对一些特性的App客户端提供不同的功能也是其应用场景之一。

解决方案

解决方案就是App在请求的时候携带一个版本信息到服务端,然后服务端就能够提供不同的功能了。

Api 请求服务端携带版本信息可以通过两种方式:

  1. 通过在 URL 中追加版本号或作为查询字符串参数。

  2. 通过Http自定义标头。

ASP.NET Core 中解决方案

在 ASP.NET Core 中的方案,我不打算进行详细介绍了,感兴趣的可以看下下面这个大兄弟的这篇文章:

菠萝吹雪-Code : ASP.Net Core WebApi几种版本控制

基于 K8s 和 Kong 的解决方案

由于我们使用的是基于 Kubernetes 的多版本解决方案,所以此处就详细说明一下。

我们采用的是在 URL 中追加版本号来实现的版本控制,这样做有两个好处:

1、方便 kong 进行路由解析,可以直接通过配置方式实现,如果通过 header 来路由的话,需要自己进行扩展才行。
2、从日志记录的时候可以很直观到看到当前的 API 版本,在发生问题时候可以快速定位的具体版本的服务。

下面是我画的一个我们的基于 Kubernets 的大致的架构图,像 CDN 这些我就给省掉了。

640?wx_fmt=png

主要流程分为以下几个步骤:

1、App 端不同的版本会请求不同的 Api 接口,这些 Api 接口以版本区分,不同的版本可以提供不同的结果。

2、Kong 网关针对 URL 中携带的版本号信息进行路由转发,在配置路由转发的时候需要把携带路径参数开启,例如 /api/v1/ordering/list 这个请求地址,我们可以新建一个路由,然后配置 /api/v1/ordering 这个前缀的URL 转发的到 ordering 这个服务,同时把路径带过去,假如说我们 ordering 微服务的地址为 /api/ordering,那么就可以配置服务的路径为 /api/ordering,由于路由配置了携带路径,所以此时我们的微服务接收到的请求地址就变成了 /api/ordering/list

3、Kong 网关以 NodePort 方式部署到 Kubernets 集群中,路由服务指向 Kubernets 内部服务的dns集群地址。Kong 的多个实例他们之间共享配置信息,可以把配置存储到 PostgreSql 或者 Cassandra 中。

4、后端微服务集群内部提供集群地址配置到Kong的Service中。

业务需求的配合

这整个方案中有一个重要的点就是开发人员和产品或者业务人员的一个配合问题,也就是整个开发进度的规划需要符合敏捷开发的流程,这样不会导致每个小版本都会有变化非常大的接口这种需求的出现,可以做到平滑升级。

以我司来举例,当有对接口进行大改的需求时,我们会将其规划到大的迭代主版本中,这样在大版本发布的时候,会新起一套大版本的服务集群环境来进行支撑,此时老的版本仍然不会删除,这样就会新旧版本同时共存,当新的版本再迭代几个小版本时候大部分用户其实已经自动升上来了,这个时候就可以把旧的大版本进行强制升级提示了,这样终端App用户就会全部升级到新的版本上了,从而把影响降低到最小。

所以,此处遵循一个原则:小版本做兼容升级,大版本做重大特性的提供以及 Break Changes 和代码重构等工作。

DevOps 的配合

在进行大版本升级的时候,微服务的DevOps基础设施就显得非常重要了,此时我们需要动态的创建路由到kong,这就需要利用DevOps的配合,你可以将创建调用kong提供的rest接口来创建路由,也许一开始会花费比较多的时间,但是从长远来看的话还是非常重要的,可以节约后续的很多时间。

以我司来举例,当进行大版本升级时,DevOps 脚本中会检测到版本号为大版本,此时就会运行创建新环境的脚本,这个脚本负责初始化新的 大版本的 k8s 集群环境以及kong的服务和路由配置,然后自动发布新版本的各个服务,最终会提供出来一个新的服务地址出来,类似 /api/v2/xxxx

数据中间件服务的配合

在进行新的大版本开发和迭代的过程中,还会涉及到一些关于新版本数据和旧版本不兼容的情况,比如 Redis 的缓存数据结构变化,消息队列的数据结构的变化,以及 Elasticsearch 等索引数据结构的变化。

那么如何处理以上数据服务的版本兼容问题呢?最简单的方案是起一套新的环境,新版本完全使用一套新的中间件服务环境来进行运行,但是这样有一个缺点就是会使用更多的服务器资源,照成服务器资源浪费的情况,当然如果是土豪公司可以无视了。

那如果想不同的版本使用相同的数据中间件服务怎么办呢?其实办法也是有的,大部分数据中间件都是支持版本划分的,比如 Elasticsearch,CAP 等都支持使用版本来区分数据,对于不支持的可以在程序中进行控制了,比如像 Redis 这种就可以使用不同的逻辑DB来区分。

总结

本篇文章主要讲述了如果利用 kong 网关和 k8s 服务来处理 webapi 多版本的问题。

同时还讲述了在开发的过程中一些不同版本的数据应该如何处理以及需求的规划等,希望以上的东西能够帮助到有需要的人。

如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。

如果你对 .NET Core 有兴趣的话可以关注我,我会定期的在博客分享我的学习心得。

原文地址:http://www.cnblogs.com/savorboard/p/webapi-versions.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg


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

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

相关文章

CodeCraft-20 (Div. 2) D. Nash Matrix 构造 + dfs

传送门 文章目录题意:思路:题意: 给定一个n∗nn*nn∗n的矩阵,每个点上面都有一个xi,yix_i,y_ixi​,yi​,表示这个点到xi,yix_i,y_ixi​,yi​这个点停下,当xi−1,yi−1x_i-1,y_i-1xi​−1,yi​−1的时候代表…

【HAOI2018】染色【反向二项式反演】【NTT卷积】

传送门 题意:NNN个位置染MMM种颜色,恰好出现SSS次的颜色数量恰好为kkk时的愉悦度为wkw_kwk​,求所有方案的愉悦度之和。对100453580910045358091004535809取模。 N≤1e7N \leq 1e7N≤1e7,M≤1e5M \leq 1e5M≤1e5,S≤150S \leq 150S≤150 本题的恶心之处…

从严治码-别人在项目中下毒,我该怎么治?

01 从软考说起从4月份开始,由于备考《系统集成项目管理工程师》的原因,博客没有持续更新,在上半年考试结束之后,又对项目进行了一些收尾的工作。下面就这段时间的学习作一个记录和总结吧。在学习的过程中,提炼了一些自…

CodeCraft-20 (Div. 2) C. Primitive Primes 思维 + 数论

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个长度分别为n,mn,mn,m的多项式&#xff0c;将他们乘起来&#xff0c;问系数modp0\bmod p 0modp0的项的指数是多少&#xff0c;两个多项式所有项的系数gcd1gcd1gcd1。 n,m<1e6n,m<1e6n,m<1e6…

【LOJ166】拉格朗日插值2【拉格朗日插值】【NTT卷积】

传送门 题意&#xff1a;给定n,m,f(0),f(1),......,f(n)n,m,f(0),f(1),... ...,f(n)n,m,f(0),f(1),......,f(n)&#xff0c;求f(m),f(m1),......f(mn)f(m),f(m1),... ...f(mn)f(m),f(m1),......f(mn) 模998244353998244353998244353 n≤100000,m≤1e8,n<mn \leq 100000,m \…

学习MVVM设计模式后第一次用于生产

WPF的MVVM设计模式从winform转变到WPF的过程&#xff0c;难点主要还是在MVVM的设计模式。当然&#xff0c;如果依然采用winform的涉及方式&#xff0c;在每个控件背后绑定事件的方式运用在wpf中&#xff0c;依然可行&#xff0c;但是假如GUI改版&#xff0c;其背后绑定的特别为…

剑指 Offer 14- II. 剪绳子 II

给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#xff0c;n>1并且m>1&#xff09;&#xff0c;每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少&#xff1f;例如&#xff0c;…

Educational Codeforces Round 108 (Rated for Div. 2) D. Maximum Sum of Products 思维 + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个长度为nnn的数组a,ba,ba,b&#xff0c;你可以至多反转一段连续区间&#xff0c;求∑i1nai∗bi\sum _{i1}^n a_i*b_i∑i1n​ai​∗bi​最大是多少。 n<5e3n<5e3n<5e3 思路&#xff1a; 首…

【CF1215E】Marbles【状压DP】

传送门 题意&#xff1a;给一个长为NNN的序列aaa&#xff0c;每次操作交换两个相邻位置&#xff0c;求最少操作次数使得所有相同的值连成一片。 N≤400000N \leq 400000N≤400000,ai≤20a_i \leq20ai​≤20 我们发现aia_iai​很小&#xff0c;盲猜单独考虑 我们重新确认一个…

netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源

基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统用户管理菜单管理角色管理权限管理[精确到按钮]&#xff09;代码生成器代码克隆到本地 用vs2017或以上版本 打开工程。项目结构如下&#xff1a;找到DbModel下面的初始化db脚本里面包含4张表的schema和初始化数据…

剑指 Offer 25. 合并两个排序的链表

输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 限制&#xff1a; 0 < 链表长度 < 1000 思路&#xff1a;和…

Codeforces Round #720 (Div. 2) C. Nastia and a Hidden Permutation 交互

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个序列ppp长度nnn&#xff0c;每次可以执行两个种询问&#xff1a; t1max(min(x,pi),min(x1,pj))t1\ \ max(min(x,p_i),min(x1,p_j))t1 max(min(x,pi​),min(x1,pj​)) t2min(max(x,pi),max(x1,pj))t…

【NOIP2018】赛道修建【二分】【树形dp】【multiset】【贪心】

传送门 题意&#xff1a;给一棵带边权的树&#xff0c;求MMM条没有公共边的路径的最小长度的最大值。 N≤50000N \leq50000N≤50000 抛开NOIP不谈&#xff0c;其实这题本身出的很好 显然二分 问题转化成了“最多可以找多少条长度不小于kkk的路径” 递归处理 对于每个结点…

asp.net core 系列之Startup

这篇文章简单记录 ASP.NET Core中 &#xff0c;startup类的一些使用。一.前言在 Startup类中&#xff0c;一般有两个方法&#xff1a;ConfigureServices 方法: 用来配置应用的 service 。 Configure 方法&#xff1a;创建应用的请求处理管道它们都在应用启动时&#xff0c;被AS…

可持久化Splay 学习笔记

可持久化Splay是怎么回事呢&#xff1f;Splay相信大家都很熟悉&#xff0c;但是可持久化Splay是怎么回事呢&#xff0c;下面就让小编带大家一起了解吧。   可持久化Splay&#xff0c;其实就是将Splay持久化一下&#xff0c;大家可能会很惊讶Splay怎么可以持久化呢&#xff1f…

译 | .NET Core 基础架构进化之路(一)

原文&#xff1a;Matt Mitchell翻译&#xff1a;Edi Wang随着 .NET Core 3.0 Preview 6 的推出&#xff0c;我们认为简要了解一下我们基础设施系统的历史以及过去一年左右所做的重大改进会很有用。如果您对构建基础结构感兴趣&#xff0c;或者想要了解我们如何构建与 .NET Core…

【洛谷P4705】玩游戏【二项式定理】【NTT卷积】【生成函数】【分治NTT】【函数求导】【多项式对数】

传送门 题意&#xff1a;给定长度为N,MN,MN,M的序列a,ba,ba,b和ttt&#xff0c;随机选取x∈[1,N],y∈[1,M]x \in[1,N],y\in[1,M]x∈[1,N],y∈[1,M],对于i1,2,...,t,i 1,2,...,t,i1,2,...,t,求(axby)i(a_xb_y)^i(ax​by​)i的期望 N,M,t≤100000N,M,t \leq100000N,M,t≤100000 …

剑指 Offer 27. 二叉树的镜像

思路&#xff1a;递归 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:TreeNode* mirrorTree(TreeNode*…

Codeforces Round #626 (Div. 2) D. Present 按位贡献 + 快排新姿势

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的序列aaa&#xff0c;让你计算 n≤4e5,a≤1e7n\le 4e5,a\le 1e7n≤4e5,a≤1e7 思路&#xff1a; 首先这个式子是n2n^2n2的&#xff0c;显然不能直接算&#xff0c;并且异或没有分配律&…

.NET开发框架(一)-框架介绍与视频演示

本文主要介绍一套基于.NET CORE的SPA高并发、高可用的开发框架.我们暂且称它为&#xff1a;&#xff08;让你懂.NET&#xff09;开发框架。以此为主线&#xff0c;陆续编写教程&#xff0c;讲述如何构建高并发、高可用的框架。&#xff08;欢迎转载与分享&#xff09;它标准化了…