Ribbon负载均衡(一)Ribbon实战

2023-11-12

Ribbon实战


Ribbon怎么读,大部分人发音都是 rui ben( 瑞本) ,他能干什么?能处理负载均衡,是SpringCloud全家桶组件的一个负载均衡组件
他是怎么实现负载均衡的?他再springcloud全家桶中充当一个什么角色?
我们先谈谈 注册中心

1.注册中心

我们都知道微服务就是不同的服务组成的应用,每个应用都注册到注册中心,不管你用什么取注册发现服务的,比如Zookeeper, Eureka ,Nacos 全都提供了服务的注册发现功能

1.1 服务注册到注册中心

注册中心能够让不同的应用取发现找到其他应用的服务信息,方便服务之间调用,比如ABC三个微服务都注册到了Zookeeper
A服务下面有三台实际机器 分别是 a1-ip:port,a2-ip:port,a3-ip:port
B服务下面有三台实际机器 分别是 b1-ip:port,b2-ip:port,b3-ip:port
C服务下面有三台实际机器 分别是 c1-ip:port,c2-ip:port,c3-ip:port

A服务想要调用B服务,就要去注册中心ZK上找服务,只有注册了服务才能找到

1.2 服务注册列表Ribbon负载均衡选取相应节点

A服务想要调用B服务,就要去注册中心ZK上找服务,然后注册中心ZK告诉A, B服务现在有3台机器实例在运行,你想调用就调用吧,但是三台中你要选取哪一台去执行响应操作,这个选取那个节点的操作就是Ribbon去实现的

  1. 随机选一台?这台机器到底忙不忙
  2. 轮训选一台,刚用过b1,现在该用b2了?b1现在是否还在处理?
  3. 选一个服务质量高的 ?如何衡量服务质量

如何选取多个服务列表节点的一个,这就是负载均衡策略,这个负载均衡算法计算的过程及选取结果就是Ribbon实现的

2.负载均衡方案
2.1 集中式负载均衡

集中式负载均衡就是独立的负载均衡设施,独立于应用服务外,比如webPC端,H5页面,APP页面 所有客户端请求全都路由到Nginx,通过Nginx路由转发到不同的应用内部,集中式负载均衡一般都是硬件设置
在这里插入图片描述

2.2 进程内聚在均衡

什么是进程?你的应用程序就是一个进程,我一台服务器部署了3台服务应用进程,每个进程内部都有自己的负载均衡逻辑,我的服务从注册中心获取当前有哪些B服务可以被调用,然后我进程自己选择一台去发起请求,Ribbon就是进程内负载均衡实现
这个时候 Ribbon是部署在用户User服务中的,
在这里插入图片描述
User服务A,通过A自己的进程中的Ribbon选择 订单服务1,2,3 中的一台 1 去发起调用
User服务B,通过A自己的进程中的Ribbon选择 订单服务1,2,3 中的一台 2 去发起调用
都是进程内部的负载均衡实现

3.Ribbon实践

我们既然要负载均衡,肯定要client去掉用服务的应用,而且应用至少有2个节点注册到Eureka上去供client调用,所以综上所述我们需要四个程序,通过client user用户服务去调用两个订单服务去实践一下Ribbon负载均衡
Ribbon依赖包已经在Euraka Discovery Client中,不需要单独引入

  1. Eureka Server eureka注册中心服务
  2. Client User服务 作为客户端
  3. 服务A 订单服务1 IP:PORT-1 作为被调用方1
  4. 服务A 订单服务2 IP:PORT-2 作为被调用方2
3.1 配置启动Eureka注册中心

1.新建Springboot项目, 添加组件的时候添加EurekaServer组件
在这里插入图片描述

2.配置项目启动类及 application.properties文件
项目启动类加上@EnableEurekaServer注解
在这里插入图片描述
application配置基本信息

spring.application.name=eureka-server
server.port=8761

#eureka自动保护 关闭
eureka.server.enable-self-preservation=false
eureka.instance.hostname=eureka-hostname-jzj

#不能调用自己
eureka.client.fetch-registry=false
#不自己注册自己
eureka.client.register-with-eureka=false

#这个地址就是 其他的服务 user,order需要访问注册中心的地址 
# !!!!!!! 注意 这个地方 后缀结尾必须是 eureka
eureka.client.service-url.defaultZone = http://localhost:${server.port}/eureka

!!!!! 注意 这个地方 eureka.client.service-url.defaultZone =xxxx/eureka
否则就会出现 这个错误

3.2 访问eureka界面

可以看到Eureka服务正常启动,用的是单机模式, 端口8761
在这里插入图片描述

4.Client客户端User服务

我们这次新建一个父子项目,因为除了EurekaServer,其他的User用户服务,Order订单服务 几个都建在一个工程里,避免多个工程切换

  1. Eureka Server eureka注册中心服务
  2. Client User服务 作为客户端
  3. 服务A 订单服务1 IP:PORT-1 作为被调用方1
  4. 服务A 订单服务2 IP:PORT-2 作为被调用方2
4.1 新建父子工程

新建MAVEN项目
在这里插入图片描述
新建项目名字
在这里插入图片描述
父 src文件删除,然后修改父文件 pom的打包类型为 pom文件在这里插入图片描述

4.2 构建Ribbon Client User服务

User作为Ribbon客户端发起调用,调用多个Order订单 orderOne及OrderTwo服务

新建Module user, 选择还是 Spring initlize springboot项目, 然后填写服务名字及基本信息在这里插入图片描述
勾选Web 及 Eureka Discovery Client 方便调用在这里插入图片描述

4.3 构建OrderOne 订单服务

新建Module 选择Spring initializr , 然后填写服务名字及基本信息
在这里插入图片描述
依旧选择 Web 及 Eureka Discovery Client 方便调用
在这里插入图片描述

4.4 同样的方法构建orderTwo 订单服务

按照orderOne的相同的方法构建orderTwo

5.配置 User,OrderOne,OrderTwo服务

配置User,orderOne, orderTwo的服务端口及properties文件及Controller信息

5.1 配置User服务

1.启动类新增注解 @EnableEurekaClient
在这里插入图片描述
2.application.properties 配置eureka地址及端口
user服务的服务端口是8088

server.port=8088

#user服务
spring.application.name=user-client

#eureka注册中心地址
# !!!!!!! 注意 这个地方 后缀结尾必须是 eureka 和服务端保持一致
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka

3.新建UserController

@RestController
@Slf4j
public class UserController {

    @GetMapping("/user")
    public String test() {
        log.info("client 发起UserController");
        return "user";
    }
}

4.启动服务,访问Controller

http://localhost:8088/user 访问正常,服务正常启动
在这里插入图片描述
5.Eureka看User服务是否注册
user一台已经注册到euraka端口8088
在这里插入图片描述

5.1 配置OrderOne服务

1.启动类新增注解 @EnableEurekaClient
在这里插入图片描述

2.application.properties 配置eureka地址及端口
user服务的服务端口是8089

server.port=8089

#order服务 , 注意这个地方叫 order ,就是为了 和order2 服务一样的名字都注册eureka上
spring.application.name=order

#eureka注册中心地址
# !!!!!!! 注意 这个地方 后缀结尾必须是 eureka 和服务端保持一致
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka

3.新建OrderController

package com.ribbontest.orderone.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class OrderController {

    @GetMapping("/order")
    public String test() {
        log.info("orderOne 发起 请求");
        return "orderOne";
    }
}

4.启动服务,访问Controller

http://localhost:8089/order访问正常,服务正常启动,返回orderOne
在这里插入图片描述

5.Eureka看OrderOne服务是否注册
Order 服务 1台已经注册到Eureka 端口 8089
在这里插入图片描述

5.2 配置OrderTwo服务

1.启动类新增注解 @EnableEurekaClient
在这里插入图片描述

2.application.properties 配置eureka地址及端口
user服务的服务端口是8090

server.port=8090

#order服务 , 注意这个地方叫 order ,就是为了 和order1 服务一样的名字都注册eureka上,然后去负载均衡
spring.application.name=order

#eureka注册中心地址
# !!!!!!! 注意 这个地方 后缀结尾必须是 eureka 和服务端保持一致
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka

3.新建OrderController

package com.ribbontest.ordertwo.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class OrderController {

    @GetMapping("/order")
    public String test() {
        log.info("orderTwo 发起 请求");
        return "orderTwo";
    }
}


4.启动服务,访问Controller

http://localhost:8089/order访问正常,服务正常启动,返回orderTwo
在这里插入图片描述

5.Eureka看OrderTwo服务是否注册
Order 服务 2台已经注册到Eureka 端口 8089 / 8090
在这里插入图片描述

到这里 集群搭建完成了 , 下面开始验证Ribbon
!!!!!!

6.验证Ribbon负载均衡

我们现在开始用User服务去调用Order服务, 我们直接通过Controller调用 LoadBalancerClient 接口来测试, Ribbon默认是轮询策略

LoadBalancerClient 这个就是Ribbon功能的工具client, 去调用Eureka服务列表去负载均衡获取一个节点信息
改造UserController

package com.ribbon.user.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class UserController {


    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/user")
    public String test() {
        log.info("client 发起UserController");
        return "user";
    }


    @GetMapping("/client")
    public String client() {

        //通过Ribbon client 去实现负载均衡算法,获取URL信息
        log.info("client 开始调用");
        //我们选择的是eureka 上的 order 应用服务,因为我们直到 order有两个
        ServiceInstance order = loadBalancerClient.choose("order");
        log.info("Uri:{}", order.getUri());
        log.info("Host:{}", order.getHost());
        log.info("Port:{}", order.getPort());
        log.info("InstanceId:{}", order.getInstanceId());
        log.info("Metadata:{}", order.getMetadata());
        log.info("ServiceId:{}", order.getServiceId());
        log.info("Scheme:{}", order.getScheme());
        log.info("==================================================");
        return "user";
    }
}

访问 地址 http://localhost:8088/client 看下打印结果

既然Ribbon能够轮询的获取每个Order的信息,我们就能用HTTP协议访问到当前的节点,就能实现调用
在这里插入图片描述

日志信息

2022-05-14 20:40:16.504  INFO  [nio-8088-exec-1] UserController  : client 开始调用
2022-05-14 20:40:16.569  INFO [nio-8088-exec-1] UserController  : Uri:http://DESKTOP-TA8GFQL:8090
2022-05-14 20:40:16.569  INFO [nio-8088-exec-1] UserController  : Host:DESKTOP-TA8GFQL
2022-05-14 20:40:16.570  INFO [nio-8088-exec-1] UserController  : Port:8090
2022-05-14 20:40:16.570  INFO [nio-8088-exec-1] UserController  : InstanceId:DESKTOP-TA8GFQL:order:8090
2022-05-14 20:40:16.570  INFO [nio-8088-exec-1] UserController  : Metadata:{management.port=8090}
2022-05-14 20:40:16.570  INFO [nio-8088-exec-1] UserController  : ServiceId:ORDER
2022-05-14 20:40:16.570  INFO [nio-8088-exec-1] UserController  : Scheme:http
2022-05-14 20:40:16.570  INFO [nio-8088-exec-1] UserController  : ==================================================
2022-05-14 20:40:23.820  INFO [nio-8088-exec-4] UserController  : client 开始调用
2022-05-14 20:40:23.821  INFO [nio-8088-exec-4] UserController  : Uri:http://DESKTOP-TA8GFQL:8089
2022-05-14 20:40:23.821  INFO [nio-8088-exec-4] UserController  : Host:DESKTOP-TA8GFQL
2022-05-14 20:40:23.822  INFO [nio-8088-exec-4] UserController  : Port:8089
2022-05-14 20:40:23.822  INFO [nio-8088-exec-4] UserController  : InstanceId:DESKTOP-TA8GFQL:order:8089
2022-05-14 20:40:23.822  INFO [nio-8088-exec-4] UserController  : Metadata:{management.port=8089}
2022-05-14 20:40:23.822  INFO [nio-8088-exec-4] UserController  : ServiceId:ORDER
2022-05-14 20:40:23.822  INFO [nio-8088-exec-4] UserController  : Scheme:http
2022-05-14 20:40:23.822  INFO [nio-8088-exec-4] UserController  : ==================================================
2022-05-14 20:40:26.409  INFO [nio-8088-exec-6] UserController  : client 开始调用
2022-05-14 20:40:26.410  INFO [nio-8088-exec-6] UserController  : Uri:http://DESKTOP-TA8GFQL:8090
2022-05-14 20:40:26.410  INFO [nio-8088-exec-6] UserController  : Host:DESKTOP-TA8GFQL
2022-05-14 20:40:26.410  INFO [nio-8088-exec-6] UserController  : Port:8090
2022-05-14 20:40:26.410  INFO [nio-8088-exec-6] UserController  : InstanceId:DESKTOP-TA8GFQL:order:8090
2022-05-14 20:40:26.410  INFO [nio-8088-exec-6] UserController  : Metadata:{management.port=8090}
2022-05-14 20:40:26.410  INFO [nio-8088-exec-6] UserController  : ServiceId:ORDER
2022-05-14 20:40:26.410  INFO [nio-8088-exec-6] UserController  : Scheme:http
2022-05-14 20:40:26.410  INFO [nio-8088-exec-6] UserController  : ==================================================
2022-05-14 20:40:29.007  INFO [nio-8088-exec-7] UserController  : client 开始调用
2022-05-14 20:40:29.007  INFO [nio-8088-exec-7] UserController  : Uri:http://DESKTOP-TA8GFQL:8089
2022-05-14 20:40:29.007  INFO [nio-8088-exec-7] UserController  : Host:DESKTOP-TA8GFQL
2022-05-14 20:40:29.007  INFO [nio-8088-exec-7] UserController  : Port:8089
2022-05-14 20:40:29.008  INFO [nio-8088-exec-7] UserController  : InstanceId:DESKTOP-TA8GFQL:order:8089
2022-05-14 20:40:29.008  INFO [nio-8088-exec-7] UserController  : Metadata:{management.port=8089}
2022-05-14 20:40:29.008  INFO [nio-8088-exec-7] UserController  : ServiceId:ORDER
2022-05-14 20:40:29.008  INFO [nio-8088-exec-7] UserController  : Scheme:http

至此我们已经简单的可以使用Ribbon了,下一篇我们开始讲讲 Ribbon有哪些 负载均衡策略,怎么使用调整这些策略

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ribbon负载均衡(一)Ribbon实战 的相关文章

  • java.lang.reflect.InvocationTargetException

    产生原因 1 包冲突 有重复包或者缺少包 2 项目jdk和部署jdk版本不一样 导致InvocationTargetException异常信息返回一个空值 没有调用invoc里的重写消息方法 3 映射文件发生改变 对于不同原因的解决 1 包

随机推荐

  • 最小生成树算法之Prim算法

    生成树 一个连通图的生成树是一个极小连通子图 它含有图中全部n个顶点和构成一棵树的 n 1 条边 连通图由一次遍历就可以产生生成树 由深度优先遍历得到的生成树称为深度优先生成树 由广度优先遍历得到的生成树称为广度优先生成树 一个连通图的生成
  • 为什么不用SSH了?SSH过时了吗?

    ssh最重要的还是后端处理 前端渲染部分已经被如今的互联网公司废掉了 例如用Vue等框架替代 而且随着docker一波热 相比早期 一站到底 的大而全 现在很多非核心的模块 被细化拆分 人称微服务 互联网公司节奏很快 迭代也很快 天生对小而
  • 计算机视觉项目-文档扫描OCR识别

    欢迎来到本博客 本次博客内容将继续讲解关于OpenCV的相关知识 作者简介 目前计算机研究生在读 主要研究方向是人工智能和群智能算法方向 目前熟悉python网页爬虫 机器学习 计算机视觉 OpenCV 群智能算法 然后正在学习深度学习的相
  • Python报错:[function object has no attribute plot]原因解释

    错误的翻译为 对象没有这个属性 plot 先看一个原先错的小例子的代码及结果 然后再看一下自己python的文件matplotlib的目录 现在应该一目了然了吧 错误的原因我把matplotlib里面的pyplot类中的plot 方法as为
  • 玩转 Numpy 的精选习题

    玩转 Numpy 的精选习题 一 1 打印 numpy 版本 import numpy as np print np version gt 1 16 5 2 创建 10 个元素空向量 Z np zeros 10 print Z gt 0 0
  • Tornado框架基础 -- (一)Tornado的介绍

    1 什么是Tornado 全称为Tornado Web Server 是一种Web服务器软件的开源版本 2 特点 1 作为Web框架 是一个轻量级的Web框架 类似于另一个web框架Web py 其拥有异步非阻塞IO的处理方式 2 作为We
  • SSLHandshake aborted:ssl... 解决方法

    最近有用户报出了这个问题 SSLHandshake aborted ssl 0x7b8b5260 I O error during system call Read only file system 百度查了下 可能原因 1 服务或者客户端
  • 正则表达式验证邮件格式

    public override void Checked string vInputName this SqlCheck ExecutePara InputName string vValue ObjectHelper GetString
  • PCL 偏度平衡滤波(SKF)算法

    目录 一 算法原理 1 原理概述 2 参考文献 二 代码实现 三 结果展示 一 算法原理 1 原理概述 SKF算法假定点云中自然地面点的高程概率密度分布服从正态分布 非地面点会使得点云中点的高程概率密度分布偏离正态分布 呈现出偏态分布 偏度
  • CRC循环冗余校验码

    CRC校验 CRC Cyclic Redundancy Check 即循环冗余检验码 是数据通信领域中最常用的一种差错校验码 其特征是信息字段和校验字段的长度可以任意选定 基本原理 在K位信息码后再拼接R位的校验码 整个编码长度为N位 因此
  • 服务器硬件测试选型

    面对琳琅满目的服务器硬件品牌和五花八门的硬件型号规格 如何选择高性价比的硬件配置 是系统运维的一项重要工作 系统工程师需要根据产品线的不同需求 测试服务器的各项性能以及功耗 同时结合成本确定出性价比最高的服务器配置 因此 硬件测试便成为了服
  • U-Boot 学习

    相关概念 参考文章 u boot FIT image介绍 wowotech net X 010 UBOOT 使用booti命令启动kernel Bubblegum 96平台 wowotech net FDT device tree 全称是f
  • SHELL入门学习

    SHELL SHELL 入门学习 shell 变量 shell echo shell printf shell test shell if then shell While shell function SHELL 入门学习 shell 变
  • 1.[springMvc]Servlet的基础知识

    Servlet的基础知识 servlet是啥 Servlet运行流程 示例 Servlet GenericServlet HttpServlet ServletContext Filter servlet映射器 servlet是啥 Java
  • 联合概率、边际概率、条件概率

    一时忘了联合概率 边际概率 条件概率是怎么回事 回头看看 某离散分布 联合概率 边际概率 条件概率的关系 其中 Pr X x Y y 为 XY的联合概率 Pr X x 为 X的边际概率 Pr X x Y y 为 X基于Y的条件概率 Pr Y
  • Openwrt编译报错 TCP Fast Open is not available for client mode 的解决办法

    报错信息 configure error TCP Fast Open is not available for client mode please rerun without enable tfo client gmake 3 Makef
  • Python安装教程步骤2:Windows中创建虚拟环境安装Pytorch并在PyCharm中配置虚拟环境

    python安装教程步骤2 windows中Anaconda创建虚拟环境安装pytorch并在pycharm中使用虚拟环境 作者介绍 windows中Anaconda创建虚拟环境安装pytorch 1 添加镜像源 2 创建虚拟环境 3 进入
  • ubuntu16.04详细安装pytorch(GPU)

    安装pytorch要安装两个模块 torch和torchvision torch是主模块 用来搭建神经网络 torchvision是辅模块 里面有搭建好的网络可以直接用 1 安装pip3 ubuntu自带python3 5和2 7 所以没装
  • linux 设置静态 ip 或者 修改 DNS

    设置 linux 静态 ip 或者 添加DNS preface 操作步骤 1 执行命令 nmtui 2 确认设置是否成功 supplements 3 1 linux 中 子网掩码的表示 3 2 DNS 和 ip 设置 3 3 DHCP 协议
  • Ribbon负载均衡(一)Ribbon实战

    Ribbon实战 文章目录 Ribbon实战 1 注册中心 1 1 服务注册到注册中心 1 2 服务注册列表Ribbon负载均衡选取相应节点 2 负载均衡方案 2 1 集中式负载均衡 2 2 进程内聚在均衡 3 Ribbon实践 3 1 配