[单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有更多的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-C语言顺序栈功能实现

栈 栈&#xff1a;类似于一个容器&#xff0c;如我们生活中的箱子&#xff0c;我们向箱子里放东西&#xff0c;那么最先放的东西是最后才能拿出来的 代码实现 #include <stdio.h> #include <stdlib.h>#define MAX_SIZE 100typedef struct {int* base; // 栈底指针…

通过PyTorch 手写数字识别 入门神经网络 详细讲解

通过PyTorch 手写数字识别 入门神经网络 数据集 MNIST数据集中有手写数字图片7万张&#xff0c;划分训练集6万张&#xff0c;划分测试集1万张。 每张图片都会有一张标签&#xff0c;也就是代表着图片的真实值&#xff08;真实含义&#xff09;。 概念 计算机是如何读取图片的…

多态常见面试问题

1、什么是多态&#xff1f; 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;它允许同一个接口表现出不同的行为。在C中&#xff0c;多态性主要通过虚函数来实现&#xff0c;分为编译时多态&#xff08;静态多态&#xff09;和运行时多态…

【Spring AI】Java实现类似langchain的第三方函数调用_原理与详细示例

Spring AI 介绍 &#xff1a;简化Java AI开发的统一接口解决方案 在过去&#xff0c;使用Java开发AI应用时面临的主要困境是没有统一且标准的封装库&#xff0c;导致开发者需要针对不同的AI服务提供商分别学习和对接各自的API&#xff0c;这增加了开发难度与迁移成本。而Sprin…

【数据结构】邻接表

一、概念 邻接表是一个顺序存储与链式存储相结合的数据结构&#xff0c;用于描述一个图中所有节点之间的关系。 若是一个稠密图&#xff0c;我们可以选择使用邻接矩阵&#xff1b;但当图较稀疏时&#xff0c;邻接矩阵就显得比较浪费空间了&#xff0c;此时我们就可以换成邻接…

机器人的应用 基于5G的变电站智慧管控系统

背景概述 一、电力行业面临的挑战与变革 随着全球工业化和信息化的快速发展&#xff0c;电力行业作为国民经济的基础性行业&#xff0c;其重要性日益凸显。然而&#xff0c;随着电力网络的不断扩展和复杂化&#xff0c;变电站和开关站作为电力传输与分配的关键节点&#xff0…

Excel中Ctrl+e的用法

重点&#xff1a;想要使用ctrle&#xff0c;前提是整合或拆分后的结果放置的单元格必须和被提取信息的单元格相邻&#xff0c;且被提取信息的单元格也必须相连。 下图为错误示例 这样则可以使用ctrle 1、信息整合 2、提取信息 3、添加符号 4、信息顺序调换 5、数字提取 crtle还…

HarmonyOS NEXT 应用开发实战(三、ArkUI页面底部导航TabBar的实现)

在开发HarmonyOS NEXT应用时&#xff0c;TabBar是用户界面设计中不可或缺的一部分。本文将通过代码示例&#xff0c;带领大家一同实现一个常用的TabBar&#xff0c;涵盖三个主要的内容页&#xff1a;首页、知乎日报和我的页面。以模仿知乎日报的项目为背景驱动&#xff0c;设定…

解决ubuntu 下 VS code 无法打开点击没反应问题

从Ubuntu 22.04 升级到ubuntu 24.04 后&#xff0c;发现Vsode无法打开&#xff0c;不论是点击图标&#xff0c;还是terminator里面运行code 可执行程序&#xff0c;均没有反应。debug如下: 提示权限不够。 解决方案&#xff1a; sudo sysctl -w kernel.apparmor_restrict_unp…

C语言题目练习2

前面我们知道了单链表的结构及其一些数据操作&#xff0c;今天我们来看看有关于单链表的题目~ 移除链表元素 移除链表元素&#xff1a; https://leetcode.cn/problems/remove-linked-list-elements/description/ 这个题目要求我们删除链表中是指定数据的结点&#xff0c;最终返…

C语言 | Leetcode C语言题解之第460题LFU缓存

题目&#xff1a; 题解&#xff1a; /* 数值链表的节点定义。 */ typedef struct ValueListNode_s {int key;int value;int counter;struct ValueListNode_s *prev;struct ValueListNode_s *next; } ValueListNode;/* 计数链表的节点定义。 其中&#xff0c;head是数值链表的头…

腾讯云Android 与 iOS 相关

移动端&#xff08;Android/iOS&#xff09;支持哪几种系统音量模式&#xff1f; 支持2种系统音量类型&#xff0c;即通话音量类型和媒体音量类型&#xff1a; 通话音量&#xff1a;手机专门为通话场景设计的音量类型&#xff0c;使用手机自带的回声抵消功能&#xff0c;音质…

谷歌浏览器 文件下载提示网络错误

情况描述&#xff1a; 谷歌版本&#xff1a;129.0.6668.90 (正式版本) &#xff08;64 位&#xff09; (cohort: Control)其他浏览器&#xff0c;比如火狐没有问题&#xff0c;但是谷歌会下载失败&#xff0c;故推断为谷歌浏览器导致的问题小文件比如1、2M会成功&#xff0c;大…

【LeetCode】动态规划—95. 不同的二叉搜索树 II(附完整Python/C++代码)

动态规划—95. 不同的二叉搜索树 II 题目描述前言基本思路1. 问题定义二叉搜索树的性质&#xff1a; 2. 理解问题和递推关系递归构造思想&#xff1a;状态定义&#xff1a;递推公式&#xff1a;终止条件&#xff1a; 3. 解决方法递归 动态规划方法&#xff1a;伪代码&#xff…

如何使用vscode的launch.json来debug调试

1、创建一个launch.json文件 选择Python Debugger&#xff0c;再选择Python文件&#xff0c;创建处理如下 默认有下面五个参数 "name": "Python Debugger: Current File","type": "debugpy","request": "launch"…

金九银十软件测试面试题(800道)

今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一份 肝完进大厂 妥妥的&#…

【LeetCode】动态规划—123. 买卖股票的最佳时机 III(附完整Python/C++代码)

动态规划—123. 买卖股票的最佳时机 III 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系状态定义&#xff1a;状态转移公式&#xff1a;初始条件&#xff1a; 3. 解决方法动态规划方法伪代码&#xff1a; 4. 进一步优化5. 小总结 Python代码Python代码解释 C代码C代码解…

Python基础之List列表用法

1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]&#xff1a;获取数组的第2个元素。 names[1:3]&#xff1a;获取数组的第2、第3个元素。包含左侧&#xff0c;不包含右侧。 names[:3]等同于names[0:3]&…

List子接口

1.特点&#xff1a;有序&#xff0c;有下标&#xff0c;元素可以重复 2.方法&#xff1a;包含Collection中的所有方法&#xff0c;还包括自己的独有的方法&#xff08;API中查找&#xff09; 还有ListIterator&#xff08;迭代器&#xff09;&#xff0c;功能更强大。 包含更多…

机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+

时间序列在回归预测的领域的重要性&#xff0c;不言而喻&#xff0c;在数学建模中使用及其频繁&#xff0c;但是你真的了解ARIMA、AR、MA么&#xff1f;ACF图你会看么&#xff1f;&#xff1f; 时间序列数据如何构造&#xff1f;&#xff1f;&#xff1f;&#xff0c;我打过不少…