现在微服务大行其道,好像搞应用开发还不懂微服务,就落后别人一个时代了。那么什么是微服务?为什么是微服务?微服务应用的场景是什么?应该如何上手微服务?

软件开发的几种模式

在了解微服务之前,有必要先了解一下软件开发的组织历史,这样才能让我们更好的了解微服务。

瀑布式开发

软件工程的名词借鉴与建筑工程,软件开发的思想和套路,很长时间也来自建筑行业。在建筑行业,我们要盖一座大厦,先要搞清楚想要什么样子的大厦,然后找设计院设计好建筑图纸,然后剩下的就是交给工程队依据设计图纸进行施工,楼改好以后要让负责验收的验收队进行质检验收。那么对应的软件开发也就变成需求分析,先搞清我们要开发一个什么样的软件,然后软件设计,接下来交给码农做软件开发,最后交给测试人员进行质量测试。这样的分工貌似还不错,而且在很长一段时间确实取得了不菲成就。这样分工以后,突破了一个人开发软件的时代,让不同层次的人负责不同的业务,大家相互协调分工合作。而且有人专门负责设计,有人负责编码,有人负责测试。软件无论规模,稳定性和质量较个人时代都有了大规模的提升。

然而随着软件工程规模的越来越大,特别是互联网出现以后,不但软件规模大,而且变化还快,上午人们还在寻找一匹快马,晚上就已经变成了汽车。人们渐渐发现软件不像建筑一样很容易具象化,然后可以清楚的表达设计,而且还不容易变化,很少有一年前需要一个大裤衩的建筑,一年后希望给它改成鸟巢。但是在软件行业这样的需求变化简直是家常便饭。人们发现软件越来越难设计,变化太经常了。这个时候,一般的软件开发和需求方都要反复确认,每次确认要签字画押,保证不能修改需求。但是这么干明显不能适应市场。为了解决这些问题,人们也想和很多办法,比如面向对象编程,软件工程的原则,总结设计模式,都是为了来更好的应对变化。但是都不能很好的面对变化,软件人总结:没有银弹。

敏捷开发

这个时候有人提出来了:既然变化是不可避免的,不如我们先不要抱怨了,接受这种变化吧。既然软件不那么好设计架构。那么要不然,让我们先把架构的问题放一放。先把现在需要的最小的核心功能做出来。然后市场需要啥,咱们就在上面加什么,我们要拥抱变化嘛!但是这样一来,又出现很多问题,一直这样修修补补的代码,用不了多久就变成一团意大利面了,连他妈都不认识他是谁了,别说开发的人了。而且修修改改很容易触一发而动全身。上周递交的bug确实修改好了,但是上上周明明测试没有问题的代码,又出现大问题了。而且这个时候,如果每次修改都要对整个系统进行检查和测试,又太浪费人力物力,变化依然是噩梦。

为了解决这些问题。软件人又想到了很多办法。比如: 1. 面向测试开发。我们既然要拥抱变化,那么我们不如把需要实现的结果直接写成测试用例。然后再去写能满足测试用例的代码,这样让机器去自己跑一边,如果测试用例没问题,证明我们的代码至少没大的问题。而且如果不幸发生了触一发而动全身的问题。那么测试用例能帮我们及时的发现问题。 2. 依赖抽想而非依赖实现的面向接口编程。人们发现无论如何变化,总体的契约很少变化,那么我们定义好接口。所有的实现都依赖于接口,然后用各种设计模式来保证接口不变依然可以拥抱变化,这样的变化最少是万变不离其宗了,就有章法可寻。 3. 既然是面向接口编程,不依赖实现,那么我们就很少去new一个对象,而是通过反射或者容器技术去实现IOC。 4. 既然是拥抱变化开发,那么就意味着更新迭代特别快,我们仅仅保证开发和开发质量还不行,还想实现快速自动化的部署,这就是持续集成的概念。

即便是这些问题都解决,还是感觉少点什么!

每次开发都要下载所有的应用代码,然后开发完成后要测试所有的用例,然后再进行所有代码的编译。然后把程序停掉进行更新。能不能把不变得代码不进行修改,然后只修改更新变化的代码。能不能每次只编译变化的代码?而不动不变得代码?能不能进行热更新,不需要停服就可以完成更新。甚至能不能先让一部分客户测试下新的功能?

微服务时代

如果我们把每部分都做成一个独立的应用。然后哪块需要变化我们就把那一块进行开发,编译然后更新,只要保证每块和每块直接的契约(接口)不变化。那么几乎都可以做到我们上面的要求。这样把一个应用拆解厂多个应用的办法,我们就称之为微服务。这样我们就可以实现热更新,而且还不用动其他的代码,需要更新那个,我们就单独架设一个应用,然后让其他应用调用即可。同时还可以保存新旧两个版本,然后一部分客户走旧的接口,另外一部分走新的接口。而且还可以突破以前单台服务器的问题,我们可以把不同的应用部署在不同的服务器,甚至一个应用部署多个服务器,既可以减负,还可以保证高可用,想想就激动,太有才了!

先别急着激动。因为马上就会遇到一大堆的问题。 1. 单体应用相对来说调用简单,直接函数调用,出错的可能性小很多。现在分成一堆应用,每个应用直接相互调用。网路通信出问题的可能性更大。 2. 一个应用如果更新,那么是把以前的应用直接停掉进行更新呢?还是不停以前的,先开一个新的应用,那么调用他的应用怎么能知道呢? 3. 这一大堆的应用,万一那个出问题了?要如何确认并且及时的修正呢? 4. 以前单体应用,每次更新,更新1个应用,即便有多台服务器,数量相对较少。现在一下子几十个应用。以前更新都要熬夜通宵,到0点用户少了,进行更新。然后还要反复测试,现在更新这么多岂不是要搞死人。 5. 如果一个应用启动多个实例,那么调用者到底要调用哪一个,万一其中一个有问题了,调用者如何屏蔽掉这个去调用其他饿。 6. 相比之下微服务相互调用,效率肯定远远低于单体应用。说好的高并发变成了高负载。

那么既然有这么多问题,就得找到解决方法嘛。

docker 容器技术

这个时候出来一个神器,叫做docker.他可以把一个服务器虚拟化好多服务器,而且环境相同。更主要的是这个玩意效率高,比以前的虚拟机运行的成本低,消耗服务器资源少,这样才能在一个服务器中虚拟化成百上千的虚拟机而不会宕机。此外这个家伙的环境配置,安装程序,启动服务,都是用命令行就可以执行。你可以把这些命令行提前写好,结合CI工具,一个按钮,就可以自动完成从仓库拉去代码,然后配置好环境,并且按照需求或者要求,在服务器中启动若干个配置好的应用。docker的容器技术,为微服务奠定了基本的基础。

服务治理中心

这么多微服务A调用B,B又调用C,容器把他们一股脑地安装到了好多台服务器上,每个服务器的地址都不一样,而且端口也不一样,固定下来写调用关系吧,端口一发生改变,就崩塌了。这个时候很容易写到一个东西。就是大家把每个服务的地址和端口都登记到一个地方,然后再去这个地方查找具体的服务对应的地址和端口,然后再去调用,有点类似互联网的DNS服务器。这个东西就叫做服务器治理中心,Java中常用的Spring cloud 里面的Eureka,或者阿里的Nacos, Zookeeper。负责登记保存信息的叫做治理服务器,而每个应用都需要一个治理的客户端来把自己登记到服务器上。

客户端负载均衡器

我们提到了每个模块都会搭建很多应用,或者说每个应用都会有很多实例。怎么决定调用这个模块的时候,具体走哪个应用。而且我们去手写调用代码,总是感觉非常麻烦。这个时候就有了负载均衡器这个概念。一方面简化自己写网络请求处理的代码,另外可以根据不同的策略,把请求按期望的分布到不同的应用上去。这个就是负载均衡器的概念。如spring cloud中 Ribbon。

断路器

我们提到的问题中,会有某个特殊情况,其中的一个应用宕机了,那么传递给他请求都会出错。如果不能及时把这个应用给剔除掉,就会有若干请求总是出错。这个时候就用到了断路器。当满足一定的条件,我们就把一个应用给剔除掉,直接剔除掉,或者给出一个简单的提示。这个时候就叫做降级服务,比如你双十一去某宝购物,它服务器压力太大,在奔溃的边缘了,就会给你一个提示:当前用户访问太多,请稍后。另外如果可以限制某个接口流量,而不是到他崩溃了再剔除,岂不是更好,这个就是限速器。都集合在断路器中,如spring cloud中的Hystrix和resilience4j等等。

网关

我们的断路器和负载均衡都是给内部调用使用的。但是我们面向客户的应用,不可能要求每个客户都在自己浏览器上安装断路器或者负载均衡。我们需要一个东西挡在我们面向客户的接口和客户之间。以前我们做单体应用的时候,我们用硬件负载均衡或者nginx来实现。当然现在我们依然可以用ngix来实现,但是如果我们希望能够更加精确的编程比如某个接口进行限流,熔断以后如何降级服务。然后什么接口优先保证,什么接口次要。这个时候如果能编程就更好,nginx给人的感觉总是配置。所以我们经常用到spring cloud中的zuul或者gateway

配置服务

这么多应用,万一我们想修改个什么东西。比如修改下数据库密码,这下可算是捅了马蜂窝了。挨着一个一个修改,然后重启。如果能有几种在一个地方,我们只需要修改一处该多好了。这个时候就用到了spring cloud config.我们可以在本地文件,或者git仓库,或者数据库中修改,就可以几种管理所有的配置服务。是不是更加方便了呢?

全链路追踪

基本上经过我们上面的学习和了解,跑起来一组微服务一点问题都没有了。但是如果中间某个应用出问题了,咱们只能等待断路器给他断掉,然后等流量过去了,再自行恢复。能不能恢复,我们只能听天由命,因为我们也不一定知道哪个出问题,不知道问题在哪里,怎么解决。这个时候就需要一个追踪的东西,能知道一个访问调用了多少环节,每个环节占用多少时间,方便及时的发现问题,并且处理问题。同时还有助于我们尽早优化代码。这个玩意儿,我们叫做全链路追踪如spring cloud sleuth.

监控

有了链路追踪,我们的更容易发现问题。我们还需要需要一个监控器,让各种数据汇总成图标。spring cloud提供了一个spring cloud admin很方便容易的让我们对所有的微服务进行监控。

日志管理

我们做单体应用的时候,就少不了日志来发现问题。微服务那么多应用,更少不了日志。如果想以前一样的保存到一个文件,查找问题就是大海捞针,不用担心,前人已经给我们开发了十分完善的轮子。比如Elasticsearch和Kibana,方便我们可视化的对日志进行管理。

消息队列 数据流软件

在这么多服务相互调用,然后有的服务可能会一次调用多个其他服务。比如一个订单服务,收到订单以后,肯定得从买家账户扣钱,还得添加购物车,同时还得通知卖家库存减少等等操作。那么可能每个部分都是一个服务,这样相互调用耦合度就非常大。特别是,如果业务链条需要延长了,那么就需要去修改具体的服务。这个时候就引入了消息队列,和数据流的感念。负责订单的模块,只需要把相关的消息放到消息队列,然后其他需要接受到订单消息进行的操作,只需要订阅该队列,就可以依次执行。大大降低耦合,拥抱变化。

如果理解了微服务的由来的必要性,就很容易理解每一个部分为什么出现,是应对什么样的应用场景。学习起来就会事半功倍。

多个微服务的接口依赖如何测试_一文看懂微服务相关推荐

  1. 多个微服务的接口依赖如何测试_微服务测试之接口测试和契约测试

    日常开发过程中,项目的接口通常由服务提供方约定和提供,微服务模式下接口被多个消费者调用更是常态,那么提供方接口的变更如何快速.高效.无遗漏的通知给消费者呢?另外,当一个service同时被多个使用者调 ...

  2. 一文看懂微服务背后的技术演进与应用实践

    简介: 2021年7月2日,阿里云用户组(AUG)第一次线下活动在济南召开.阿里云云原生资深专家李国强结合自身微服务领域经验,现场跟数十家山东企业分享了云原生的代表技术之一"微服务" ...

  3. centos7执行sh文件_一文看懂centos7如何管理自定义脚本服务

    概述 centos6如果要添加自定义脚本服务只需要把脚本放到/etc/init.d然后授权后用chkconfig添加后就可以管理了,那么centos7又是怎么添加自定义脚本服务呢? CentOS7添加 ...

  4. 依赖注入有点_一文读懂Java控制反转(IOC)与依赖注入(DI)

    要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle ). 什么是依赖 ...

  5. weblogic多次连接后tcp服务堵塞_一文看懂 Web服务器、应用服务器、Web容器、反......

    导读:我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分 ...

  6. 一文看懂数据服务DaaS

    数据是国家的,金融是国家的.朕不给,你不能要. (1)中国数据服务 一.数据工具 像云计算厂商搞的大数据平台,就是这个定位.它们纯搞产品,做好品牌,做好合作伙伴招募,由合作伙伴去做客户销售.解决方案. ...

  7. 一张图看懂微服务架构路线

    目录 一张图看懂微服务架构路线 我为什么选择微服务架构? 微服务架构路线 基本思路 Docker 容器编排 Docker 容器管理 API网关 负载均衡 服务发现 事件总线 日志记录 监控和警报 分布 ...

  8. 一分钟看懂微信服务号和订阅号到底哪个好?

    https://baijiahao.baidu.com/s?id=1564252452917327&wfr=spider&for=pc 一分钟看懂微信服务号和订阅号到底哪个好? 首席评 ...

  9. 网关 跨域_好文推荐:微服务网关实战—Spring Cloud Gateway

    作者:博云BoCloud| 前言 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用. ...

  10. 一文读懂微服务架构的重构策略

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 你很有可能正在处理大型复杂的单体应用程序,每天开发和部署应用程序的 ...

最新文章

  1. 使用小型变压器的线圈设计实验磁标初步实验
  2. figure diagram illustrate exemplify profile
  3. mount 网络_mount系统调用(ksys_mount-gt;do_mount-gt;do_new_mount)
  4. Java 9中什么是私有的?
  5. 信息学奥赛一本通C++语言——1003:对齐输出
  6. 人民大学的《统计学》
  7. Java定时任务中间表,mysql 通过定时任务更新中间表
  8. 图像处理自学(五):CAMERA驱动软件硬件架构V4L2
  9. rutime 理解
  10. 使用 Chrome Timeline 来优化页面性能 1
  11. python 3维图形库_Python 绘制 3 维以上的高维图
  12. AI智能电话机器人源码搭建原理及步骤
  13. VTD的官方help翻译-ROD部分(1~4章)
  14. 树莓派安装centos操作系统
  15. 机械专业与计算机专业哪个专业更好,机械类哪个专业好
  16. boostrap中lg,md,sm,xs分别对应的像素宽度
  17. 电脑播放视频显示运行服务器失败,电脑不能播放视频如何解决?
  18. Mathmatica可视化
  19. oracle adf源代码在哪里,第 3 章 | 从设计到实践全面了解 Oracle ADF 应用程序
  20. Win11开始菜单关机键不见了怎么办?

热门文章

  1. 日久见人心,以小见大
  2. ATITIT提升效率 保持简单性 优化 简化 目录 1.1. 概念简单 1 1.2. 语言简单性 弱类型 动态变量 动态实体 1 1.3. 数据结构简单 arr 代替了array map s
  3. Atitit java解析yml文件 以及使用 spel ognl 读取 v4 u77.docx Atitit java解析yml文件 目录 1.1. Springboot use snak
  4. Atitit mybatis prblm n solu v1 u55 目录 1.1. 加载任意文职cfg 1 1.2. 根据dburl获取factory 1 1.3. Load any mapper
  5. Atitit.wrmi web rmi框架新特性
  6. Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现
  7. paip.navicat form mysql导入文本文件时CPU占用100%的解决
  8. paip.提升用户体验---验证码识别与盲人
  9. Julia: 关于下载库时WinRPM的Bug
  10. 【图像加噪】基于matlab多种噪声图像加噪(含信息熵)【含Matlab源码 1837期】