Part01微服务的概念在传统的软件开发中,整个应用程序的代码被组织在一个单一的代码库中。代码拆分一般有以下几种方式:一是按照Feature-based进行代码拆分,比如MVC模式;二是按功能拆分,在一个较大的项目中,将代码封装在处理不同业务的包中,然后在包内部进行拆分。无论怎么拆分,两者的代码最终都会集中在一个库中进行开发和管理,而微服务是上面第二种拆分方式的扩展,将代码按功能拆分成若干个包,每个包都是单一的可以独立运行的代码库。区别如下:传统代码库与微服务代码库的区别与传统开发相比,微服务大大降低了开发和维护的复杂度,提高了业务的可扩展性。在传统单一代码库的应用中,模块紧密耦合,边界模糊。随着产品的进一步迭代,代码的开发和维护会越来越复杂,潜在的bug和漏洞也必然会越来越严重。更有什者,将整个应用的代码按照功能拆分成小而独立的微码服务库,降低了模块耦合度,进一步明确了模块之间的界限。在传统的项目开发中,一些代码可能会在多个模块中被频繁使用。这个高度可重用的模块经常被提取并用作公共代码库。当这个功能需要扩展时,单个代码库的大小只会增加,整个应用程序需要重新部署。在微服务框架中,高复用模块可以独立为一个服务,可以独立运行、测试和部署。微服务是一个架构概念,而不是一个具体的框架项目。很多编程语言都可以实现,但是有些语言对于微服务开发有着先天的优势,Golang就是其中之一。Golang本身的可移植性很强,运行效率高,并且原生支持并发编程,从而可以更好的利用多核处理器。这里介绍一个成熟的golang分布式微服务框架——go-zero。Part02利用go-zero微服务框架的优势,轻松获得支撑千万级日活跃服务的稳定性;内置级联超时控制、限流、自适应熔断、自适应减载等微服务治理能力,无需配置和额外代码;微服务治理中间件可以无缝集成到其他现有框架中;极简API描述,一键生成两端代码;自动检查客户端请求参数的合法性;拥有大量的微服务治理和并发工具包,社区生态优良。Go-zero架构图Part03Fuse原理与实现Fuse在微服务中的服务中非常常见。例如,评论服务依赖于评论服务,而评论服务又依赖于反垃圾邮件服务。当评论服务调用评论服务时,评论服务调用反垃圾邮件服务。服务,此时如果反垃圾服务宕机超时,评论服务会一直等待,评论服务会一直调用评论服务,会造成大量的请求堆积,导致所有服务往下走。可见,在整个调用链中,中间某个环节出现异常,就会导致上游调用服务出现一系列问题,甚至导致整个调用链的服务宕机。因此,当一个服务作为调用者调用另一个服务时,为了防止被调用服务出现问题而导致调用服务出现问题,所有的调用服务器都需要进行自我保护,常见的保护方式就是熔断。点评-点评-反垃圾邮件服务调用图熔断原理:熔断机制指的是日常生活中熔断器的保护机制。当电路过载时,保险丝会自动断开,以确保电路中的电器不受损坏。服务中的熔断机制是指在发起服务端调用时,如果被调用方法返回的错误率超过阈值,则不会真正发起请求,而是在调用方法时直接返回错误。在熔断模式下,服务调用者为每一次调用服务维护一个状态机,这个状态机中有三种状态:1.关闭(Closed):在这个状态下,我们需要一个计数器来记录调用失败的次数和请求总数,如果在一定的时间窗口内,failed失败率达到预设的阈值,则切换到断开状态,此时开启一个超时时间,到达时间切换到半关闭状态,超时时间是为了让系统有机会纠正导致调用失败的错误,从而恢复到正常的工作状态。在关闭状态下,调用错误是基于时间的,并在特定时间间隔重置,这可以防止意外错误导致熔断器进入打开状态。2、打开(Open):在这种状态下,发起请求会立即返回错误。一般会启动一个超时定时器。当定时器超时时,状态将切换到半开状态。也可以设置一个定时器,定时探测服务是否恢复。3.半开:在这种状态下,允许应用程序向被调用的服务发送一定数量的请求。如果这些调用都正常,则可以认为被调用的服务已经恢复正常,此时熔断器切换到关闭状态,同时需要重新设置计数。如果这部分仍然有呼叫失败,则认为被叫方还没有恢复,熔断器会切换到打开状态,然后重新设置计数器。半开状态可以有效防止正在恢复的服务被突然的大量请求再次击倒。Fuse状态集Part04go-zero并发编程在微服务开发中,api网管起到对外提供restfulapi的作用,而api的数据往往依赖于其他服务,复杂的api会依赖多个甚至几十个服务,虽然单个依赖服务的耗时一般较低,但是如果多个服务串行依赖,整个API的耗时会大大增加。那么通过什么手段来优化呢?我们首先想到的是以并发的方式处理依赖,这样可以减少整个依赖的耗时。Go基础库为我们提供了并发控制的WaitGroup工具,但是在实际业务场景中,如果有多个依赖发生错误时,我们期望的是立即返回,而不是等所有依赖都执行完后才返回结果,而对的赋值WaitGroup中的变量经常需要加锁,每个依赖函数都需要添加Add和Done,新手比较容易出错。基于以上背景,go-zero框架为我们提供了并发处理工具MapReduce。MapReduce是Google提出的一种用于大规模数据集并行计算的软件架构。go-zero中的MapReduce工具就是基于这种架构思想,go-zero框架中的MapReduce工具主要用于并发处理批量数据,以提高服务性能。MapReduce示意图
