iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >同程旅游微服务最佳实践
  • 539
分享到

同程旅游微服务最佳实践

2023-06-05 04:06:28 539人浏览 安东尼
摘要

本文首发胖波聊架构界,微信公众号:xiaobo2as本文概要导言微服务拆分的四个维度微服务应该如何维护版本如何从单体架构平滑过渡到微服务结语一、导言同程微服务从立项到实施推广已经走过了整整两个年头,从最初的简单粗糙到今天的精细完善,接入服务

同程旅游微服务最佳实践

本文首发胖波聊架构界,微信公众号:xiaobo2as

本文概要

  • 导言

  • 微服务拆分的四个维度

  • 微服务应该如何维护版本

  • 如何从单体架构平滑过渡到微服务

  • 结语

一、导言

同程微服务从立项到实施推广已经走过了整整两个年头,从最初的简单粗糙到今天的精细完善,接入服务数量也实现了从1到10,000+的增长。

微服务开发团队和大家一起踩过了无数的坑,最终打造了今天的DSF2.0平台。回顾爬坑记录,现整理一些爬坑心得体验供大家参考,也斗胆提出一些最佳实践以抛砖引玉。

下文将从开发者角度对微服务如何拆分, 版本管理和单体到微服务过渡等方面给出一些建议,  供大家斟酌。

同程旅游微服务最佳实践

二、微服务拆分的四个维度

从单体架构到微服务,拆分粒度很难把握。理论方法莫衷一是,我们推荐快刀斩乱麻按照如下四个维度做拆分:

团队组织结构

发布升级频率

逻辑调用频率

数据读写分离


1.  团队组织结构

按照康威定律的说法,组织结构一定会反映到系统架构上,同程是树形结构+底层网状结构,那么服务之间一定是每个系统的架构呈明显的树状,但是系统之间会有多重的服务互访。

微服务设计要充分考虑哪些是自用(inner),外部访问(outer)和混用(mix)服务,并尽可以能将其迁移对应的服务组里。

2.  发布升级频率

新老项目由于处于生命周期的不同阶段,修改和发布频率会有很大差别。应该尽量将处于生命周期中不同阶段的接口分割,避免高频更新服务和低频更新服务捆绑,避免向稳定运行的服务组添加新业务接口,而是应该考虑在新的服务组中实现。

同程旅游微服务最佳实践

3.  调用频率

服务组中的不同服务调用频率会有巨大差别,而高频调用肯定会占据更多的资源,会出现个别接口耗尽资源导致同组接口一起失败(资源竞争),需要对高频访问的服务设置定制的运行策略,如分配更多的CPU核心数和内存, 调整部署使其尽可能靠近数据源等策略,但是如果将所有服务宿主都做成高配,会造成巨大的资源浪费事实上也没有必要,所以应该将高低频访问的服务分割以使其能为获得更好的性能和可靠性做针对性优化

4.  数据读写分离

上一维度其实已经涵盖了读写分离的一部分,但是为了突出读写分离的必要性,这里单独列出。一般数据操作模式分为CQRS和CRUD两种模式,各有优缺点。 

从操作是否对数据本身造成影响来看,可以粗略的分为读写两类 , 一般来说写操作的频率会大大低于读操作,写操作经常会有更严格的认证授权机制,一般为内部(inner)调用。这些和读操作都有巨大差异性, 因此建议流量较大或较为核心的服务应该做读写分离,分拆为两个服务组发布。

最后分享一个粒度控制的小技巧,大多数情况出现在系统里的每个名词都会在存储层面拥有一席之地,对应一个独立的数据表或库,所以系统里出现的名词都可能是一个潜在的微服务。 

同程旅游微服务最佳实践

三、微服务应该如何维护版本

微服务治理中维护一个有序,直观的版本会给系统开发过程和服务依赖管理带来巨大的便利,反之无版本或混乱的版本升级策略迷惑开发和设计人员并带来意想不到的依赖问题。良好的微服务治理应该包含一整套完整的版本升级策略,根据我们长期的爬坑实践我们推荐如下版本策略:

1.  使用标准语义化版本

具体参见 语义化版本 2.0.0  。使用标准的语义化版本能使大家保证对版本有统一的理解,应尽量避免自行定义版本语义。DSF 版本推荐使用SemVer 约定,略有不同的是DSF推荐四位版本号(1.2.3.4),前两位作为主版本(1.2), SemVer版本一般为三位(x.y.z 对应:主版本号.次版本号.修订号)。

2.  面向契约设计

当一个团队选择微服务作为服务化实施平台时必须明确微服务化有一个较高的门槛,需要团队自身已经是一个较为成熟运作体系,例如有实施前有完善的架构设计,团队成员有明确的职责划分,团队成员对服务内聚和服务耦合有明确的认知。

上述的这些方面都会促成一个结果: 使设计开发的服务接口最终具有良好的抽象并体现出规划性,最终能够在服务实施前就能交付有良好兼容性的服务契约。实践中体现为一个版本迭代新增、修改、删除的任何部分都是经过慎重思考并体现在服务契约里,实际开发不轻易的修改和增添服务接口。 

同程旅游微服务最佳实践

3.  并行开发中版本的维护

微服务化对开发体系的一个重大影响就是开发实践的并行化,微服务使开发者从单体架构的调用丛林摆脱出来,使开发者能够把视野聚焦到调用链中其中一环上而不用过多关心上下游的具体实现。

需要付出的成本就是如何避免重复实现以及代码Merge时的更高频的冲突问题,有一个良好的版本管理习惯能够解决绝大部分的Merge冲突问题。

我们推荐在面向契约设计的基础上进一步延伸,通过团队内沟通确定不对外暴露的核心部分由谁来负责并约定在特定的版本实现,而负责使用该核心模块的其他开发者在该版本上递增版本。 

被其他组件依赖较且可能频繁改动的内核代码独占一个特定的版本区间(例如:v1.2.3.0~1.2.3.10作为核心模块的独占版本,依赖该组件的模块必须大于v1.2.3.10),能很好隔离并行开发带来的版本冲突问题。

因为引用核心组件的上层实现彼此没有太多联系,总是能够很好处理Merge带来的冲突问题。

4.  版本的兼容性

能根据版本号判断服务是否向后兼容是服务依赖管理的一个很重要的方面,大多数时候做一个使服务不在向后兼容的决定是很难的事,但是不断的向后兼容的结果往往是服务体量不可控制的增长和系统复杂度的非线性上升。

开发者需要慎重思考并在合适的时间做出服务不再向后兼容的决定,良好的版本策略能将服务是否向后兼容明确的表达出,显式的告诉调用方这是一个不兼容的升级更新, 请务必确保仔细阅读的新的契约文档并做了足够的测试

对DSF来说不兼容升级是很醒目的,只需观察服务组的大版本号(版本号的前两位,如v1.2.3.4,大版本号为1.2)是否增加,任何服务契约修改都被认为是不兼容的升级,包括删除接口、修改接口名称/参数等,都必须升级大版本号, 而修改小版本号(版本号的后两位,如v1.2.3.4,小版本号为3.4)则代表兼容性升级,如新增了服务接口,代码逻辑优化和Bug fix但是未修改服务契约。

同程旅游微服务最佳实践

四、如何从单体架构平滑过渡到微服务

一旦决定在开发实践引入微服务架构,如何将积累下来的庞大的巨无霸系统润物细无声的的过渡到微服务架构将是一个巨大的挑战。

推倒重来激进革命路线是要不得的,架构师们最想通过微服务化取代的部分往往是公司的主要盈利核心,改造难度不亚于飞行中更换引擎。从业界公开的信息来看还没有哪家做到了完美升级, 更多的可能无外乎两种:

第一种改造后苟延残喘,研发疲于奔命; 

另一种则是改造中就直接休克。  

因此为使微服务能顺利的应用,架构师从不应该幻想一蹴而就,无数次的碰壁后我们给出如下的爬坑建议:

1.  培训先行

工作技术人都很善于把面临的问题变成技术问题,然后在自己最擅长的领域里取解决掉。这就造成一个悖论:能用技术解决的问题就不是问题,真正的问题在受限的情景下仅靠技术是解决不了的,实施微服务最大的拦路虎也不是技术本身。

从我们的实践来看,最大的问题不是如何做好微服务,而是就微服务应该是什么达成一个一致的看法。

正所谓林子大了什么鸟都有,对于微服务100个人可能就有100种理解,这个不是说我们都是用dubbo或者都是用Spring Boot就能解决的。

我们的推荐做法就是实施前通过多数人参与的大讨论和培训,让多数人能达成一致的认识,微服务是什么,微服务不是什么? 运用在哪些场景是适合,应用在哪些场景里是不适合的? 结果不要跑的太偏就行, 和编码规范中命名规范一样,使用那种命名方法不重要,重要的是大家都使用同一种命名方法。

同程旅游微服务最佳实践

2.  绞杀者模式

绞杀者模式指对于无法通过修缮者模式改进的系统通过在系统外重新构建新功能的方式逐步剥离重构,对功能服务逐个绞杀。

好处是不影响原来的环境,一旦条件成熟就能快速切换。

不好的方面则是可能需要有一段时间同时维护两套系统,付出额外的开发维护成本。

3.  监狱模式

还有一种同程内部称之为监狱模式的做法,允许一些短期无力改动的系统通过监狱窗口(MicroProxy)接入微服务平台并委托Proxy将其暴露成微服务, 单体架构往往拥有庞大的服务接口梳理, 往往需要开多个监狱窗口。

每个监狱窗口都会被包装分割成微服务,条件成熟了能很方便的替换成原生微服务,称为刑满释放。

同程旅游微服务最佳实践

五、结语

市面上微服务的理论和讨论铺天盖地,其中不乏侃侃而谈的大块文章,深入阅读确常常发现大都是新瓶装旧酒或者拼凑篇幅之作。特点是在务虚处浓墨重彩,高谈理论,于实践处则一笔带过,仔细探究则实无一物。

所以如果发现有些技术书籍晦涩难懂,满篇的高大上,读完头脑发胀,确无所进益可能不是您水平不够,更可能是作者故弄玄虚。最近读书有感,书于此,博君一晒。 

--结束END--

本文标题: 同程旅游微服务最佳实践

本文链接: https://www.lsjlt.com/news/241296.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 同程旅游微服务最佳实践
    本文首发胖波聊架构界,微信公众号:xiaobo2as本文概要导言微服务拆分的四个维度微服务应该如何维护版本如何从单体架构平滑过渡到微服务结语一、导言同程微服务从立项到实施推广已经走过了整整两个年头,从最初的简单粗糙到今天的精细完善,接入服务...
    99+
    2023-06-05
  • SpringCloud 微服务最佳开发实践
    现在基于SpringCloud的微服务开发日益流行,网上各种开源项目层出不穷。我们在实际工作中可以参考开源项目实现很多开箱即用的功能,但是必须要遵守一定的约定和规范。 本文结合我们实...
    99+
    2024-04-02
  • PHP 微服务与容器化最佳实践详解
    php 微服务的最佳实践包括分解应用程序、定义清晰的 api、使用消息总线和实施断路器模式。容器化最佳实践包括使用编排工具、创建定制镜像、自动化构建和部署、持久化数据卷以及实现负载均衡和...
    99+
    2024-05-08
    php 微服务 docker
  • VMware 服务器的最佳实践:实现最佳性能
    ...
    99+
    2024-04-02
  • PHP 函数在微服务架构中的最佳实践
    在微服务架构中,php 函数的最佳实践包括:单一职责原则、保持简洁、使用命名空间、依赖注入和返回明确的错误。实战案例:isvalidemail 函数验证电子邮件地址的有效性,采用上述最佳...
    99+
    2024-04-23
    php 微服务
  • Golang技术在微服务架构中的最佳实践?
    go 语言是构建微服务架构的理想选择。以下最佳实践可创建高效且易维护的微服务:1. 使用轻量级框架。2. 保持服务独立。3. 编写可测试的代码。4. 监控你的微服务。 Go 语言在微服...
    99+
    2024-05-10
    golang 微服务 git
  • 阿里云同区服务器之间访问最佳实践
    随着云计算技术的不断发展,越来越多的企业开始使用阿里云作为其基础设施的一部分。在这种情况下,如何有效地在阿里云同区服务器之间进行访问成为了许多企业需要解决的问题。本文将详细讲解阿里云同区服务器之间访问的最佳实践。 阿里云同区服务器之间访问的...
    99+
    2023-12-12
    阿里 服务器
  • 微信小程序用户授权最佳实践指南
    前言 开发微信小程序中,经常会用到获取一些用户权限的页面,比如你要登录,就要获取个人信息、你要做人脸识别,就要获取相机权限、你要做位置地图功能、就要获取用户的位置权限,你要将图片保存...
    99+
    2024-04-02
  • 10个微妙的Java编码最佳实践
    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表。和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不常见的情况,可能有很大影响。我在编写和维...
    99+
    2023-05-30
    java 编码 最佳实践
  • 函数在微服务架构中的最佳实践和模式
    在微服务架构中,函数具有可扩展性、松耦合和可维护性等优势,最佳实践包括保持函数小而专注、使用异步处理和关注幂等性。可应用的模式包括无状态函数、状态函数、saga模式、cqrs和事件源。实...
    99+
    2024-04-12
    微服务 最佳实践
  • 了解Python编程中NumPy和同步IDE的最佳实践
    Python是一种强大的编程语言,拥有着广泛的应用场景。而在Python编程中,NumPy和同步IDE是两个常见的工具。本文将介绍Python编程中NumPy和同步IDE的最佳实践。 一、NumPy的最佳实践 NumPy是Python中的一...
    99+
    2023-09-27
    同步 ide numy
  • npm 包与 ASP 同步,有哪些最佳实践?
    随着前端技术的发展,npm 包的使用越来越普遍,而 ASP 的同步方式也是非常重要的一部分。在这篇文章中,我们将会介绍 npm 包和 ASP 同步的最佳实践,以及如何结合使用这两种技术。 理解 npm 包和 ASP 同步 首先,让我们来...
    99+
    2023-10-21
    npm 同步 实时
  • Python和Django中路径同步的最佳实践?
    Python和Django是现代Web开发中最热门的技术之一。其中,路径同步是一个非常重要的问题。在本文中,我们将讨论Python和Django中路径同步的最佳实践,并提供演示代码。 路径同步是指在不同的环境中使用相同的路径。例如,在本地开...
    99+
    2023-06-03
    path 同步 django
  • PHP 微服务架构:设计、部署和治理的最佳实践
    微服务架构是一种流行的软件开发方法,它将应用程序分解为较小的、可独立部署的组件,称为微服务。PHP 是一种强大的编程语言,特别适合开发微服务架构。 微服务设计的最佳实践 单一职责原则:每个微服务应专注于单个功能或职责。 松耦合:微服务...
    99+
    2024-02-16
    PHP 微服务 架构 设计 部署
  • PHP 微服务架构的未来:趋势、创新和最佳实践
    微服务架构已成为构建现代化、可扩展且维护性良好的 Web 应用程序的流行方法。 PHP 作为一种成熟的编程语言,在微服务开发中有着广泛的应用。本文将探讨 PHP 微服务架构的未来,介绍最新趋势、创新技术和最佳实践,帮助您构建高性能、可扩...
    99+
    2024-02-16
    PHP 微服务 Docker Kubernetes 分布式系统
  • 总结Go语言微服务开发的最佳实践与经验
    Go语言微服务开发的最佳实践与经验总结 引言:随着云计算和容器化技术的发展,微服务架构正在成为当今开发中越来越受欢迎的一种架构模式。Go语言作为一种高效且易于构建可扩展系统的语言,逐渐成为微服务架构中的首选语...
    99+
    2024-01-23
    最佳实践 经验总结 微服务开发
  • Golang异步编程的最佳实践
    Golang异步编程的最佳实践 随着互联网应用和服务的不断发展,对于高效的并发处理和异步编程需求也变得越来越迫切。在Go语言中,也可以使用goroutines和channels等特性来...
    99+
    2024-02-28
    golang 异步 最佳 go语言
  • Python Spring缓存同步的最佳实践是什么?
    在开发过程中,缓存是一个非常重要的概念。缓存可以提高应用程序的性能,减轻数据库的负担。Spring框架提供了缓存支持,可以很方便地实现缓存功能。但是,当多个应用程序同时访问同一个缓存时,就需要考虑缓存同步的问题。本文将介绍Python S...
    99+
    2023-06-07
    spring 同步 缓存
  • Laravel中对象同步的最佳实践是什么?
    Laravel是一个流行的PHP框架,它提供了许多方便的功能来加速Web应用程序的开发。其中之一是Eloquent ORM,它提供了一种简单而优雅的方式来管理数据库模型。在这篇文章中,我们将探讨Laravel中对象同步的最佳实践。 在Lar...
    99+
    2023-07-19
    laravel 同步 对象
  • PHP和WebSocket: 实现实时数据同步的最佳实践
    PHP和WebSocket: 实现实时数据同步的最佳实践引言:在现代互联网应用程序的开发中,实时数据同步成为了一个重要的需求。传统的HTTP请求-响应模式无法满足实时数据的要求,而WebSocket作为一种全双工通信协议,能够实现客户端和服...
    99+
    2023-12-17
    PHP websocket 实时数据同步
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作