SpringCloud(一)Eureka、Nacos、Feign、Gateway

news2025/1/13 6:18:55

文章目录

  • 概述
    • 微服务技术对比
  • Eureka
    • 服务远程调用
    • 服务提供者和消费者
    • Eureka注册中心
      • 搭建注册中心
      • 服务注册
      • 服务发现
      • Ribbon负载均衡
        • 负载均衡策略
        • 饥饿加载
  • Nacos
    • Nacos与Eureka对比
    • Nacos服务注册
      • Nacos服务分集群存储
      • NacosRule负载均衡
      • 服务实例权重设置
      • 环境隔离
    • Nacos配置管理
      • 配置热更新
      • 多环境配置共享
      • Nacos集群搭建
  • Feign
    • 简单使用
    • 自定义配置
    • Feign性能优化
    • Feign最佳实践
  • Gateway
    • 搭建网关
      • 路由断言工厂
      • 过滤器工厂
      • 全局过滤器
      • 过滤器执行顺序
    • 网关跨域问题处理

概述

微服务,又叫微服务架构,是一种软件架构方式。它将应用构建成一系列按业务领域划分模块的、小的自治服务。

在微服务架构中,每个服务都是自我包含的,并且实现了单一的业务功能。简单来说,就是将一个系统按业务划分成多个子系统,每个子系统都是完整的,可独立运行的,子系统间的交互可通过HTTP协议进行通信(也可以采用消息队列来通信,如RoocketMQ,Kafaka等)。

在这里插入图片描述
在这里插入图片描述

微服务技术对比

在这里插入图片描述
在这里插入图片描述

Eureka

服务远程调用

在一个服务模块中调用另一个服务,需要在服务中构建类似前端发出的http请求访问另外一个服务。

在这里插入图片描述
服务端可以基于RestTemplate发起http请求实现远程调用,步骤如下:
在这里插入图片描述
在这里插入图片描述

服务提供者和消费者

  • 服务提供者:暴露接口给其他微服务调用
  • 服务消费者:调用其他微服务提供的接口
  • 服务者与消费者角色其实是相对的,一个服务可以同时是服务提供者和服务消费者。

Eureka注册中心

在这里插入图片描述
1、服务提供者向Eureka注册中心注册服务信息
2、服务消费者向Eureka注册中心拉取服务信息
3、如果有多个服务提供者,利用负载均衡算法,从服务提供者列表中选择一个。
4、服务提供者每隔30秒向EurekaServer发送心跳请求,报告健康状态,Eureka会更新记录服务列表信息,心跳不正常会被剔除。

搭建注册中心

EurekaServer本身就是一个单独的微服务组块。
在这里插入图片描述
配置文件yml中指定服务端口,服务名称,并将自身作为服务注册到Eureka服务器。
启动后:
在这里插入图片描述

服务注册

在这里插入图片描述
如果想让一个服务模拟多实例部署:
注意在environment的option选项中设置命令参数选项:-Dserver.port = 8082,其中-D指设置参数。
在这里插入图片描述

服务发现

在这里插入图片描述

在这里插入图片描述

Ribbon负载均衡

在这里插入图片描述
Ribbon对请求进行拦截,从Eureka-server拉取请求服务列表,Ribbon通过“轮询”等负载均衡手段,选择其中一个服务。

@LoadBalanced注解原理:

  1. 拦截请求: 请求被负载均衡拦截器拦截。
  2. 由请求id,拉取服务列表:动态服务列表负载均衡器从请求的url中获取服务id(服务名),向Eureka-server拉取服务列表。
  3. 基于负载均衡策略,选择服务的ip + 端口:动态服务列表负载均衡器基于IRule提供的负载均衡策略,选择服务列表中的某个服务的ip地址和端口号,并返回给负载均衡拦截器。
  4. 替换服务id为真实的服务ip + 端口:负载均衡拦截器将服务id(服务名)替换为真实的服务的ip + 端口号,向服务提供者发起真正的请求。

在这里插入图片描述

负载均衡策略

在这里插入图片描述
在这里插入图片描述
通过定义IRule实现可以修改负载均衡规则,有两种方式:

  • 代码方式,配置IRule的Bean,针对服务消费者,即不管调用哪个微服务,都会采用你配置的IRule规则。
  • 配置文件方式,在配置文件中先指定服务名称,再指定Ribbon负载均衡规则,针对服务提供者,即只对某个微服务(配置的服务名称)有效。
    在这里插入图片描述
饥饿加载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Nacos

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相比Eureka功能更加丰富,在国内受欢迎程度较高。

Nacos与Eureka对比

  1. Nacos中服务实例有临时实例和非临时实例之分,Eureka则没有。
    • Nacos中所有实例默认是临时实例,临时实例与Nacos之间由实例主动发送心跳包,Nacos做心跳监测,如果监测不到心跳,则将其从服务列表剔除。
    • 非临时实例则由Nacos主动询问实例是否存活。非临时实例如果询问时发现实例宕机,不会被Nacos剔除,只是会被标记为不健康,Nacos会等待其恢复上线。
    • 主动询问的频次较高,而心跳监听的周期较长,所有临时实例从掉线到被发现的时间更长,非临时实例如果掉线很快就会被发现。

2 . Eureka与服务消费者之间,服务消费者是定时向Eureka拉取(pull)服务列表。Nacos支持服务列表变更的消息推送模式,服务列表更新就更加及时。

Nacos服务注册

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Nacos服务分集群存储

  • 1、一级是服务,一个服务有多个不同的实例。
  • 2、二级是集群,例如地域中心
  • 3、三级是实例,位于某个地域中心机房上运行的服务实例。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NacosRule负载均衡

  1. 配置文件中为服务指定负载均衡规则为NacosRule。
  2. 请求优先选择同集群服务实例列表,本地集群找不到提供者,才去找其他集群寻找,并且会报警告。
  3. 确定可用列表后,再采用随机负载均衡挑选实例。

在这里插入图片描述

服务实例权重设置

实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求

Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。

在这里插入图片描述

实例的权重控制
Nacos控制台可以设置实例的权重值,0~1之间同集群内的多个实例,权重越高被访问的频率越高,权重设置为O则完全不会被访问。

环境隔离

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用于做最外层隔离。

在namespace中又有Group的概念。
不同namespace下的服务互相是不可见的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Nacos配置管理

Nacos除了用来做服务注册发现,还可以用于做服务的配置管理,并实现服务配置的热更新。

在这里插入图片描述
在Nacos添加配置信息:
在这里插入图片描述
在这里插入图片描述

没有Nacos配置时,配置获取的步骤如下:
在这里插入图片描述
有Nacos配置文件时:
先将Nacos服务器地址配置在优先级最高的bootstrap.yml文件中,然后读取Nacos中的配置文件,再读取本地application.yml中的配置文件,合并所有的配置。

在这里插入图片描述
实操步骤:
在这里插入图片描述
在这里插入图片描述

配置热更新

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多环境配置共享

生产环境与开发环境可能会有很多相同的配置属性,那么就可以写一个公共的配置文件来记录这些共有的相同的配置属性,常用“服务名 + yaml”的格式来命名,而各个环境特有的属性,使用“服务名 + “-” + 环境名 + yaml”的格式来命名。
在这里插入图片描述
本地环境中可能已经配置了yaml文件,而Nacos中也有可能配置共享配置和环境配置,这些配置的优先级顺序是怎么样的呢?

考虑运维的便利性,在Nacos中配置的属性优先级是更高了,针对于某个特殊环境配置的属性又要高于共享配置属性,因此有:

服务名-profile.yaml > 服务名称.yaml > 本地配置

在这里插入图片描述

Nacos集群搭建

在这里插入图片描述

设置Nacos服务器集群ip和端口:

在这里插入图片描述
搭建集群:

在这里插入图片描述
为什么需要数据库呢?
Nacos配置信息是持久化到数据库中的,Nacos本身也是一个服务器,需要有自己的数据库。

在这里插入图片描述

Feign

Feign需要解决的问题:
在这里插入图片描述
Feign是一种声明式的http客户端,其作用就是帮助我们优雅的实现http请求。

简单使用

在这里插入图片描述

具体使用:

1、使用@FeignClient注解一个接口UserClient,参数指明服务名称,该接口中都是对注解指定的服务的调用。
2、接口中定义的调用方法是类似SpringMVC中的注解声明调用。

在这里插入图片描述

自定义配置

Feign允许我们在对http请求发送的各个阶段做自定义配置,包含请求发送响应日志、响应结果解码器、请求参数编码器、请求失败重试机制等。

最常用的就是请求发送响应日志的配置,日志级别包含四种类型:

  • NONE:无日志
  • BASIC:基本日志,仅包含请求行、响应行信息。
  • HEADERS:头部日志,包含请求行、请求头,响应行,响应头。
  • FULL:包含全部的请求和响应信息。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Feign性能优化

在这里插入图片描述
主要优化两个点:

  • 1、Feign底层http连接实现是不带连接池的,可以选择带连接池的http请求框架替换。
  • 2、日志级别:日志会影响性能,最好使用basic或者默认的none。

怎么配置带有连接池的HttpClient?

在这里插入图片描述

Feign最佳实践

方式一是通过继承的方式:既然服务提供者和服务调用者都需要同样的API接口,那么可以只写一个,服务提供者和服务端调用者都继承这个接口。但是这样做可能导致紧耦合,而且SpringMVC中的路径参数映射也会失效。

在这里插入图片描述
方式二:将API接口以及接口所涉及的实体类、返回值对象类都抽取为一个公共模块,服务提供者和消费者都通过引用依赖的方式,加载这个模块。

在这里插入图片描述

Gateway

外部请求想要请求微服务资源,首先得经过统一的网关,网关实现的功能:

  • 身份认证和权限校验
  • 服务路由、负载均衡
  • 请求限流

在这里插入图片描述

搭建网关

网关服务器本身也是一个微服务!

搭建网关服务的步骤:
1、创建新的module,引入SpringcloudGateway和Nacos服务发现依赖
在这里插入图片描述
2、配置Nacos地址以及路由规则

在这里插入图片描述
在这里插入图片描述

路由断言工厂

在这里插入图片描述
在这里插入图片描述

使用规则见spring官网

过滤器工厂

过滤器在路由规则之后,可以通过设置多个过滤器,构成过滤器链。
在这里插入图片描述
在这里插入图片描述
使用规则见spring官网

使用案例,给请求加响应头字段:
在这里插入图片描述
在响应接口处取出过滤器加的字段并打印出来:
在这里插入图片描述
如果想对所有服务的请求都加过滤器,可以在default-filter加过滤器工厂。

在这里插入图片描述

全局过滤器

全局过滤器与default-filter配置类似,对所有请求生效,全局过滤器不同的地方在于,过滤器的处理的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口。

在这里插入图片描述

使用案例:
在这里插入图片描述

在这里插入图片描述
为了让过滤器生效,首先还需要给过滤器加上Component和Order注解。
在这里插入图片描述
@Order注解,指定过滤器的优先级顺序,过滤器顺序也可以通过实现Orderd接口来指定,接口实现方法直接返回order顺序。

过滤器执行顺序

在这里插入图片描述
在这里插入图片描述

网关跨域问题处理

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

GD32F103x 定时器

1. 定时器的基本介绍 STM32的定时器主要分为三种:高级定时器、通用定时器、基本定时器。 即:高级定时器具有捕获/比较通道和互补输出,死区时间,通用定时器只有捕获/比较通道,基本定时器没有以上两者。 1. 基本定时…

【图像处理】【应用程序设计】加载,编辑和保存图像数据、图像分割、色度键控研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案_已设置图床

minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案 minikube dashboard报错 considerconsider-Dell-G15-5511:~$ minikube dashboard 🤔 正在验证 dashboard 运行情况 ... 🚀 正在启动代理... 🤔 正在验证 proxy 运行…

LabVIEW工业虚拟仪器的标准化实施

LabVIEW工业虚拟仪器的标准化实施 创建计算机化的测试和测量系统,从计算机桌面控制外部测量硬件设备,以及在计算机屏幕上显示的类似仪器的面板上查看来自外部设备的测试或测量数据,所有这些都需要虚拟仪器系统软件。该软件允许用户执行所有这…

链表经典面试题(四)

分割链表 1.题目2.详细的图文分析3.详细的注释和代码 1.题目 2.详细的图文分析 我们会定义4个指向分割链表的指向指针,分别来表示两个链表的头和尾 并且将数据一一的放到两个链表中,最后再将它们串起来,代码中有详细注释. 3.详细的注释和代码 public class Partition {public…

【C语言】模拟实现strcat

strcat在小白看来是一个比较陌生的库函数,但也要牢牢掌握 目录 介绍:模拟实现: 介绍: str代表字符串,那么cat代表什么? 他代表Catenate,连接的缩写,也就是追加字符串的意思 代码示例…

海信电视U8KL使用体验:参数卷,画质技术也独有!

每个家庭成员对电视都有不同需求,如何能做到兼顾?看似需求众口难调,其实一台海信电视就能满足所有啦。 海信电视的参数不仅是最卷的,同时画质技术还是国内独有的,能把这样一台优秀的电视搬回家,无论电影、…

拒绝水文!八大排序(三)【适合初学者】快速排序

文章目录 快速排序递归实现霍尔法优化 挖坑法前后指针法 快速排序非递归 大家好,我是纪宁,这篇文章将向大家介绍非常有名气的一款排序:快速排序 回忆到我们刚开始学习C语言的时候。经常会使用到一个库函数: qsort函数 &#xff0…

【JVM】垃圾回收(GC)详解

垃圾回收(GC)详解 一. 死亡对象的判断算法1. 引用计数算法2. 可达性分析算法 二. 垃圾回收算法1. 标记-清除算法2. 复制算法3. 标记-整理算法4. 分代算法 三. STW1. 为什么要 STW2. 什么情况下 STW 四. 垃圾收集器1. CMS收集器(老年代收集器&…

kubernetes教程-基本学习环境配置

kubernetes教程-基本学习环境配置 安装必要工具 kubectl Kubernetes的命令行工具, kubectl, 允许你在Kubernetes集群中运行命令. 你可以用kubectl来部署应用, 检查和管理集群资源, 并查看日志。有关更多信息,包括 kubectl的全部命令完整列表, 查看 ku…

string类的使用方式的介绍

目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类? 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象…

【iptables 实战】06 iptables网络防火墙实验

一、现状说明 在上一节中,我们将两个网段的机器,通过中间机器的网络转发,能达到互通。再来回顾一下这个网络连接的图 这一节,我们将通过设置机器B的iptables规则,来做一些防火墙实验 机器A模拟公网的一台服务器&#…

【C++进阶之路】C++11(上)

文章目录 一、列表初始化1.{}2.initializer_list 二、声明1.auto2.deltype 三、右值与左值1.基本概念2.应用场景1.左值引用2.右值引用3.完美转发4.万能引用 四、新增默认成员函数五、lambda表达式1.基本语法1.1捕捉列表1.2参数列表1.3返回类型1.4函数体 2.底层原理 总结 一、列…

GPT系列模型解读:GPT-1

GPT系列 GPT(Generative Pre-trained Transformer)是一系列基于Transformer架构的预训练语言模型,由OpenAI开发。以下是GPT系列的主要模型: GPT:GPT-1是于2018年发布的第一个版本,它使用了12个Transformer…

2021-06-20 51单片机基于STC89C52RC的简易秒表的设计与实现(外部中断1和2)

缘由基于STC89C52RC的简易秒表的设计与实现_编程语言-CSDN问答 1.功能要求: K1键做启动停止秒表(外部中断0),K2键做秒表归零(外部中断1),4位数码管动态扫描显示,定时范围改成0到00…

房产政策松绑,VR看房助力市场回春

近日房贷利率、房产限购开始松绑,房地产市场逐渐被激活,房产行业的线上服务能力,也愈发的受到了重视。随着房贷利率、首付比例变化的消息逐渐推出,部分用户开始入手房产市场,因此房产行业的线上服务也需要不断升级&…

【计算机组成原理】读书笔记第五期:通过汇编语言了解程序的实际构成

目录 写在开头 汇编语言和本地代码的关系 汇编语言的源代码 伪指令 汇编的基本语法 常见的汇编指令 mov push和pop 函数的使用机制 函数的调用 函数参数的传递与返回值 全局变量 局部变量 程序的流程控制 循环语句 条件分支 通过汇编语言了解程序运行方式的必…

RTP/RTCP 协议讲解

文章目录 前言一、RTP 协议1、RTP 协议概述2、RTP 工作机制3、RTP 协议的报文结构4、wireshark 抓取 RTP 报文 二、RTCP 协议1、RTCP 协议概述2、RTCP 工作机制3、RTCP 数据报4、wireshark 抓取 RTCP 报文 三、RTSP 和 RTP 的关系四、易混淆概念1、RTP over UDP 和 RTP over RT…

typescript 泛型详解

typescript 泛型 泛型是可以在保证类型安全前提下,让函数等与多种类型一起工作,从而实现复用,常用于: 函数、接口、class中。 需求:创建一个id 函数,传入什么数据就返回该数据本身(也就是说,参数和返回值类型相同)。 …

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建项目 / 创建核心类

文章目录 一、创建SpringBoot项目二、创建核心类创建 Exchange类创建 MSGQueue类创建 Binding类创建Message类 一、创建SpringBoot项目 在项目中添加这四个依赖! 二、创建核心类 交换机 :Exchange 队列 :Queue 绑定关系: Binding 消息 :Message 这些核心类都存在于 BrokerSe…