微服务实战分享

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 实施微服务需要基础设施的自动化,同时也要求开发团队组织架构的调整来适应新的开发模式。软件架构总在不断演进,微服务之后又会是什么呢?

导语
喜欢踢球的同学一般知道这样的一个段子,当年有好事的记者问风头正盛的球王马拉多纳,在他进球中,哪个踢得最精彩?马拉多纳想了想就说:“一个吧”所以,努力追求“下一个”是一个普通球员到天才球员的必备品质,那么在快速互联网行业中同样如此,每一次的技术更新变革也意味着无数个追求“下一个”的互联网从事着的日日夜夜的辛勤劳动。

第一章 软件架构演进
按照不同阶段使用的软件架构来排序:单体架构,垂直架构,服务化架构,微服务架构以及未来可能出现的无服务架构(ServiceLess)以及服务网格(Service Mesh)。
1.单体架构
单体架构在初创的小微企业比较常见,典型代表就是一个应用、一个数据库、一个Web容器就可以跑起来,但现在实际的。
特点:
所有功能集中在一个项目工程中,所有的功能在一个war包中,然后部署到服务上,并且可以通过集群来提高系统的性能瓶颈。
优点:
①部署实施简单,可以保证项目快速上线。
②项目架构简单,前期开发成本低,周期短。
缺点:
①全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。
②系统性能扩展只能通过扩展集群结点,成本高。
_1

2.垂直架构
每一个垂直模块属于一个单一团队,通过垂直拆分,原来的单体项目不至于无限扩大。在模块之间共享代码是严令禁止的。出现了影响力最大设计典范MVC模式,模型(model)-视图(view)-控制器(controller),SSH框架是典型的MVC设计思想的应用框架。
特点:
垂直架构思想在于分层。
优点:
①隐藏下层的实现。下层为上层提供其所需的服务,但实现的过程,上层是无法知晓的。
②不同的项目可采用不同的技术。
③代码的复用性得到极大提高。
缺点:
①上下层级相互依赖,牵一发而动全身。
②全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。
_2

3.服务化架构
SOA代表面向服务的架构,将应用程序根据不同的职责划分为不同的模块,不同的模块直接通过特定的协议和接口进行交互。这样使整个系统切分成很多单个组件服务来完成请求,当流量过大时通过水平扩展相应的组件来支撑,所有的组件通过交互来满足整体的业务需求。
特点:
在系统的角度,解决两个核心的问题,程序的通讯问题以及服务化的构成。由于服务化架构使用的RPC通讯的方式,所以也被很多人称为RPC框架,RPC是远程调用,RPC是服务化架构的核心,在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC,WebService等通讯方式使得服务化的分布式基础。
优点:
①将重复的功能抽取为服务,提高开发效率,提高系统的可重用性、可维护性。②采用ESB减少系统中的接口耦合。
缺点:
①抽取的服务的粒度过大,系统与服务之间耦合性高。
②系统与服务的界限模糊,不利于开发及维护。
_3

软件架构演进总结:单体架构是最早最行之有效的软件架构,也是对以后的架构发展的基础;在单体架构发展一段时间后,公司的业务量和业务层级开始需要更高的要求, 在这一阶段单体架构的增加机器带来提高瓶颈的功能越来越小,最后只能将系统分为不同的层级,每个层级有对应的职责,以提升效率;如果公司进一步的做大,垂直子系统会变的越来越多,系统和系统之间的调用就不能避免了,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,以便应用更快速度的响应多变的市场需求。

第二章 微服务架构
其实服务化架构已经可以解决大部分企业的需求了,程序之间可以通讯了,逻辑上服务也分离出来了,那么我们为什么要研究微服务呢?微服务架构是SOA架构思想的一种扩展,更加强调服务个体的独立性、拆分粒度更小。

微服务的定义
将大型的复杂应用分解为多个小的微服务,每个微服务都围绕着具体业务进行构建,各微服务可分布式独立部署,且服务之间互相协调、互相配合,实现应用的快速迭代。

微服务的优点和缺点
优点:能够独立完成相应的服务,不再相互牵制。
缺点:微粒度越高,维护的成本越高。

微服务的价值
微服务的价值按照职位不同的角度来阐述的话,对于运维,开发人员,测试人员来说,是能提高工作效率的系统或者是工具;而对于CTO,技术管理者来说,微服务架构能够解决部分管理问题,合理的微服务抽象和拆分对应合理的组织结构划分,每个服务就变成一个独立的小产品,运营这个产品就是组织主要目标,产品的价值决定部门的价值,产品用户的多少决定组织价值的高低,这种类似市场化的管理方法是最能提供明确的指导性,战略性。

服务化架构与微服务化架构对比
1.通讯方式对比
服务化架构采用的RPC通讯方式,而微服务架构采用的是REST的通讯方式。RPC通讯是基于TCP传输层协议的产物(7层协议中的第三层),但像很多对DUBBO二次开发的的框架同样也支持HTTP,例如当当网的DUBBOX。RESTFUL通讯方式是基于HTTP应用层协议的产物。RPC是以动词为中心的, REST是以名词为中心的, 此处的动词指的是一些方法, 名词是指资。以动词为中心,意味着,当你要需要加入新功能时,你必须要添加更多的动词, 这时候服务器端需要实现相应的动词(方法), 客户端需要知道这个新的动词并进行调用。而以名词为中心, 假使我请求的是 hostname/friends/, 无论这个URI对应的服务怎么变化,客户端是无需关注和更新的,而这种变化对客户端也是透明的。

2.典型框架对比
DUBBO是SOA架构时代的产物,但国内技术人喜欢拿DUBBO和微服务架构SPRING CLOUD进行对比,是因为两者都是服务治理非常优秀的开源框架。DUBBO系出名门,是2008年底在阿里内部开始规划调用,2011开源的服务化治理的核心框架,2013年中途停止过,2017年9月份又重启维护并发布了新版本并被广泛应用于阿里巴巴集团的各成员站点。同时阿里云也推出了企业级分布式应用服务EDAS,为DUBBO提供应用托管。SPRING CLOUD,从命名我们就可以知道,它是SPRING SOURCE的产物,SPRING社区的强大背书可以说是JAVA企业界最有影响力的组织了,而为其提供技术后盾是Netflix公司(https://netflix.github.io/),在中国也叫网飞。Netflix也是非常有传奇色彩的公司,最开始是在线影片租赁,后来开始自制剧,著名的纸牌屋就是出自网飞,去年还买下了白夜追凶的播放版权。就目前请看看来说,阿里的DUBBO知名度更高一些,一个可能这也与早年阿里就开源了DUBBO框架之外,另一个原因是不少科技公司的架构师或者是主程均出自阿里系习惯了阿里的内部框架。随着技术的发展,大家可以关注两个框架的发展情况。

3.框架选型
可以打个比方。SPRING CLOUD品牌机,DUBBO是组装机;品牌机的兼容性有保证,开机即用。组装的机子更自由,选购自己心仪的CPU,内存条,硬盘等资源,但是需要一定技术能力去规划组装。但总的来说,微服务是未来发展的大趋势,有意更换架构的企业可以尽早做好打算。

第三章 Spring Cloud与DevOps实战
Spring Cloud
Spring Cloud是一系列框架的有序集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装、屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。Spring Cloud是微服务最典型也是目前应用最广泛的架构。
_4

所有请求都统一通过 API 网关(Zuul)来访问内部服务;网关接收到请求后,从注册中心(Eureka)获取可用服务;由Ribbon进行均衡负载后,分发到后端的具体实例;微服务之间通过Feign进行通信处理业务;Hystrix负责处理服务超时熔断;Turbine监控服务间的调用和熔断相关指标。

CI/CD
CI持续集成,CD持续交付,通常会采用一些软件如Jenkins、TeamCity等来辅助项目流程。CI/CD能够与Git SVN等代码管理仓库集成,帮助使用者实现自动化任务。CI/CD是DevOps中最重要也是最典型的实际应用。
_5
_6

Spring cloud与DevOps结合
Spring cloud与DevOps不是先有鸡还是先有蛋的问题,而是相互利好的关系。DevOps就是直击Spring cloud的痛点,把最复杂的分布式的服务,进行高效持续的生产。使用Spring cloud,第一步是要构建一个一体化的DevOps平台,试想如果不使用DevOps做微服务的话,整个环境会变得非常的乱、非常的糟糕,Spring cloud会给你的整个开发、测试和运维增加很多成本,反而是得不偿失了。所以第一步我们是提高DevOps的能力,能够把它的开发、部署和维护进行很完美的结合,才可以说我们真正能够享受到Spring cloud框架的福利。
_7

技术流程(手动打包)
1.Jenkins从仓库中手动拉取最新代码。
2.通过Jenkins的自带插件打包编译代码。
3.进行单元测试。
4.build构建最新的容器镜像。
5.push镜像到镜像仓库中去。
6.使用K8S或者docker-compose等容器编排工具进行项目的启动。

第四章 思考
中小企业新技术的选择思考
1.永远不要优先考虑性能问题,等到有性能问题,使用负载均衡。等到负载均衡搞不定时,公司也大了,就说融资上市的事情了,那就有新的技术架构技术方案代替原来的。
2.优先考虑的是文档/社区/可维护性。
3.优先选择硬通货,一旦有问题不仅仅是你一个人有问题,可以去Stack Overflow找答案;可以参考swarm和K8S的情况。

微服务的可实施性思考
我的总结观点是:不要为了追求技术而追求技术。稳定而有效的结果才是我们的最求,例如我维护过做游戏的日本客户,到现在都还在使用Windows Server 2013系统。
1.团队的技术人员是否已经具备相关技术基础。包含了对微服务的理解,DevOps的掌握等等都需要过硬的技术实力。
2.公司业务是否适合进行微服务化改造,并不是所有的平台都适合进行微服务化改造,比如:传统行业有很多复杂垂直的业务系统。而且要涉及到整个业务的数据库的分表分库,重新统一服务接口,最后还要规划具体的容器实施部署。
3.Spring Cloud 生态的技术有很多,并不是每一种技术方案都需要用上,适合自己的才是最好的。

运维行业的思考
新的技术发展到现在,给我最深的感触就是基础性的技术支持越来越被隐藏,更多的是强调自身业务快速实现和拓展。国外像Netflix和亚马逊是压根就没有运维这样的角色,运维的事情都是由开发工程师来完成,他们的职位名称是SDE(Software Develop Engineer),所以他们也被戏称为Someone Do Everything。所以,运维转型不是一句吓唬人的话,真的已经在我们身边发生了。

总结
技术变革的根本原因是业务发展的瓶颈与突破,技术能力决定业务能力的宽度,业务能力决定公司的长度;当技术能力达到一定高度的时候,可以试着调整自己的思考角度,从产品,从业务发展来考虑,又可以看到不一样的风景。

目录
打赏
0
1
0
0
92
分享
相关文章
|
2月前
|
微服务——MongoDB实战演练——需求分析
本文档《5-MongoDB实战演练》聚焦于某头条文章评论业务的需求分析与功能实现。基于MongoDB,需完成以下功能:1)提供基本的增删改查API;2)支持通过文章ID查询相关评论;3)实现评论点赞功能。结合实际业务场景,演示MongoDB在数据存储与操作中的应用,附带示意图帮助理解业务结构。
34 2
微服务——MongoDB实战演练——需求分析
微服务——MongoDB实战演练——文章评论的基本增删改查
本节介绍了文章评论的基本增删改查功能实现。首先,在`cn.itcast.article.dao`包下创建数据访问接口`CommentRepository`,继承`MongoRepository`以支持MongoDB操作。接着,在`cn.itcast.article.service`包下创建业务逻辑类`CommentService`,通过注入`CommentRepository`实现保存、更新、删除及查询评论的功能。最后,新建Junit测试类`CommentServiceTest`,对保存和查询功能进行测试,并展示测试结果截图,验证功能的正确性。
52 2
|
2月前
|
微服务——MongoDB实战演练——文章评论实体类的编写
本节主要介绍文章评论实体类的编写,创建了包`cn.itcast.article.po`用于存放实体类。具体实现中,`Comment`类通过`@Document`注解映射到MongoDB的`comment`集合,包含主键、内容、发布时间、用户ID、昵称等属性,并通过`@Indexed`和`@CompoundIndex`注解添加单字段及复合索引,以提升查询效率。同时提供了Mongo命令示例,便于理解和操作。
48 2
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc("likenum")`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
49 0
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
41 0
微服务——MongoDB实战演练——文章微服务模块搭建
本节介绍文章微服务模块的搭建过程,主要包括以下步骤:(1)创建项目工程 *article*,并在 *pom.xml* 中引入依赖;(2)配置 *application.yml* 文件;(3)创建启动类 *cn.itcast.article.ArticleApplication*;(4)启动项目,确保控制台无错误提示。通过以上步骤,完成文章微服务模块的基础构建与验证。
36 0
微服务——MongoDB实战演练——表结构分析
本文档来源于数据库articledb,展示了一张图片资源。图片宽度为1207像素,高度607像素,采用内联显示方式。内容涉及图像处理与样式设定,适用于文档或网页设计中多媒体元素的布局参考。图片来源为cdn.nlark.com,支持webp格式并附带水印处理。
40 1
微服务——MongoDB实战演练——表结构分析
微服务——MongoDB实战演练——技术选型
本节主要介绍技术选型中的两个重要工具:**mongodb-driver** 和 **SpringDataMongoDB**。其中,mongodb-driver 是 MongoDB 官方提供的 Java 驱动包,用于连接和操作 MongoDB 数据库,功能类似 JDBC 驱动。通过官方示例可快速上手。而 SpringDataMongoDB 是 Spring 生态的一员,封装了 mongodb-driver,提供了更简洁的 API,方便开发者在 Spring 环境中操作 MongoDB。两者各有优势,可根据实际需求选择合适的技术方案。
43 2
Python 高级编程与实战:构建微服务架构
本文深入探讨了 Python 中的微服务架构,介绍了 Flask、FastAPI 和 Nameko 三个常用框架,并通过实战项目帮助读者掌握这些技术。每个框架都提供了构建微服务的示例代码,包括简单的 API 接口实现。通过学习本文,读者将能够使用 Python 构建高效、独立的微服务。
微服务拆分的 “坑”:实战复盘与避坑指南
本文回顾了从2~3人初创团队到百人技术团队的成长历程,重点讨论了从传统JSP到前后端分离+SpringCloud微服务架构的演变。通过实际案例,总结了微服务拆分过程中常见的两个问题:服务拆分边界不清晰和拆分粒度过细,并提出了优化方案,将11个微服务优化为6个,提高了系统的可维护性和扩展性。
113 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等