[单master节点k8s部署]37.微服务(一)springCloud 微服务

微服务架构的一个重要特点是,它与开发中使用的具体编程语言技术栈无关。每个微服务都可以使用最适合其功能需求的语言或技术来实现。例如,一个微服务可以用Java编写,另一个微服务可以用Python、Go、Node.js等编写。微服务架构允许这种灵活性,因为每个服务都是独立的,负责处理特定的业务功能,且每个服务都有独立的开发、部署和执行环境。

微服务之间通常需要通过某种通信机制进行交互,RESTful API是最常见的选择之一。RESTful风格基于HTTP协议,并使用标准的HTTP方法(如GET、POST、PUT、DELETE)来操作资源。由于HTTP协议是通用的,且每个编程语言都提供了对HTTP协议的强大支持,采用RESTful API可以使不同技术栈编写的微服务通过统一的接口进行通信。

RESTful

REST是一种架构风格,定义了如何设计系统以通过网络操作资源,而HTTP是一种传输协议,RESTful API通常使用HTTP作为底层协议来实现REST的设计理念。RESTful API是遵循REST原则并通过HTTP提供服务的API,利用HTTP的特性,如通过URL标识资源,使用GET、POST、PUT、DELETE等方法操作资源,并保持无状态通信。RESTful API通过合理应用HTTP方法和状态码来实现对资源的管理和操作,是一种特定的网络接口设计方式。

尽管RESTful API是非常常见的通信方式,但微服务并不强制要求使用RESTful架构风格。根据系统的需求和性能要求,微服务也可以使用其他通信协议,如:

  • gRPC(基于HTTP/2的高效RPC框架)
  • GraphQL(灵活的查询语言)
  • 消息队列(如RabbitMQ、Kafka,用于异步通信)

微服务框架

第一代微服务架构:Spring Cloud由于基于REST的同步通信,服务之间的耦合性较高,调用链复杂时容易产生级联故障。此外,Spring Cloud的组件大多运行在应用层,随着服务数量的增加,管理复杂度上升。

Dubbo是阿里巴巴开源的面向服务的RPC框架,代表了第二代微服务架构。与Spring Cloud不同,Dubbo更强调高性能的RPC通信,适合服务数量较多、系统性能要求较高的场景。Dubbo的RPC通信方式虽然高效,但它的依赖更紧密,服务间的强耦合可能导致扩展性不如基于HTTP/REST的架构灵活。

Service Mesh代表了第三代微服务架构,它通过将服务间的网络通信功能下沉到基础设施层,使微服务更加关注业务逻辑,而不需要处理复杂的通信、负载均衡、监控等基础功能。

  • 零侵入性:与Spring Cloud和Dubbo不同,Service Mesh不需要修改应用代码。所有的网络通信、流量管理、监控、策略控制等都由Sidecar代理完成。应用和基础设施解耦,开发者不再需要关心通信细节。
  • 高级流量管理:Service Mesh能够提供更复杂的流量管理策略,如流量分割、灰度发布、熔断、限流等。这些功能可以通过配置实现,而无需在代码层面实现。
  • 可观测性和安全性:Service Mesh可以通过Sidecar代理自动采集服务的监控数据、日志、分布式追踪等信息,提升了系统的可观测性。同时,它还能实现服务间的加密通信,提高数据传输的安全性。

典型实现:Service Mesh的典型实现包括Istio、Linkerd和Consul,其中Istio是目前最为流行的解决方案,广泛应用于Kubernetes环境下。

优点:Service Mesh实现了真正的“服务与基础设施分离”,开发者可以专注于业务逻辑,基础设施层自动处理复杂的网络通信、监控、安全等问题。此外,随着服务数量的增加,Service Mesh可以统一管理服务的流量和安全策略,适合大规模、复杂分布式系统的管理需求。
缺点:Service Mesh的引入增加了系统的复杂性,特别是在早期部署和维护时,Sidecar代理的管理和监控可能成为新的挑战。此外,由于Sidecar代理的存在,Service Mesh的性能开销也需要考虑。

统一的配置管理中心

在微服务架构中,每个服务通常都是独立的应用,具有各自的配置文件,例如数据库连接、API密钥、第三方服务地址等。然而,随着微服务数量的增加,配置管理变得复杂且难以维护,因此需要一个统一的配置管理中心来简化这个过程。

在微服务中有三种配置,第一种是几乎不变的配置,一般被打包在容器镜像中,第二种是启动的时候需要的配置,一般通过环境变量的方式放在创建pod的deployment或者deamonset文件中。第三种是微服务统一的配置,需要通过配置中心下发。

配置中心 SpringCloud Config

SpringCloud Config 是一个解决分布式系统的配置管理方案,它包含了 server 和 client 两个部分。 server 用来获取远程的配置信息(默认为 Git 仓库),并且以接口的形式提供出去,client 根据 server 提供的接口读取配置文件,以便于初始化自己的应用。如果配置中心出现了问题,将导致灾难性 的后果,因此在生产环境下配置中心都会做集群,来保证高可用。此处配置高可用实际就是把多个配置中 心(指定同一个 Git 远程仓库)注册到注册中心。

全链路监控

对系统的监控和对调用关系的监控。

zipkin,skywalking,pinpoint,prometheus。

Springcloud组件

eureka

服务发现和注册的组件。包含eureka client 和eureka server。

各个节点启动之后,就会将自己的ip等网络信息提供给eureka server。在微服务架构中,Eureka 客户端的下载和配置通常发生在微服务实例启动的过程中在构建微服务时,开发者需要在项目的依赖管理文件中(如 pom.xml 或 build.gradle)添加 Eureka 客户端的依赖。当微服务实例启动时,Spring Boot 应用会自动初始化 Eureka 客户端。在启动过程中,Eureka 客户端会读取配置文件中的信息,并尝试连接到配置的 Eureka 服务器。

Eureka Client 通常分为两个角色:服务提供者(Service Provider)和服务消费者(Service Consumer)。服务提供者是实现具体业务逻辑的微服务,它向 Eureka 服务器注册自己,以便其他服务可以发现并调用它。服务消费者是调用其他微服务的客户端,它从 Eureka 服务器获取需要调用的服务的实例信息。在构建项目时下载的依赖是 Eureka Client 的两个角色中的 服务提供者(Service Provider) 和 服务消费者(Service Consumer) 的通用实现。

 eureka发起的操作有:

  • 服务注册:当微服务实例启动的时候,Eureka 客户端会向 Eureka Server 发送注册请求,包含自身的 IP、端口和状态信息。
  • 服务续约:Eureka 客户端会定期(通常每 30 秒)发送心跳请求,以续约其在 Eureka Server 上的注册状态,告知服务器它仍然活跃。
  • 服务下线:当微服务实例关闭或不再需要注册时,Eureka 客户端会向 Eureka Server 发送取消请求,以从注册表中移除自身的信息。

其中服务消费者发起的是以下两个:

  • 获取服务注册列表:服务消费者在需要调用其他服务时,会向 Eureka Server 查询当前的服务注册列表,以获取可用服务的实例信息。
  • 远程调用:服务消费者根据从 Eureka Server 获取的服务实例信息,通过 HTTP 或其他协议调用目标服务。

而Eureka server发起的操作为:集群中数据同步。

  • 在 Eureka 的集群模式中,Eureka Server 会在集群节点之间进行数据复制与同步,确保所有节点上的服务注册信息一致。
ribbon

ribbon是工作在消费者端的负载均衡,这意味着ribbon负载均衡是在服务消费者一侧执行的,而不是在服务提供者一侧或网关、代理等中间层执行的。Ribbon会通过服务注册中心(如Eureka)或通过配置文件中的静态列表,获取服务提供者的多个实例地址。通过某种负载均衡算法(如轮询、随机、权重等),ribbon选择一个服务实例来发送请求。这个负载均衡操作是发生在客户端的。

与eureka类似,ribbon也是一个嵌入在服务代码中的服务。假设服务 A 想调用服务 B,系统中可能存在多个服务 B 的实例(例如 B1, B2, B3),Ribbon 的工作流程如下:

  1. 服务 A 通过 Ribbon 从服务注册中心(如 Eureka)获取服务 B 的所有可用实例的列表。
  2. Ribbon 根据负载均衡算法(例如轮询)选择一个实例,比如 B2
  3. 服务 A 通过 Ribbon 发送请求到 B2 实例。

与nginx的对比:

nginx是一个独立的服务,提供负载均衡。但是nginx抽象了服务之间的通信,服务发起方不需要知道服务提供者的信息,只需要知道nginx服务器的地址,而ribbon的服务发起端(服务A)需要知道服务提供者(服务B)的所有实例信息。

  • Ribbon 可以实时检测服务实例的可用性和响应时间。如果某个实例的响应时间超过设定的阈值,Ribbon 会将其标记为不健康。
  • 智能路由:在选择服务实例时,Ribbon 不仅考虑负载均衡策略(如轮询、随机等),还会优先选择那些符合 SLA 标准的实例。
  • 容错处理:如果一个服务实例的性能下降到 SLA 标准以下,Ribbon 可以自动切换到其他健康的实例,避免影响用户体验。

Archaius 是 Netflix 提供的一个动态配置管理库,用于支持在运行时对应用配置进行动态更新。使用 Archaius 完成运行时配置的意思是,应用程序可以在不重新启动的情况下,实时更新和应用配置更改。Ribbon 作为客户端负载均衡器,可以根据不同的策略(如轮询、随机、权重)选择服务实例。通过 Archaius,Ribbon 的这些策略可以在运行时根据需求进行动态调整。

例如,如果当前的负载均衡策略是轮询,但系统负载增加时可以动态切换为权重负载均衡,Archaius 可以让你在不重启应用的情况下实现这一点。

Zuul
Zuul 是 SpringCloud 中的微服务网关,首先是一个微服务。也是会在 Eureka 注册中心中进行服务的注 册和发现。也是一个网关,请求应该通过 Zuul 来进行路由。Zuul 网关不是必要的,是推荐使用的。
Zuul的功能不如istio的gateway,而且Zuul也是需要单独部署一个微服务。
Hystrix

Netflix 开发的一个开源库,用于实现微服务架构中的容错管理。它的主要目的是在分布式系统中提高系统的稳定性和弹性,尤其是在面对服务调用失败或延迟时。Hystrix 在 SpringCloud 中负责服务熔断和服务降级的作用。

springCloud gateway

目前springcloud已经弃用了Zuul,转而使用springCloud gateway。springCloud gateway 已经集成了Hystrix,而且相比Zuul有更多的功能。

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

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

相关文章

基于Arduino做的“鱿鱼游戏”BOSS面具,支持动作检测

这是一个结合了3D打印、舵机、PIR传感器和DFPlayer MP3模块的DIY项目,旨在制作一个带有动画眼睛的"鱿鱼游戏"老板面具。当检测到动作时,面具的眼睛会移动并播放声音,非常适合万圣节使用。 这个项目是一个很好的起点,特…

又一支付机构“经营异常”——易极付

近日,支付行业再次传出风波,重庆易极付科技有限公司(简称“易极付”)因“失联”问题被重庆两江新区市场监督管理局列入了经营异常名录。据天眼查平台显示,这一决定是基于“通过登记的住所或者经营场所无法联系”到该公…

【CSS in Depth 2 精译_050】7.3 CSS 响应式设计中的流式布局原则(Fluid layout)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第七章 响应式设计】(概述) 7.1 移动端优先设计原则(上篇) 7.1.1 创建移动端菜单(下篇)7.1.2 给视口添加 meta 标签&#xf…

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp格式

在Linux系统中,使用ImageMagick可以图片格式转换,其中最常用的是通过命令行工具进行。 ImageMagick是一个非常强大的图像处理工具集,它包含了许多用于图像转换的命令。 一、安装ImageMagick(如果尚未安装)&#xff1…

Python | Leetcode Python题解之第486题预测赢家

题目: 题解: class Solution:def PredictTheWinner(self, nums: List[int]) -> bool:length len(nums)dp [0] * lengthfor i, num in enumerate(nums):dp[i] numfor i in range(length - 2, -1, -1):for j in range(i 1, length):dp[j] max(num…

力扣21~30题

21题(简单): 分析: 按要求照做就好了,这种链表基本操作适合用c写,python用起来真的很奇怪 python代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, v…

leetcode30:串联所有单词的字串

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words ["ab","cd","ef"], 那么 "abcdef…

NetSarang Xshell v8.0060 Linux终端管理器个人免费版

NetSarang Xshell 官方个人完全免费中文版,Xshell特别版,Xshell 个人完全免费,Xshell 是一款最好用的Linux远程连接工具,免费SSH客户端、主机服务器远程管理客户端 。Xshell,轻松管理远程服务器,会话管理器…

《人工智能:CSDN 平台上的璀璨之星》

一、CSDN 上的 AI 热门话题 GPT-3 作为 CSDN 上的热门话题,其应用极为广泛。GPT-3 是 OpenAI 开发的一种基于 Transformer 架构的大规模预训练语言模型,拥有惊人的 1750 亿个参数。它具有多任务处理能力,能够执行多种自然语言处理任务&#x…

基于KNN算法的指纹定位系统(MATLAB,平面,四个锚点)

文章目录 指纹定位指纹定位技术简介基本原理位置估算公式1. 最近邻居算法(KNN)2. 加权最近邻居算法(W-KNN)3. 最小二乘法(LS) 最终位置 P P P通过求解下面的方程获得:应用场景优缺点优点缺点 总…

Python 工具库每日推荐 【pyspider 】

文章目录 引言网络爬虫的重要性今日推荐:pyspider 网络爬虫框架主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:爬取新闻网站的文章案例分析高级特性使用代理处理 JavaScript 渲染的页面扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 Type…

《深度学习》OpenCV 风格迁移、DNN模块 案例解析及实现

目录 一、风格迁移 1、什么是风格迁移 2、步骤 1)训练 2)迁移 二、DNN模块 1、什么是DNN模块 2、DNN模块特点 1)轻量 2)外部依赖性低 3)方便 4)集成 5)通用性 3、流程图 4、图像…

玛泽的故事中英文Big Muzzy台词本电子版PDF

《Big Muzzy》玛泽的故事,中英文都有,是BBC制作的,专为英语初学者设计的外语课程。它是教学动画里最有趣的一部!风靡全球,上百个国家引进,深受小朋友的喜爱。《Big Muzzy》用动画的形式,讲述了M…

第九课:Python学习之函数基础

函数基础 目标 函数的快速体验函数的基本使用函数的参数函数的返回值函数的嵌套调用在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用函数的使用包含两个步骤&#xff…

FFmpeg的简单使用【Windows】--- 指定视频的时长

目录 功能描述 效果展示 代码实现 前端代码 后端代码 routers 》users.js routers 》 index.js app.js 功能描述 此案例是在上一个案例【FFmpeg的简单使用【Windows】--- 视频混剪添加背景音乐-CSDN博客】的基础上的进一步完善,可以先去看上一个案例然后再…

C++核心编程和桌面应用开发 第十一天(静态转换 动态转换 常量转换 重新解释转换)

目录 1.静态类型转换 1.1语法 1.2用法 2.动态类型转换 2.1语法 2.2用法 3.常量类型转换 3.1语法 3.2用法 4.重新解释转换 4.1语法 1.静态类型转换 1.1语法 static_cast<目标转换类型>(待转换变量) 1.2用法 可用于基本数据类型之间的转换。比如int和char之…

2.线段求交

1.线段求交 给定由平面上 n 条闭线段构成的一个集合 S&#xff0c;报告出 S 中各线段之间的所有交点。 我们所希望得到的算法&#xff0c;其运行时间不仅取决于输入中线段的数目&#xff0c;还取决于&#xff08;实际的&#xff09;交点数目。这样的算法&#xff0c;被称为“输…

网络爬虫-数美滑块验证码

仅供研究学习使用。 今天带来的是数美滑块验证码的逆向 目标站 --> 传送门 解决此类验证码 首先要解决滑动距离的判定 无论是使用selenium还是使用协议的方式来破解 都绕不开滑动距离的识别 滑动距离可以参考以前我博客上的方式&#xff0c;或者找一找开源的一些算法&am…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

Android:记录一个打包发布版的release包以后闪退的问题

个人感觉其实release闪退的问题挺难排查的&#xff0c;因为release包运行起来as捕获不到相应的应用程序进程&#xff0c;从而不易查看到日志&#xff0c;也是我玩得不溜&#xff0c;大家有不同的方法可以评论区探讨&#xff0c;我也定期回复一些评论一起讨论。以下是我遇到的情…