[SpringCloud] Eureka 与 Ribbon 简介

news2024/9/27 9:29:59

目录

一、服务拆分

1、案例一:多端口微服务

2、案例二:服务远程调用

二、Eureka

1、Eureka 原理分析

2、Eureka 服务搭建(注册 eureka 服务)

3、Eureka 服务注册(注册其他服务)

4、Eureka 服务发现(服务拉取)

三、Ribbon 负载均衡 

1、负载均衡原理

2、负载均衡策略

3、饥饿加载


一、服务拆分

通过 2 个案例,学习如何实现服务拆分。

  • 都需要引入 web 的起步依赖:

1、案例一:多端口微服务

需求:

  • 将 Order 和 User 模块的服务进行拆分,通过不同的 URL 进行服务调用。

(1)项目结构

  • 为 2 个模块都添加上各自的 Controller;

(2)编写 Controller

  • 写一个简单的 Controller,在页面上显示字符串即可;
  • UserController 类似;

(3)设置不同的端口,启动 application

  • 为两个模块设置不同的服务器端口(user 设置 8081、order 设置 8080);

  • 将 Order 模块和 User 模块的 Application 都启动起来;

  • 访问页面 /user/query 和 /order/query

2、案例二:服务远程调用

需求:

  • 在 Order 的实体类中包含了 User 类型的属性,当根据订单号获取订单信息时,由于 Order 和 User 的数据库访问也是独立的,导致 User 属性为 null。
  • 因此在 Order 模块中需要调用 User 模块的查询 user 的功能来获取 User 信息,再赋值给 Order。

(1)项目结构

  • 两个模块都需要创建对应的实体类;
  • Order 还需要创建 service 和 mapper;

(2)OrderController 和 UserController

  • 两个模块的 Controller 都需要添加相应的方法;

(3)OrderMapper 

  • 为了简单起见,这里不引入连接数据库操作;
  • 直接在 mapper 中实现返回一个 User 的方法;

(4)OrderSrevice

OrderSrevice 需要两个属性:OrderMapper 和 RestTemplate;

其中 RestTemplate 就是帮助我们实现远程服务调用的关键;

  • url 属性:表示发送的请求;
  • responseType 属性:表示返回的数据类型(默认是 JSON);
  • getForObject() 方法:表示发送 get 请求;
  • postForObject() 方法:表示发送 post 请求;

(5)启动两个模块的 application

  • 访问 /order/queryForOrderById/xxx;

二、Eureka

1、Eureka 原理分析

观看下面视频:

08-Eureka-eureka原理分析_哔哩哔哩_bilibili

2、Eureka 服务搭建(注册 eureka 服务)

(1)创建 eureka 服务模块(eureka 为子工程)

  • 子工程的 pom 文件中引入依赖;

  • 父工程的 pom 文件做好依赖管理;

(2)编写 application 配置文件,注册 eureka

  • 设置服务端口;
  • 设置 eureka 服务名称;
  • 设置 eureka 服务地址;

为什么 eureka 自身的服务地址信息也是 client?

  • eureka 也是一个微服务,所以 eureka 启动的时候,会将自己也注册到 eureka 上。
  • 这是为了 eureka 之间的集群通信,当有多个 eureka 时,defaultZone 就需要写上多个 URL。

(3)启动 application,访问 eureka

  • 为启动类添加 @EnableEurekaServer 注解;

  • 访问 localhost:10086/eureka,则会跳转到 eureka 的管理界面;

  • instances 表示注册到 eureka 的服务示例(服务列表);

3、Eureka 服务注册(注册其他服务)

(1)引入依赖

  • 分别在 Order 模块和 User 模块的 pom 文件中,都添加上如下依赖;
  • 注意:使用的是客户端 client 的依赖;

(2)编写 eureka 地址信息

这一步骤跟前面的是一样的。

  • 设置服务端口;
  • 设置 eureka 服务名称;
  • 设置 eureka 服务地址;

(3)将 User 和 Order 的 application 都启动

  • 在 Service 中添加 SpringBoot 服务,即可一次性启动;

  • 访问 /localhost:10086,来到 eureka 管理页面;
  • 此时已经可以看到服务列表已经有 3 个服务了;

(4)多实例部署

如果我们想要 User 有多个服务实例可以添加到服务列表上,可以复制多几份 User 的运行配置。

  • 选中要复制的运行配置,点击复制;

  • 在 VM Option 中,添加参数 server.port = 一个没用过的端口;

  • 启动 5 个 application,观察服务列表;

  •  可以发现,Order 和 User 各多了 1 个服务;

4、Eureka 服务发现(服务拉取)

服务发现就是服务拉取。

服务拉取是基于服务名称获取服务列表(比如获取 UserService 的服务列表,内含 2 个服务),然后在对服务列表做负载均衡

基于前面“服务拆分”的“案例二:服务远程调用”,我们来学习服务拉取。

(1)获取服务列表

  • 修改 OrderService 中的代码,用服务名代替 ip:port
  • (既然需要负载均衡,因此肯定无法指定 ip:port,所以使用服务名代替)

(2)添加负载均衡注解 @LoadBalanced

  • 在 order-service 项目的启动类 OrderApplication 中的 RestTemplate 添加负载均衡注解:

(3)启动 application,查询 Order

  • 启动下面 5 个 application;
  • 然后我们选择使用 8080 端口的 Order 来获取信息(也可以用 8083 的);

  • 发送 4 次获取 Order 信息的请求,id 从 1~ 4;

  • 观察 2 个 User 启动类的输出,都输出了 2 次信息;
  • 说明对 user-service 服务列表做到了负载均衡;

三、Ribbon 负载均衡 

1、负载均衡原理

2、负载均衡策略

Ribbon 的负载均衡规则是一个叫做 IRule 的接口来定义的,每一个子接口都是一种规则。

(1)Java 可以使用的负载均衡规则

(2)负载均衡规则修改方法

默认情况下,使用的是 ZoneAvoidanceRule。

需要注意的是:

  • 第一种方式,可以对所有 order-service 模块访问的服务列表做到负载均衡;(大)
  • 第二种方式,只能对配置文件中指定的 service 做到负载均衡;(小)

3、饥饿加载

Ribbon 默认是采用懒加载,即第一次访问时才会去创建 LoadBalanceClient,请求时间会很长。

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

  • enabled = true,表示开启饥饿加载;
  • clients = user-service,表示指定对 user-service 这个服务饥饿加载;
  • clients 其实是数组形式,可以协商多个服务;

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

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

相关文章

Java学习 2.Java-数据类型与运算符

初识java回顾: java文件编译 一个java文件有类 类中有方法 java----->类----->方法 idea创建项目 改idea背景色 1. 2. 3. 数据类型与变量 1.字面常量 常量即程序运行期间,固定不变的量称为常量,字面值常量也是常量 字面常量…

uboot图像化配置操作说明

一. 简介 之前文章的学习, uboot 可以通过 mx6ull_alientek_emmc_defconfig 来配置,或者通过文 件 mx6ull_alientek_emmc.h 来配置 uboot 。 还有另外一种配置 uboot 的方法,就是图形化配置, 以前的 uboot 是不支持图…

02. 板载音频功能

核心:CS43L22, CS43L22是一款低功耗立体声数字/模拟转换器(DAC) 一、输入 (1)MEMS麦克风:芯片-MP45DT02 (2)外挂的U盘 (3)STM32F4的内部芯片存…

在CentOS 7中手工打造和运行xml文件配置的Servlet,然后使用curl、浏览器、telnet等三种工具各自测试

下载Openjdk并配置环境变量 https://jdk.java.net/java-se-ri/11-MR2是官网下载Openjdk 11的地方。 sudo wget https://download.java.net/openjdk/jdk11.0.0.1/ri/openjdk-11.0.0.1_linux-x64_bin.tar.gz下载openjdk 11。 sudo mkdir -p /usr/openjdk11创建目录&#xff…

【电路笔记】-交流电路中的功率

交流电路中的功率 文章目录 交流电路中的功率1、概述2、正弦波形的功率3、功率因数4、功率三角5、总结 1、概述 作为一般概念,功率描述了系统释放/传输一定量能量的速度。 这种能量可以有不同的形式:动能、磁能、电能……等。 因此,在任何域…

2023年视频号视频下载提取使用教程

视频号视频下载提取教程 第一步: 点击公众号下方菜单「视频下载」,点击“视频号视频下载教程”长按识别二维码添加小助手为好友。 没有关注公众号的,可以先关注。 第二步: 点击视频号的转发图标,将视频号视频转发给…

混合精度训练原理之float16和float32数据之间的互相转换

混合精度训练原理之float16和float32数据之间的互相转换 本篇文章参考:全网最全-混合精度训练原理 上述文章已经讲解的比较详细,本文只是从数值角度分析: 1. float32转入float16的精度误差 2. 在深度学习的混精度训练当中,当参数…

打破总分行数据协作壁垒,DataOps在头部股份制银行的实践|案例研究

从银行开始建设数据仓库至今已近20年,当前各银行机构在数据能力建设中面临诸多困扰:如何保证数据使用时的准确性?如何让数据敏捷响应业务变化?如何让更多的业务人员使用数据? 这些问题极大影响了经营指标的达成与业务…

【Python 算法】信号处理通过陷波滤波器准确去除工频干扰

对于一个信号来说通常汇入工频噪声往往是因为交流电产生的电泳,影响了我们信号采集导致信号上存在工频干扰。 那么matlab去除工频干扰可以通过陷波滤波器实现。 通常使用scipy.signal实现信号的处理。 Scipy的信号处理模块(scipy.signal)来创…

算法通过村第十六关-滑动窗口|黄金笔记|结合堆的应用

文章目录 前言堆与滑动窗口结合的问题总结 前言 提示:不论记忆多么痛苦,它属于过去,已经逝去了,我们为什么还执着于它并让它代表我们?我们就这样,所以,我们受苦。 --丹津葩默 这个还是一个比较重…

堆(二叉树,带图详解)

一.堆 1.堆的概念 2.堆的存储方式 逻辑结构 物理结构 2.堆的插入问题 3.堆的基本实现(代码)(以小堆为例) 1.堆的初始化 2. 向上调整 3.插入结点 4. 交换函数、堆的打印 5.向下调整 6.删除根节点并调整成小根堆 7.获取堆…

Transformer详解学习

1. Transformer 原理 1.1 Transformer整体结构 Transformer的结构图,拆解开来,主要分为图上4个部分,其中最重要的就是2和3Encoder-Decoder部分,对咯,Transformer是一个基于Encoder-Decoder框架的模型。 接下来我将按照…

通过使用Cpolar内网穿透工具实现BUG管理系统的远程访问

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务 3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名 5. 配置二级子域名6. 使用固定二级子域名远程7. 结语 前言 BUG管理软件,作为软件测试工程师的必备工具…

Kettle循环结果集中的数据并传入SQL组件【或转换】里面

简介:在尝试使用了结果集的Demo循环后,进入到生产还是有一点问题的,以下是各个组件的分解解释、遇到的问题,以及解决问题的思路,最后文章的最后会把完整的Ktr文件放出来。记得收藏点赞喔! 先来看张图~来自…

【疯狂Java】数组

1、一维数组 (1)初始化 ①静态初始化:只指定元素,不指定长度 new 类型[] {元素1,元素2,...} int[] intArr; intArr new int[] {5,6,7,8}; ②动态初始化:只指定长度,不指定元素 new 类型[数组长度] int[] princes new in…

【德哥说库系列】-PostgreSQL跨版本升级

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

【算法训练-动态规划 五】【二维DP问题】最大正方形

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【动态规划】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

Kafka - 深入了解Kafka基础架构:Kafka的基本概念

文章目录 Kafka的基本概念 Kafka的基本概念 我们首先了解一些Kafka的基本概念。 1)Producer :消息生产者,就是向kafka broker发消息的客户端2)Consumer :消息消费者,向kafka broker获取消息的客户端3&…

如何避免Web3诈骗,重点关注这5个安全标识提醒

从预付费电子邮件到网络钓鱼攻击,互联网充斥着各种骗局。尽管区块链内置了加密功能,但它们也遭受了相当多的恶意攻击并被获取了对帐户的访问权限。幸运的是,大多数诈骗攻击都有特定的安全标识提醒,精明的用户可以留意,…

淘宝商品详情API接口,解决滑块问题

淘宝商品详情API接口是一种用于获取淘宝商品详细信息的接口,它可以帮助开发者在自己的网站或应用程序中快速获取淘宝商品的详细信息,包括价格、图片、商品描述等。 该接口的主要作用包括: 商品信息展示:通过淘宝商品详情API接口…