微服务基础介绍

Part1一、基本概念

微服务最主要的功能是根据业务拆分成一个一个的子服务,实现功能的去耦合,每一个微服务提供单个业务功能的服务,各司其职,从技术角度看就是一种灵活独立的单元,能够自行单独启动和关闭,一般每个服务都拥有自己的数据库模块。

在传统的IT行业软件大多都是各种独立系统的堆砌,这些系统的问题总结来说就是扩展性差,可靠性不高,维护成本高。到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如J2EE。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 变得很笨重,在一些中小企业的场景中并不适合。

11.1 微服务与单体架构区别

单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。 单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。 单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。

21.2 微服务和SOA的区别

微服务,从本质意义上看,还是 SOA 架构。但内涵有所不同,微服务并不绑定某种特殊的技术,在一个微服务的系统中,可以有 Java 编写的服务,也可以有 Python编写的服务,他们是靠Restful架构风格统一成一个系统的。所以微服务本身与具体技术实现无关,扩展性强。

Part2二、微服务的特点

微服务的主要作用在于实现了一套基础架构系统,使得各个服务之间松耦合,在功能上表现为统一的整体。这种所谓的“统一的整体”表现出来是统一风格的界面、权限管理、安全策略、上线过程、日志和审计方法、调度方式和访问入口等等。

32.1 微服务设计原则

单一职责原则 每个微服务只需实现自己的业务逻辑,比如教学模块,它只需要处理教学相关业务逻辑就可以,其它的内容拆分出去;

服务自治原则 各个微服务从开发、测试、发布、运维等都是彼此独立的,他们的存储数据库也彼此分开,降低了各自的依赖;

轻量级通信原则 首先是彼此通信的语言非常的轻量,其次是通信方式需要跨语言、跨平台,这是为了让每个微服务都有足够的独立性,可以不受技术的限制。常见的方式是通过REST API或RPC的方式进行通信;

接口明确原则 一般微服务之间会存在调用关系,为了尽量避免某个微服务的接口变化而导致其它微服务牵一发而动全身,在设计之初就要考虑到常用的情况,让接口尽量做到通用灵活,尽量避免大范围的改动。

42.2 客户端访问服务

为了与各服务之间进行通信,客户端就需要记住这些服务,包括服务的下线/更新/升级,端上就要做重新部署,同时客户端也在维护和发版等,这就需要统一的管理。另外各服务的调用也需要一定的网络开销。而且一般情况下,微服务在系统内部通常是无状态的,用户登录信息和权限管理最好有统一的地方维护管理。

所以一般在后台服务和UI之间会有代理或API Gateway,它的作用如下:

提供统一服务入口,让微服务对前台透明 聚合后台的服务,节省流量,提升性能 提供安全,过滤,限流等API管理功能

52.3 API网关

API网关是将所有API调用统一接入到API网关层,有网关层统一接入和输出。一个网关的基本功能有:统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。有了网关之后,各个API服务提供团队可以专注于自己的的业务逻辑处理,而API网关更专注于安全、流量、路由等问题。

Chris Richardson 在他的博客中把 API 网关划分为以下两种:单节点 API 网关、Backends for frontends 网关。

比较热门的开源API网关组件: Tyk:Tyk是一个开放源码的API网关,基于golang语言开发。Tyk提供了一个API管理平台,其中包括API网关、API分析、开发人员门户和API管理面板。 Kong:Kong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 可以在任何RESTful API运行,通过插件扩展,它提供了超越核心平台的额外功能和服务。 zuul:提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。

过滤器filter是整个Zuul的核心,分为前置过滤器(pre filter)、路由过滤器(routing filter)、后置过滤器(post filter)以及 错误过滤器(error filter)。当一个请求过来时,会先执行所有的 pre filter,然后通过 routing filter 将请求转发给后端服务。后端服务进行结果响应之后,再执行 post filter,最后把响应给客户端。在不同的filter里面可以执行不同的逻辑,比如安全检查、日志记录等。

Part3三、服务调用

微服务的多个服务之间的通信一般分为两种方式,同步调用和异步调用。

63.1 同步

远程过程调用(Remote Procedure Invocation)直接通过远程过程调用来访问别的service。示例 REST、gRPC、Apache、Thrift、RPCX等。

一般同步调用比较简单,可以满足强一致性,但是在调用层次多的时候性能容易出现问题,性能体验上比较差。常见的RESTful和RPC的各有所长。一般REST基于HTTP,可以跨客户端更容易实现,服务端实现的技术也更灵活,各个语言都能支持,只要封装HTTP的SDK就能调用,使用的范围较为普遍;RPC的优点在于传输协议更高效,安全可控,尤其是公司内部有统一的开发规范和服务框架,开发效率优势更明显。

73.2 异步

使用异步消息来通信,服务间通过消息管道来交换消息,从而完成通信。支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应。常见的有Kafka、RabbitMQ、RocketMQ等。

异步消息的调用在分布式系统中也发挥了重要作用,它既减少了服务之间的耦合,又可以缓冲消息,降低积压带来的影响,同时能保证调用方的服务异步的体验,专注于自己的任务不受打扰。不过带来的问题是数据的最终一致性;再一个就是后台服务一般要实现幂等性,考虑到消息发送的性能一般会有重复(通常只被接收一次),需要制定对应的推送和消费策略。

Part4四、服务发现

Zookeeper作为服务注册中心保证了CP,即高可用和实时更新。当向注册中心查询服务列表时,一般可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题是选举leader的时间长达30~120s,且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是难以容忍的。

通过ZK(zookeeper)技术做服务注册信息的分布式管理。当 服务上线时,服务提供者将自己的服务信息注册到ZK,并通过心跳维持长链接,实时更新链接信息。服务调用者通过ZK寻址,根据可定制算法,找到一个服务,还可以将服务信息缓存在本地以提高性能。当服务下线时,ZK会发通知给服务客户端。 其他能够作为服务注册中心的有: etcd:高可用,分布式,强一致性的,key-value,Kubernetes和Cloud Foundry都使用了etcd; consul:用于discovering和configuring的工具。它提供了允许客户端注册和发现服务的API。Consul可以进行服务健康检查,以确定服务的可用性。

Part5五、服务容错

分布式服务的特点就是网络是不可靠的。通过微服务拆分能降低这个风险,如果没有特别的保障,可能引起很严重的后果。当系统是由一系列的服务调用链组成的时候,必须确保任一环节出问题都不至于影响整体链路。处理服务挂掉的相应手段有很多:

隔离 超时重试 限流 熔断机制 降级(本地缓存)

85.1 容错机制

1 隔离

它是指将系统按照一定的规则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不涉及其他模块,不影响整体的系统服务。常见的隔离方式有:线程池隔离和信号量隔离。

2 超时重试

超时与重试机制也是容错的一种方法,凡是发生RPC调用的地方,比如读取redis,db,mq等,因为网络故障或者是所依赖的服务故障,长时间不能返回结果,就会导致线程增加,加大cpu负载,甚至导致雪崩。在上游服务调用下游服务时,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。

3 限流

限流就是限制系统的输入和输出流量已达到保护系统的目的,为了保证系统的稳定运行,一旦达到需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。 限流方式有:计数器、令牌桶、信号量(漏桶)等

4 熔断

在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全全体的措施叫做熔断。熔断一般有三种状态: 熔断关闭状态:服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。 熔断开启状态:后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。 半熔断状态:尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率,如果成功率达到预期,则说明服务已经恢复,进入熔断关闭状态。如果成功率很低,则重新进入熔断关闭状态。

5 降级

降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就是用托底方案。

95.2 常见的容错组件

Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者是第三方库,防止级联失败,从而提升系统的可用性和容错性。 Resilience4J是一款轻量级、简单、文档清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品,不仅如此,Resilience4J还原生支持SpringBoot,而且监控也支持和promettheus等多款主流产品进行整合。 Sentinel是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。

Part6六、负载均衡

负载均衡的常见策略

106.1 随机

来自网络的请求被随机地分配给内部的多个服务器处理,理想情况下每个机器获得请求的次数是基本相同的。

116.2 轮询

每一个来自网络中的请求,轮流分配给内部的服务器,从1到N然后重新开始。此种负载均衡算法适合服务器组内部的服务器都具有相同的配置并且平均服务请求相对均衡的情况。

126.3 加权轮询

根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。例如服务器A、B、C的权值分别被设计成1、3、6,则服务器A、B、C将分别接受到10%、30%、60%的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。

136.4 IP Hash

通过生成请求源IP的哈希值,并通过哈希值来找到正确的真实服务器。这意味着对于同一主机来说对应的服务器总是相同。使用这种方式不需要保存任何源IP,但是注意,这种方式可能导致服务器负载不平衡。

146.5 最少连接数

客户端的每一次请求在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用轮循或随机均衡的算法,每一台服务器上的连接进程可能会产生很大的不同,并没有达到真正的负载均衡。最少连接数均衡法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在处理的连接数量。当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使负载更加均衡。

Part7七、监控

微服务的监控一般的做法是,让各个组件提供报告自己当前状态的接口(metrics接口),这个接口输出的数据格式应该是一致的。 然后部署一个指标采集器组件,定时从这些接口获取并保持组件状态,同时提供查询服务。最后还需要一个UI,从指标采集器查询各项指标,绘制监控界面或者根据阈值发出告警。 网络上有很多开源组件。RedisExporter和MySQLExporter分别提供了Redis缓存和MySQL数据库的指标接口,微服务则根据各个服务的业务逻辑实现自定义的指标接口,然后采用Prometheus作为指标采集器,Grafana配置监控界面和邮件告警。这样一套微服务监控系统就搭建起来了。

157.1 常见的监控组件

Prometheus Promethes是一款2012年开源的监控框架,其本质是时间序列数据库,由Google前员工所开发。 它采用拉的模式(Pull)从应用中拉取数据,并还支持 Alert 模块可以实现监控预警。性能非常强劲,单机可以消费百万级时间序列。 对于一些定时任务模块是周期性运行的,采用拉的方式无法获取数据,Prometheus 也提供了一种推数据的方式,但是并不是推送到Prometheus Server中,而是中间搭建一个 Pushgateway,定时任务模块将metrics信息推送到这个Pushgateway中,然后Prometheus Server再依然采用拉的方式从Pushgateway中获取数据。 image.png

openTSDB OpenTSDB采用的是Hbase的分布式存储,它获取数据的模式与Prometheus不同,它采用的是推模式(Push)。 在展示层,OpenTSDB自带有WebUI视图,也可以与Grafana很好的集成,提供丰富的展示界面。 但OpenTSDB并没有自带预警模块,需要自己去开发或者与第三方组件结合使用。 image.png

InfluxDB是在2013年开源的一款时序数据库,在这里我们主要还是用于做监控系统方案。它收集数据也是采用推模式(Push)。在展示层,InfluxDB也是自带WebUI,也可以与Grafana集成。 image.png

Part8八、链路追踪

微服务架构中,有很多的服务之间的调用关系,为了更好地定位问题,需要记录服务调用了哪些内部的接口,产生了多少调用,这也就是链路追踪。 链路追踪的记录就像一棵树,每次服务调用会在HTTP的HEADERS中记录至少记录四项数据:

traceId:traceId标识一个用户请求的调用链路,具有相同traceId的调用属于同一条链路; spanId:标识一次服务调用的ID,即链路跟踪的节点ID; parentId:父节点的spanId; requestTime 和 responseTime:请求时间和响应时间。 目前业界比较流行的链路追踪系统,例如Twitter的Zipkin,阿里的鹰眼,美团的Mtrace,大众点评的cat等,大部分都是基于google发表的Dapper。Dapper阐述了分布式系统,特别是微服务架构中链路追踪的概念、数据表示、埋点、传递、收集、存储与展示等技术细节。

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker学习笔记1

PaaS: 一、虚拟化分类: 虚拟化资源提供者: 1)硬件平台虚拟化 2)操作系统虚拟化 虚拟化实现方式: type I: 半虚拟化 type II:硬件辅助全虚拟化 type III: 软件全虚拟化: …

【C++】模版进阶

目录 一、非类型模版参数二、模板的特化1、概念2、函数模版特化3、类模板特化1.全特化2.偏特化3.类模板特化应用示例 三、模版分离编译1、什么是分离编译2、模板的分离编译3、模板的优缺点 一、非类型模版参数 模版参数分为类型模版参数与非类型模版参数 类型模版参数&#x…

[进阶]网络通信:UDP通信,一发一收、多发多收

UDP通信 特点:无连接、不可靠通信。不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端1P、等信息封装成一个数据包,发出去就不管了。Java提供了一个java.net.Datagramsocket类来实现UDP通信。 Datagram…

Springboot项目使用原生Websocket

目录 1.启用Websocket功能2.封装操作websocket session的工具3.保存websocket session的接口4.保存websocket session的类5.定义websocket 端点6.创建定时任务 ping websocket 客户端 1.启用Websocket功能 package com.xxx.robot.config;import org.springframework.context.a…

NSSCTF MOBILE [SWPU 2019]easyapp 详细题解

文章目录 一. 前言二. 安装安卓SDK三. 安装安卓模拟器(推荐夜神模拟器)四. 安装frida和objection五. 解题过程六. 总结 一. 前言 题目地址:[SWPU 2019]easyapp大佬题解[SWPU 2019]easyapp pwjcw的WriteUp 大佬的题解很简单,直接hook就可以看到返回值,但是我看了半天没看明白是…

Redis简介

Redis是基于内存,也可以基于磁盘持久化nosql数据库,使用c语言开发。 数据存储结构:key-value 安装环境准备 Redis使用c语言开发,需要使用gcc编译程序进行编译。 1) 安装gcc a) 从磁盘镜像中进行安装:&…

决策树分类算法

#CSDN AI写作助手创作测评 目录 ID3算法 1.算法原理 2.代码实现 3.ID3算法的优缺点分析 C4.5算法 1.原理 2.优缺点 心得感受 决策树表示方法是应用最广泛的逻辑方法之一,它从一组无次序、无规则的事例中推理出决策树表示形式的分类规则。在决策树的内部…

Java集合详解

集合详解 1、集合,也可以说是容器。由两大接口派生而来,一个是collection,主要用于存储单一元素;另一个是map接口,主要用于存储键值对。 Collection接口 Map接口 2、集合和数组 在之前我们保存多个数据可以使用数组…

Tcl常用命令备忘录-正则命令篇

正则表达式是一种用于匹配、查找、替换文本中特定模式的工具。在Tcl脚本中,可以使用正则表达式对字符串进行匹配、查找和替换。 regexp 语法: regexp ?选项? 正则表达式 字符串 ?变量1 变量2 ...? 其中,?选项?为可选项,…

Spring Security OAuth2授权原理、流程与源码解读

文章目录 前言AuthorizationServerConfigurerAdapter(身份认证服务配置适配器)OAuth2AuthorizationServerConfiguration(OAuth2授权服务配置) EnableAuthorizationServer(开启身份认证服务)AuthorizationServerEndpointsConfigurations身份认证服务站点配置类AuthorizationEndp…

Qt编写精美输入法(历时十年迭代/可换肤/支持Qt4/5/6/win/linux/mac/嵌入式等)

一、前言 大概是从2012年就开始研究用Qt写输入法,因为项目需要,嵌入式板子上,没有对应的输入法,当初使用过很多NVR,里面也是鼠标按下弹出输入法面板进行输入,可以切换数字和字母及中文,于是借鉴…

jmeter如何进行http压力测试

目录 前言: 1、添加线程组: 2、添加采样器: 3、添加监视器 压力测试知识说明 前言: JMeter是一个基于Java的开源压力测试工具,可用于评估Web应用程序的性能,包括HTTP、HTTPS、FTP、SOAP、Restful、JD…

Oracle-高版本SQL优化分析(bind mismatch)

背景: 接到用户报障说一套Oracle19c数据库近期出现insert语句执行变慢的情况,执行一次数据插入需要1秒的时间,而且问题发生的数据库是跑在一体机上面,数据插入正常不应该这么慢,需要分析插入慢的原因 问题: 数据库近期出现insert…

StarRocks 文章收集

StarRocks在58的实践 StarRocks在58的实践 - 墨天轮StarRocks在58的实践 --2022-06-08https://www.modb.pro/db/639611 StarRocks之系统架构 StarRocks之系统架构 - 墨天轮https://www.modb.pro/db/610300 StarRocks小规模集群部署最佳实践(1/2) 0016.S StarRocks小规模集…

2自由度并联仿生腿的制作

1. 运动功能说明 本文实例将实现2自由度并联仿生腿模组运动起来,模拟实现狗腿行走的动作。 2. 结构说明 2自由度并联仿生腿模组是由两个舵机驱动的,它的所有动作都将在两个舵机的配合运动下实现。 3. 运动原理说明 2自由度并联仿生腿模组运动的点位如下…

数据结构-各种树(二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树)

文章目录 二叉树二叉查找树平衡二叉树红黑树B树B树 二叉树 概念:二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一…

2023 年6月开发者调查统计结果——最流行的技术(1)

2023 年6月开发者调查统计结果——最流行的技术(1) 本文目录: 一、编程、脚本和标记语言 二、数据库 三、云平台 四、网络框架和技术 五、其他框架和库 六、其他工具 七、集成开发环境 八、异步工具 九、同步工具 ​十、操作系统 …

端午出行电脑没网怎么办?无线网卡解决网络问题

无线网卡是一种可以让电脑或其他设备通过无线信号连接网络的硬件设备,无线网卡有多种类型和接口,例如USB无线网卡,PCI-E无线网卡,PCMCIA无线网卡等。端午出行在即,不妨看看驱动人生准备的无线网卡攻略,让大…

基于Python的招聘信息可视化系统,附源码

文章目录 1 简介2 技术栈3 总体设计3.1 系统结构3.2 数据库设计3.2.1 数据库实体3.2.2 数据库表设计 4 运行设计4.1 招聘热门行业分析4.2热门岗位分析界面4.3招聘岗位学历分析界面4.4岗位分布分析界面 5 源码下载 1 简介 基于Python的招聘信息可视化系统,通过对招聘数据进行分…

MFC扩展库BCGControlBar Pro v33.5亮点 - Ribbon Bar等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.5已正式发布了,此版本包含了Ribbon(功能区)自定义…