微服务架构学习与思考(06):如何构建微服务?

微服务架构下消息服务多通道设计思路 在微服务架构软件中,消息是极其重要的一部分,一般会独立成一个服务,称为 message 服务。其主要作用就是发送消息,并且支持向多种第三方发送,如站内信、邮件、短信等。 发送消息难点 发送消息接口响应时间太长。当 mesage 服务接收到发送消息请求后,可以做到实时向第三方进行发送,但第三方的消息返回时间不可控制。即发送消息的接口响应时间受到了第三方的限制。 只开发一个接口就能同时兼容不同的第三方发送行为。比如通过一个接口即可处理发邮件、发短信的行为。 解决思路 一般通过第三方发送消息的整体流程是:首先 阅读详情

一、前言

在微服务技术体系中,已经列出了构建微服务架构所需要的技术。

这篇文章只是列出了构建微服务所需要的技术,是微服务所需技术的整体介绍。
但是并没有说明构建一个微服务的具体工作是怎么做的?需要做哪些事情?这一篇文章就来说说这些问题。

二、构建微服务

2.1 基本流程

基本流程

通常在构建一个简单的微服务时,有一个客户端,一个服务端,一个注册中心。

  1. 编写服务端程序,服务启动时,会把自己提供的服务注册到注册中心
  2. 编写客户端程序,客户启动时,会到注册中心查找自己需要的服务
  3. 客户端找到服务后,就会调用服务端提供的服务

这3步就构建了一个简单的微服务。

在上面3步中,又有哪些需要注意的步骤?定义服务。

服务定义

如何定义一个服务?而且各种语言都通用的,各种开发都可以使用的一种语言。这就是 IDL 。

在微服务中,最简单的一个请求模型就是:请求 <-> 应答。那怎么定义请求部分的数据格式,返回部分的数据格式?

其实“巨人”已经给我们准备好了,那就是 protocol buffers 和 thrift。这是目前比较常用 2 种 IDL 语言。

这里选择 protocol buffers 。protocol buffers 是一种轻量级的结构化数据存储格式,与语言、平台无关、可扩展的序列化格式。它的性能和效率比 JSON、XML 都要好很多。因为它是二进制存储,所以可读性就比较差。

比如定义一个服务、请求、响应的消息格式:

// 定义一个服务
service Simple{
    rpc SimpleService (SimpleRequest) returns (SimpleResponse){};
}

// 定义发送请求信息
message SimpleRequest{
    string data = 1;
}

// 定义响应信息
message SimpleResponse{
    int32 code = 1;
    string value = 2;
}

然后在用 protoc 命令可以生成相应语言的程序。把数据序列化。

我用的较多是 Go 语言,所以都会生成 Go 语言。

服务传输协议

上面的服务定义好了,用命令序列化了,那怎么把数据传输出去?

是直接用 TCP 还是 应用层协议。
应用层协议有http协议,还可以自己定义协议。没有特殊情况,一般都会选择 http 协议,现在也有 http2 协议了。比如 RPC 框架 gRPC 就是用的 http2 协议。

2.2 服务注册/发现

在上面基本3流程里,有一个服务注册中心,这个有什么作用?

一个公司业务,如果用微服务架构来开发。那么就有多个微服务来提供服务,这么多的微服务,怎么存储?客户端才能更好的发现并使用这些服务?

  1. 服务容易被客户端查找
  2. 服务修改了,可以通知客户端

服务注册中心就应运而生,为客户端和服务端提供这些服务。
服务端可以把服务注册到服务注册中心,客户端订阅服务,变更了还可以通知到客户端。

可以在本地缓存服务列表,如果和服务中心网络断了,还可以提供服务。

注册中心常用软件:

  1. etcd
  2. consul
  3. zookeeper

我常用的是 etcd ,k8s 也在用这个软件。

2.3 服务监控

为什么需要监控?
当运行的服务发生故障时,IT 人员需要第一时间知道服务出现了问题并修复故障,而不能等到用户不能使用服务时。那样的话,公司业务可能受损,产品体验就会下降,导致用户流失。
所以服务监控是必要措施,遇到 IT 故障时主动通知相关开发人员,开发人员就可以积极主动去修复故障。

监控实际上应该是 IT 的基础设施,不管是以前的单体应用,还是后来的微服务架构,监控都是不可缺少的一环。

现在比较常用的监控工具就是:Prometheus,这个是 CNCF 下的一款软件产品。

当然还有很多其他的监控软件,可以一并看看,对比,然后选择适合企业业务的监控软件。

2.4 服务链路追踪

有了上面的服务监控,为什么还要服务链路追踪呢?

如果你是单体架构,当你遇到故障时,服务监控就可以解决问题。架构比较简单,服务调用层次少。

如果你是微服务架构,一个微服务可能调用好几个其他的微服务,并且有可能你调用的服务也调用了其他服务,这样复杂的调用链路关系,当服务出了故障时,排查错误就不止要排查一个微服务了,可能这条微服务上的其他服务也需要排查,也及是这条服务的整个调用链路关系,都需要排查。

这时,链路追踪就可以派上用场了。

现在的分布式链路追踪系统,都是从 google Dapper 论文而来的。

可以看看这篇 Dapper 论文:Dapper.pdf

2.5 服务治理

为什么要服务治理呢?

因为在微服务 api 运行过程中,会出现一系列的问题,这些问题如下:

  1. 调用方和被调用方,被调用方因为网络暂时不可用了,怎么办?
  2. 如果一个微服务突然访问量增大,影响了与它调用相关的微服务运行状态,比如导致其他服务调用变慢,这时怎么办?
  3. 如果访问量继续增大,导致微服务 A 不可用了,与之调用关联的 B、C 服务也慢慢变得不可用了,怎么办?
  4. 如果某个服务的服务器宕机、延迟或某一服务不可用了,怎么办?
    … …

等等的一些微服务运行过程中会出现的问题。为了处理这些问题,就出现了服务治理的一些方法。

服务超时/重试

服务超时:
在一个规定时间内,对方没有应答,那么就可以认为请求超时。认定为超时,就可以进一步处理。比如说重试,或者直接记录错误。

服务重试:
由于网络不稳定,导致调用服务失败,或者调用超时,这时候就可以通过重试,重新调用请求,增加调用成功率。

一般情况下,服务超时和服务重试,是结合在一起使用的。

服务限流

第一种:如果某一 API 流量变大,影响了其他服务,可以进行限流。
这个可以解决访问量变大的问题。

第二种:对于某一特定请求服务有限定次数请求,比如 100次/s 。

服务熔断

熔断就是关掉某一个服务,使其他服务不受之影响。

如果遇到访问量很大,或系统异常或Load过高出现暂时不可用,微服务 api 请求的就会失败,如果失败率超过了规定的阙值,那么就可以进行熔断处理,保护其他的微服务 api。

这还有一个形象的叫法:电路熔断器。日常的电路开关,就是用的这种工作模式,电流过大,就会跳闸,然后可以手工恢复。

服务降级

当访问量变大,超过了设置的阙值时,就可以将一些非重要、非核心的业务进行降级处理,暂停其对外提供服务。保护核心 API 访问不受影响。

依赖隔离

为什么要隔离?也是为了某一服务不可用,不影响其他服务。

比如服务 A 调用服务 B,B 又调用了服务 C,如果这时候 C 访问量变大或机器宕机了,B 调用 C 服务访问不了或者 hang 住了,那么 B 服务器资源消耗会上涨,如果继续上涨到不可用,那么这个条 API 服务可能就不能服务,为了避免这种情况出现,可以对 C 服务进行隔离。从而避免级联故障出现。

这种隔离方式还有一个专门的模式:舱壁隔离(Bulkhead Isolation)。

在造船行业,往往使用此种模式对船舱进行隔离建造,利用舱壁将不同的船舱隔离起来,这样如果一个船舱破了进水,只损失一个船舱,其它船舱可以不受影响,而借鉴造船行业的经验,这种模式也在软件行业得到使用。

舱壁模式(Bulkhead):

隔离了每个工作负载或服务的关键资源,如连接池、内存和 CPU。使用舱壁避免了单个工作负载(或服务)消耗掉所有资源,从而导致其他服务出现故障的场景。这种模式主要是通过防止由一个服务引起的级联故障来增加系统的弹性。

fallback

这个 fallback 怎么译文,应急模式,备用模式,回退模式,都不是很形象。

在上面的服务超时、重试、熔断或者限流发生时,为了及时的恢复服务或不影响用户体验,可以提供回退的机制,常见的回退策略有:

  1. 自定义处理:
    在这种情景下,可以使用默认数据,本地缓存数据来临时支撑,或者使用备份服务获取数据,适用于业务的关键流程与严重影响用户体验的场景,如商家/产品信息等核心服务

  2. fail-silent
    直接返回空值或缺省值,适用于可降级功能的场景,如产品推荐之类的功能,数据为空也不太影响用户体验

  3. fail-fast 快速失败
    直接抛出异常,适用于数据非强依赖的场景,如非核心服务超时的处理

  4. failsafe
    失败安全,出现异常时,直接忽略,通常用于吸入日志操作的场景

  5. failback
    失败自动恢复,后台记录失败请求数据,定时重发请求。通常用于消息通知等场景

  6. failover
    失败自动切换,当出现失败,重试其他服务器

2.6 网关 gateway

为什么需要网关,网关有哪些作用?

微服务网关提供了整个微服务 API 请求的入口。可以隔离后端的 API 服务,聚合 API 服务,对用户请求进行统一处理。

gateway 实现的功能,比如上面的一些限流、熔断、监控等,当然还有其他的一些功能:

  1. 黑白名单机制
  2. 统一登录验证/认证
  3. 跨域问题
  4. 日志拦截
  5. 权限控制
  6. 服务治理一些功能:限流、熔断 等
  7. 负载均衡
  8. 灰度发布

网关软件:

上面都是基于 nginx + lua 构建的网关。

还有 traefik
sping cloud gateway ,等等。

2.7 微服务框架

还有一个重要的框架,就是编写微服务的框架。
现在主流构建微服务的语言是 Go 和 java。

Go 的微服务框架:

Java 的微服务框架:

2.8 配置中心

最后随着微服务的数量增多,配置文件也变得越来越多,比如数据库配置,服务器配置,下发规则配置等各种配置,这时候可能你就要建立一个配置中心。

常用的配置中心:

三、参考:

微服务架构学习系列文章:

波动性GARCH模型与波动率预测(代码+结果分析) 本文介绍的ARCH、GARCH模型可以刻画出随时间变化的条件异方差。 阅读详情

相关推荐

IEC61850 通信协议测试验证实战指南:从理论到实践

本文提供了一份全面的IEC61850通信协议测试验证实战指南,强调测试必须从理论走向工程实践。文章详细讲解了如何搭建测试环境,并深入剖析了MMS、GOOSE、SV三大核心协议的实战测试方法,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备的互操作性与通信可靠性。

weixin_29204121的博客 170

微服务架构学习与思考

微服务 (Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic) 的 API 集相互通信。应用小,可快速编译部署单个微服务维护性变高,修改容易,因为每个团队独立负责一块功能。新功能交付变快,可以快速开发交付扩展性变高,根据业务规模可以随时缩减/增加服务器规模。

wangqiaowq的博客 556

tesseract-ocr的字库学习步骤(训练自己的文库),关于ocr的对图片的解析,包括tesseract的安装(史上最全)

tesseract-ocr的字库学习步骤(训练自己的文库) 简介:在网上看了很多案列。都不是很完整。然后自己用了一天时间进行整理,第一次写文章,希望对大家有帮助。 一、安装tesseract 下载地址https://github.com/UB-Mannheim/tesseract/wiki 1.点击下面下载的这个进行运行(安装的时候有点慢) 2.点击next 3.I accept the terms of the License Agreement前的复选框打勾,点击Next。 4.Install f

HAC12的博客 2229

[译] 设计一个容错的微服务架构

译者:jasonGeng88https://github.com/jasonGeng88/blog微服务架构使得可以通过明确定义的服务边界来隔离故障。但是像在每个分布式系统中一样,发生网...

Java笔记虾 628

4 种方法识别Linux系统 USB 设备

导读 如果在系统中插入一个设备,尤其是在桌面环境下,比如 USB 设备,它会自动挂载到一个指定目录,一般是在 /media/username/device-label 目录下,之后你就可以进入到该目录下访问那些文件了。然而,在服务器上就不是这么回事了,你必须手动挂载这个设备,并且指定一个挂载点。 查询USB设备 Linux 系统使用 /dev 目录下特定的设备文件来标识插入的

郑帅的博客 1986

微机原理-基于8086电压报警2.5V仿真系统设计

*单片机设计介绍,微机原理-基于8086电压报警2.5V仿真系统设计。

2201_75940997的博客 1082

如何构建微服务架构?

图1-5简单微服务架构在图1-5中,部署了一系列的微服务,每个微服务都会访问自己的数据库(Database)。当这些微服务启动时,会将其信息注册到服务注册中心(Service Registry), 在客户端发送请求时,请求首先会被API网关(APIGateWay)拦截,API网关会读取请求数据,并从注册中心获取对应的服务信息,然后API网关会根据服务信息调用所需的微服务。⑤服务容错:通过断路器(也成熔断器)等一系列的服务保护机制,保证服务调用者在调用异常服务时快速的返回结果,避免大量的同步等待。

Blue92120的博客 338

C# 进阶:打造WinForms中的动态交互式UserControl

本文深入探讨了如何在C# WinForms中创建动态交互式UserControl,以提升桌面应用的用户体验和代码复用性。通过剖析UserControl生命周期、事件体系,并结合一个可拖拽缩放的分割面板实战案例,详细讲解了鼠标键盘事件处理、自定义绘制、状态管理以及性能优化等核心技巧,帮助开发者封装复杂交互逻辑,打造专业级自定义控件。

weixin_29279153的博客 460

【从零开始学微服务】06.微服务架构的建设思路

基于框架模式的微服务建设方案已经非常成熟,国内最知名的就是 Spring Cloud 、 Spring Cloud Alibaba 、 Dubbo等等,而基于服务网格(Service Mesh)的建设方案目前各个大厂也都有尝试和落地,但是要求也更高。。《从零开始学微服务》《从零开始学微服务》

万猫学社 2664

calibre QRC提取寄生参数

typical将上面的文件QCI_flow里面的文件 在Cp 到当前 ,其实应该是某几个文件,但是我给忘记了 就全cp过来了 ,无影响,不过也希望大佬指正。

2202_75711937的博客 1517

【2024/3/12 更新】Windows Server 2019 服务配置与管理汇总

本栏目一共介绍了17种Windows Server 2019 的服务配置与管理,为了方便大家阅读理解,特意总结了17种服务的一些内容。具体说明如下所示

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 2万+

创建微服务架构的步骤_微服务架构学习与思考(06):如何构建微服务?

一、前言在微服务技术体系中,已经列出了构建微服务架构所需要的技术。这篇文章只是列出了构建微服务所需要的技术,是微服务所需技术的整体介绍。但是并没有说明构建一个微服务的具体工作是怎么做的?需要做哪些事情?这一篇文章就来说说这些问题。二、构建微服务2.1 基本流程基本流程通常在构建一个简单的微服务时,有一个客户端,一个服务端,一个注册中心。编写服务端程序,服务启动时,会把自己提供的服务注册到注册中心编...

weixin_39899244的博客 246

【实战】CANOE实现UDS安全访问过程的CAPL脚本

首先我已经有了包含安全访问算法的dll文件,并通过Diagnostics/ISO TP Configuration中加载了此dll文件,如下。在on start部分,要将“ECU qualifier“作为参数,执行diagSetTarget函数。这个函数是用于设置tester从现在开始与之通信的目标ECU,并配置/建立与该ECU的通信通道。我最近在做密钥学习上位机时,遇到一些问题:如何用CAPL脚本实现安全访问过程?ECU Qualifier可以通过加载cdd文件后,在如下位置找到。CAPL脚本如何编写。

weixin_46481662的博客 4939

微服务架构学习与思考(07):企业团队组织架构如何变革?

微服务架构特点:每个微服务是独立的,团队可以独立开发,独立测试,独立部署,服务是自治的。到了微服务架构时期,利用分治的思想把业务划分为了一个一个小的服务,每个开发团队独立负责几个微服务的业务,这时候团队组成人员也要进行相应的调整,以适应微服务架构的开发。我们要把以前那种中心化的组织架构,改成去中心化的组织,每个团队可以独立完成一个微服务业务的开发上线,即设计,开发,测试,部署,上线服务。原先那种职能型的团队,变成了跨职能的小团队,这种团队和微服务架构对齐,实现团队的独立和自治,实现一体化开发上线操作。

九卷技术录 329

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

微服务架构学习与思考(16):SOA架构与微服务架构对比分析?它们之间区别是什么?

SOA(Service-Oriented Architecture) 架构是面向服务的架构,是一种将单体应用粗粒度的划分为服务的架构,其核心是将业务功能抽象为独立、可重用、松耦合的服务,也就是将业务功能通过 IT 技术封装为服务,并通过标准化的接口进行发布、查找和调用,从而达到构建灵活的企业 IT 应用系统。从应用技术开发层面来看,就是将应用程序的功能模块以独立、分布式、可复用的服务的形式组织起来,然后通过标准的接口和契约,使不同的服务能够跨平台、跨语言、跨系统集成,组成企业的各种应用系统。

weixin_41428871的博客 113

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: Redis服务端事件处理流程分析
下一篇: 微服务架构学习与思考(07):企业团队组织架构如何变革?
九卷沉思录
博客等级 码龄14年 745粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值