微服务进阶避坑指南 | 技术头条

戳蓝字“CSDN云计算”关注我们哦!


640?wx_fmt=jpeg

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!


来源:青云QingCloud 

作者:周小四 青云QingCloud 应用及容器平台研发总监、于爽 KubeSphere容器平台产品经理


编者按:容器和容器编排系统仅仅是部署和运行的基础平台,开发人员需要关注更多的是部署在平台上的应用。容器时代,应用架构发生了巨大变化,如果要让应用在容器平台上发挥其最大的功效,我们就必须走上微服务道路。然而,容器落地的过程中路多坑更多,微服务进阶之路需要更多经验之谈。

 

微服务架构相对于单体架构有很大的变化,也产生了一些新的设计模式,比如 sidecar,如何开发一个微服务应用是一件有很大挑战性的事情,我们经常会听到有人讨论如何划分微服务,多细的颗粒度才是微服务等问题。初学者经常会处于一个“忐忑不安”的状态,所以我们急需要知道如何才能走上正确的微服务道路,或者需要一些最佳实践指导我们如何设计、开发一个微服务应用。 

 

不骄不躁不跟风 知己知彼方可百战不殆


虽然现在已经进入到一个不谈微服务就落伍的时代,但作为 IT 从业者,我们一定要站在切身利益出发,多思考几个“为什么”,不要急于跟风。原因很简单,不管外面如何风吹雨打,只要你的房子足够结实、安全、舒服,那一般情况下就不需要拆除重建,所以在决定继续沿用单体架构还是转向微服务架构之前,我们一定要做两件事情:


第一件事,从外部了解两种架构各自的优劣:



单体

微服务

代码

1. 代码量巨大,新人很难理解或上手

2. 代码黑洞,无人敢改

3. 各功能紧耦合,强依赖,难拆分

4. 语言栈相对单一,团队沟通相对容易,企业招聘技术人员相对容易

1. 代码库分散,各个库代码体量相对较小

2. 要求开发人员必须有良好的代码注释和写文档的习惯,否则通过单一的服务很难理解其背后的业务含义

3. 要理解一个完整的业务联调,可能要跨多个服务模块、多个语言栈

部署与测试

相对比较容易

在微服务数量较多时,需要做大量的服务间依赖顺序的适配和调整,运维成本高

开发工具

成熟,上手容易

多样

启动

慢,因为代码经年累月,应用体量越来越大

快,但要解决服务间依赖的问题

弹性

差

强

迭代

慢、笨拙

快、灵活

扩展性

差,功能模块间无明显界限

强

运维成本

运维平台构造成熟,成本相对较低

运维平台构造复杂,成本高

团队协作

效率低,很难规模化开发

小团队,内部沟通方式灵活

可靠性

功能间紧耦合,互相影响,某一环节出问题会影响整个应用

服务间松耦合,独立部署,可快速更新升级、回滚、扩展

可以看到,单体应用并不是一无是处。

第二件事,审视我们自己的业务:


1. 上述单体架构列出的一些问题是否已经严重影响了我们的业务?

2. 企业新的业务系统是否要满足快速迭代、弹性等需求?

3. 团队内是否有 DevOps 氛围?

4. 企业内是否有足够的动力和技术储备去接触新的技术?

 

了解了单体应用和微服务应用的优劣特点,分析了企业自身的业务诉求和实际情况,最终还是决定转型微服务架构,那么我们也要清楚这不是一朝一夕的事情,需要分阶段逐步推进。

 

蒙眼狂奔不可取 循序渐进方可顺利进阶


第一阶段试炼—— 开发新应用


对于初次接触微服务的企业,选择新应用入手是正确的方式。


第一步可以选择 web-scale、无状态类型的新应用上手,比如基于 nginx 的网站、文档等,这类应用非常简单且容易实现,而且能体验到微服务在容器平台上的各种功能。有了一定的经验之后,第二步就可以开发有状态类型的新应用,有状态服务的最大挑战就是数据管理。敲重点,跟以往单体应用的共享数据库不同,微服务应用中的每一个服务“独享”自己的数据库,服务之间需要通过 API、事件或消息传递的方式来相互访问对方的数据,而不是通过直接访问对方数据库的方式。

换句话说,理想中的微服务是封装自己的数据,通过API暴露数据出去,从而避免数据耦合,这样每个微服务的数据格式发生变化也不影响其它微服务的数据调用。开发过和升级过大型企业单体应用的人对此会深有体会,一旦有人改变了数据库 schema,整个应用都有可能启动不起来,团队开发效率会大大降低。

 

微服务架构并不尽善尽美,适合自己的方案才是王道。


不难理解,微服务数据是牺牲强一致性而通过最终一致性的方式来管理,这对数据的划分带来很大难度,比如不能再用 join 的方式访问不同服务之间的数据表,实际当中也比较难做到或者做起来很麻烦,现在也没有成熟且好用的库或框架提供微服务的数据管理,而且某些应用确实需要强一致性。而此时,我们不能通盘否定此类应用微服务化的可行性,应该适当折中或“妥协”,采用 miniservice。


Miniservice 在开发与部署的独立性和敏捷性方面类似于微服务(microservice),但没有微服务那么强的约束。通常情况下,一个 miniservcie 可以提供多个功能,这些功能之间可以共享数据库。这个时候千万不要害怕混合架构,不要害怕自己的微服务应用是否“正统”,“think big,start small,move fast“才是我们应该遵循的哲学。因此,一个企业应用里既有 microservice 也有 miniservice,甚至有单体部分(可以称之为 macroservice)都是可以接受的。


以一个电商平台举例,在整个场景里面,业务开发人员面对的主要压力来自前端频繁的变动,因为要应对频繁的促销、推广、降价等活动,所以面对消费者最前端的业务需要快速迭代。消费者会不停的浏览商品,最终产生交易的请求数量要远低于获取商品信息的请求数量,因此将前端业务无状态化,进行微服务拆分、解耦,便可以快速应对市场变化,灵活做出改变。


那是不是把整个平台都做到微服务级别会变得更好?答案是“不确定”,因为当微服务量级到达一定程度,由此产生的管理和运维压力是指数级增长的。而实际上,对于有些业务来讲也没有必要微服务化,比如很多电商平台都有 2B 的业务,其业务变化的频度和压力没有 2C 那么大,那以 macroservices 或者 miniservices 的方式去交付也是可以的。开发人员应该分析在整个应用架构体系中,哪些适合微服务化,哪些亟需微服务化。


实践出真知


在上面的电商案例中,我们提到了服务无状态化,之所以期望服务无状态化,是因为无状态应用可以做到快速的扩缩容,可以应对井喷流量,可以最大效率的利用计算资源。我们经常听到,以无状态为荣,以有状态为耻,说的就是对于一个服务要尽量无状态化它,比如用户 session 管理,以前我们在业务逻辑模块进行管理,导致这些模块不能按照无状态方式任意伸缩。我们可以把这些 session 的管理抽取出来放到一个高可用或分布式的缓存中管理,业务模块通过调用API的方式去获取 session,这样就实现了这些模块的无状态化。


但这并不意味着所有服务都做到无状态才是最好的,开发者要细细思考自己的业务模型并进行服务拆分,不要为了无状态而无状态,因为总是会存在有状态服务的。

 

第二阶段进阶—— 改造遗留应用


如果我们经过认真思考后仍决定对遗留应用进行微服务化,比如需要新增功能、快速迭代现有功能等,那么最好遵循一些最佳实践经验。显然,另起炉灶开发一套新的系统不太现实,失败的概率非常高。


第一点注意:新增功能点不能再在原有单体应用基础上开发,而是需要按照微服务方式开发,但由于这个微服务是隶属于原来单体应用的一部分功能,所以通常情况需要访问单体应用的数据,这个时候需要通过API的方式访问,以防止二者之间发生紧耦合。对于单体部分来说,无论是采用 Facade,还是 Adapter 或 Translator 模式提供 API,都是为新增的微服务模块提供松耦合的访问方式。


第二点注意:对于已有的单体部分也可以逐步微服务化,可选择经常变化、需要快速迭代满足用户需求的部分着手进行改造。经过几轮改造后要么整体替换掉原单体应用,要么剩下的是稳定不变的单体部分,周围就都是改造过的微服务混合架构了。

 

第三阶段收放自如——Service Mesh


Service mesh 是微服务架构的一部分,它本质上是一个分布式计算中间件,通过拦截流量和安置策略来管理和优化服务之间的通信,使得服务变得更加健壮和安全。通常会提供微服务之间认证、鉴权、加密、服务发现、请求路由、负载均衡、服务自愈等功能。


部署微服务应用,service mesh 是必不可少的部分。这是因为微服务应用是一个分布式的应用,因此相对于单体应用来说在稳定性、可管理性等方面都有很大难度,需要有 service mesh来管理帮助服务变得更加健壮和安全。


因此,Service mesh 选型也是比较重要的,经常听到有人纠结是选择 Istio 还是 Spring Cloud 等。我们认为 Istio 是 service mesh 的发展方向,从架构来说,它解耦了控制平面和数据平面,使得开发者可以专注于应用业务逻辑的开发,而复杂的分布式应用服务之间的通信交给 service mesh 来控制。Spring Cloud 在架构设计理念上是落后的,试想一下,开发者在开发微服务的时候还要思考如何在代码中实现熔断、灰度发布、负载均衡等问题,负担是非常重的。更重要的是 Spring Cloud 类型的 service mesh 只支持 Java 语言,完全违背微服务可以任选语言开发的主张,而且有 vendor lock-in 嫌疑。


Istio 身上鲜明的标签很多:天然适合 Kubernetes 平台,不侵入代码,无语言绑定,但不得不承认,Istio 还在发展过程当中,目前也有一些问题亟待解决:


· 性能依然不够理想。基于 Istio 实现的微服务,由于虚拟化、转发等因素造成的性能损耗依然过大,不过积极的方面是我们看到一方面这是社区持续改进的重点,另一方面我们看到大家在做一些有效的尝试,比如通过 cilium 做 service mesh 的 proxy,提升性能;


· 门槛高。Istio 虽然控制面做的很优秀,但上手成本依然很高,很多企业用户还处在容器化改造阶段,以一种复杂面貌去呈现是很难很快融入企业 IT 架构中的;


· 落地实践少。虽然社区火热,被谈论的热度很高,但企业用户或者在观望,或者在尝试,我们能看到的是有技术实力的互联网公司将 Istio 中的某个组件拆解出来,或改造、或接入他们现有微服务治理平台,但这又会造成一种和社区主分支不一致的问题,为将来能否和社区保持一致带来些许担心,是否会走上厂商绑定的老路还需要观察。值得一提的是,在2018年上海 KubeCon 大会上,Google 的开发者讲述了在美国三家公司成功将 Istio 用于生产的案例,相信类似的事情会发生的越来越多,也期待今年上海的 KubeCon 能看到更多来自 Istio 的分享。


虽然 Istio 存在上述问题,但我们更应看到其社区正在飞速增长,就好比一两年前 k8s、docker swarm 和 Mesos 之争一样,那个时候 k8s 强大的生态活跃度为它最终胜利打下了良好的基础,我们认为 Istio 就是在 service mesh 领域的 k8s,未来很有可能会赢得这个领域的主导地位。当一个应用的微服务越来越多的时候,service mesh 变得非常重要,而且目光看得更远一些,随着 FaaS 步入业务开发者的视野,大家越来越享受这种便捷、灵活的开发方式,这意味着以服务视角的开发模式会越来越流行,因此 service mesh 框架会变得越来越重要。

 

综上所述,通过 Istio 构建微服务治理屏幕,学习曲线起点比较高,运维也非常麻烦,运维人员关注的是功能的输出,比如熔断、限流、灰度发布等,但 Istio 要求他们先要部署组件,编辑 yaml,了解各种抽象的参数,这就好比在看 3D 电影前,让观众自己先要组装 3D 眼镜一样。因此,微服务进阶之路道阻且长,企业需要一个平台级商业产品,可以从业务视角来管理微服务的可视化工具或者平台,降低用户的学习和运维成本,提高用户的业务价值输出能力,帮助用户重塑数字化时代核心竞争力。

 

640?wx_fmt=png


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


640?wx_fmt=jpeg


推荐阅读:

  • 分布式架构系列: 负载均衡技术详解 | 技术头条

  • 00后的AI开发者进阶之道:从入门到鏖战MIT编程大赛 | 人物志

  • 吃了公司零食被指“偷吃”,外包怎么了?

  • ICPC 2019国际大学生程序设计竞赛,中国高校未能夺冠

  • EOS现状: 72%应用涉赌被列为高危, 说好的诗和远方, 你竟沦落成了这样?

  • 凉山火灾启示录:面对大火,AI 能做些什么?


640?wx_fmt=png真香,朕在看了!

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

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

相关文章

Launch failed - cleaning up connection

Jenkins远程连接ssh(Linux系统)失败 关键信息: Warning: no key algorithms provided; JENKINS-42959 disabled Warning: no key algorithms provided; JENKINS-42959 disabled SSHLauncher{host192.168.45.145, port22, credentialsId61eab5fd-5c3f-4bc7-a794-f87…

前后两组结构相同的数据进行比较,找出新增的,需要删除的,原来存在的

想象现在服务器在向客户端发送数据,每隔几秒发送一次数据,客户端需要将前后两次的数据进行对比,找出相对于收的数据需要将上一次的数据删除的部分,以及此次新增加的,还有原来就已经存在的数据。 代码如下: …

Hadoop精华问答:Hadoop框架最核心的设计是?

2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce。到现在的13个年头,这个单词代表的是“核心”,今天我们就来看看关于Hadoop的精华问答。1Q:Hadoop是什么?A:Hadoop是一个由Apache基金会所开发的分…

git.exe init#timeout = 10错误:克隆远程repo'origin'时出错hudson.plugins.git

用Jenkins自动化搭建测试环境,Jenkins构建任务 关键异常抓取 git.exe init#timeout 10错误:克隆远程repoorigin时出错hudson.plugins.git (git.exe init # timeout10 ERROR: Error cloning remote repo origin hudson.plugins.git)具体异常抓…

Qt中绘制直线

绘制多条直线&#xff0c;直接上代码&#xff1a; 绘制直线的部分 QPen pen(Qt::lightGray,1);pen.setStyle(Qt::DashDotDotLine);pen.setWidth(1);painter.setPen(pen);painter.translate(0, 0);painter.drawLines(lines);添加直线代码&#xff1a; for(int i 0; i < rowC…

阿里云镜像仓库

阿里云镜像加速器 第一步&#xff1a;进入apache-maven-3.6.1/conf/目录 cd apache-maven-3.6.1/conf/第二步&#xff1a;编辑settings.xml文件添加阿里云仓库镜像 vim settings.xml第三步&#xff1a;在文件中找到标签&#xff0c;在里面复制添加即可&#xff01; <mirro…

Docker精华问答 | 多个 Docker 容器之间共享数据怎么办?

在计算机技术日新月异的今天, Docker 在国内发展的如火如荼。特别是在一线互联网公司 Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项&#xff0c;那么今天我们继续关于Docker 的精华问答。1Q&#xff1a;容器磁盘可以限制配额么&#xff1f; A&#xff1a;对于 de…

Qt中多个动态创建的按钮同时绑定一个槽函数,判断被点击的是哪个按钮

当动态创建按钮&#xff0c;每一个创建的按钮都与同一个槽函数绑定&#xff0c;点击按钮的时候获取被点击的按钮的文本。 代码如下&#xff1a; QString getClickedBtn() {outPut<<"getClickedBtn()";QString strText " ";for(int i 0; i < m_…

ssh连接远程linux环境

ssh连接远程linux环境 格式为&#xff1a; ssh 用户名远程ip地址例如&#xff1a; ssh root192.168.182.128

要闻君说:谷歌云重磅发布两大技术平台;以后可以打飞滴了?SAP重组动荡;微软宣布 Azure Functions 支持 Java...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 【4月10日 星期三】云の声音…

OpenGL ES EGL eglDestroyContext

目录 一. EGL 前言二. EGL 绘制流程简介三.eglDestroyContext 函数简介 四.eglDestroyContext 使用四.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 …

用Jenkins自动化搭建测试环境_jenkins基础搭建_入门试炼02

Jenkins基础&#xff1a; 本篇介绍Jenkins的安装、Jenkins中的常用插件的安装方法、Jenkins用户配置以及提醒邮件的配置。 接上一篇&#xff1a;使用Jenkins搭建自动化测试环境_环境准备_入门试炼01 https://blog.csdn.net/weixin_40816738/article/details/90280440 文章目录一…

关于指针释放的小领悟

当一个指针用来指向另一个地址&#xff0c;被指向的这个地址被中途释放掉之后&#xff0c;用来指向的这个指针便不能再去释放内存空间。 示例代码&#xff1a; void transViewPtr(GraphicsView *view) {m_view1 view;//直接指向 }上述代码中&#xff0c;m_view1与view指向的是…

OpenGL ES EGL eglQueryContext

目录 一. EGL 前言二. EGL 绘制流程简介三.eglQueryContext 函数简介 四.eglQueryContext 使用四.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基…

终于有人把5G和边缘计算的关系说清楚了 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a; pala来源&#xff1a;边缘计算社区5G三大应用场景为&#xff1a;增强…

Jenkins_安装基础软件_入门试炼03

应用部署服务器准备&#xff1a; 本章对Linux系统简介、安装Java环境、安装并配置 Git、安装并配置 Maven、安装并配置 Tomcat、以及将部署服务器配置到Jenkins上。 一、Linux操作系统需要做的准备 1. 确定IP地址2. 确认登录用户名密码3. 查看/启动ssh服务4. 确认可以远程连接…

qt项目中输出日志

此日志是在主线程中实现输出信息&#xff0c;可能对于比较多的线程的项目&#xff0c;不是一个很好的选择。下面记录一下。 首先创建一个头文件log.hpp&#xff0c;也可直接创建成log.h,本人是由于创建前打算在其中定义函数&#xff0c;后又没有定义&#xff0c;也没有再删除后…

Jenkins_GithubFork程序_入门试炼04

部署应用介绍与前期准备&#xff1a; 本章讲解Fork github上的应用、部署应用下载、简略分析部署应用、 数据库准备、本地运行部署应用、将更新后的代码上传到github。 一、Github的介绍 GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持git 作为唯一的版…

输出日志的开关控制

在项目中想使日志作为程序异常时的参考&#xff0c;又不想使输出日志过久过长导致程序的性能下降。此时可以选择行的来控制日志是否输出。比如前期不让日志输出&#xff0c;整体运行程序&#xff0c;测试程序的内存增涨&#xff0c;此时将日志关闭。这个博客就可以帮助实现这样…

用Jenkins自动化搭建测试环境_入门试炼05

Jenkins自动化部署任务开发&#xff1a; 本章简述自动化构建、部署过程、 创建Jenkins 任务&#xff0c;填写部署代码、实际运行部署任务。 一、部署过程介绍 简述自动化部署过程&#xff1a; 【开始】-【Git同步最新代码】-【maven打包编译】-【停止Tomcat】-【部署应用】-【…