SpringCloud-负载均衡-Ribbon
创始人
2024-05-29 03:50:55
0

在这里插入图片描述

文章目录

  • 1. 作用:负载均衡
  • 2. 应用实战
    • 2.1 provider-a代码
    • 2.2 provider-b代码
    • 2.3 consumer代码
    • 2.4 api工具向consumer发送请求查看对provider的调用情况
  • 3. ribbon总结
    • 3.1 Ribbon 源码核心
    • 3.2 如何实现负载均衡的呢?

1. 作用:负载均衡

2. 应用实战

请求发给consumer,consumer调用provider-a和provider-b,达到负载均衡的效果
下面三个服务都作为eureka-client向eureka-server注册

2.1 provider-a代码

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProviderController {@GetMapping("hello")public String hello(){return "我是提供者aaaa的接口";}}

2.2 provider-b代码

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProviderController {@GetMapping("hello")public String hello(){return "我是提供者bbbb的接口";}}

2.3 consumer代码

controller:

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;
import org.springframework.web.client.RestTemplate;@RestController
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate LoadBalancerClient loadBalancerClient;/*** 思考 ribbon是怎么将 http://provider/hello 路径请求成功的* http://127.0.0.1:8080/hello* 1.拦截这个请求* 2.截取主机名称* 3.借助eureka来做服务发现 list<>* 4.通过负载均衡算法 拿到一个服务ip port* 5.reConstructURL* 6.发起请求** @param serviceName* @return*/@GetMapping("testRibbon")public String testRibbon(String serviceName){// 正常来讲 需要 拿到ip和port 以及 路径 才可以用// http://provider/helloString result = restTemplate.getForObject("http://" + serviceName + "/hello", String.class);// 只要你给restTemplate 加了ribbon的注解 项目中这个对象发起的请求 都会走ribbon的代理// 如果你想使用原生的restTemplate 就需要重新创建一个对象// RestTemplate myRest = new RestTemplate();// String forObject = myRest.getForObject("http://localhost:8888/aaa", String.class);return result;}// 轮训的算法 怎么去实现// 两台机器   A B// A// B// A// B// 代码实现轮训的算法  List<机器>// 请求次数//  int index =   1 % size    list.get(index);// % 取模 取余好处是一个周期函数 让得到的结果 总是小于 除数的//  1 / 2    1 % 2// 1%2=1// 2%2=0// 3%2=1// 4%2=0// 全局顶一个int i = 0// i++  线程不安全的// i % size// 怎么能做一个线程安全的轮训算法   加锁 效率极低  CAS 自旋锁 没有线程的等待和唤醒的开销// CAS 优点 性能好 java层面无锁的状态  但是在jvm层面 有锁的cmpxchg// CAS 缺点 会导致短暂时间内 CPU 飙升  还有ABA 问题/*** 核心是负载均衡,算法包括轮询、随机、权重、iphash* @param serviceName* @return*/@GetMapping("testRibbonRule")public String testRibbonRule(String serviceName){ServiceInstance choose = loadBalancerClient.choose(serviceName);return choose.toString();}}

启动类:在启动类对restTemplate的bean加上注解@LoadBalanced,这样整个服务内使用restTemplate调用时就能达到负载均衡的效果;
myRule()会定义负载均衡算法,不定义就是轮询,这里是随机算法

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableEurekaClient
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}/*** 这个RestTemplate 已经变了* LoadBalanced 他就会被ribbon来操作* @return*/@Bean@LoadBalancedpublic RestTemplate restTemplate111(){return new RestTemplate();}/*** 往容器中放一个rule对象* 你访问任何一个提供者 都是这个算法* @return*/@Beanpublic IRule myRule(){return new RandomRule();}}

配置文件:application.yml

server:port: 8082
spring:application:name: consumer
eureka:client:service-url:defaultZone: http://localhost:8761/eurekainstance:hostname: localhostprefer-ip-address: trueinstance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
# 访问不同的服务可以使用不同的算法规则,在启动类配置了,这里就不用配置了
#provider:  # 先写服务提供者的应用名称
#    ribbon:
#        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule    #几种算法的全限定类名
ribbon:eager-load:enabled: false # ribbon它只有自己的话 能不能做服务发现 借助eureka  # ribbon需要去eureka中获取服务列表 如果false就懒加载eureka:enabled: truehttp:  # 我们使用ribbon 用的restTemplate发请求 底部是java.net.HttpUrlConnection 发的请求  很方便 但是它不支持连接池client:  # 发请求的工具有很多 httpClient  它支持连接池 效率更好  如果你想改请求的工具 记得加这个依赖即可enabled: falseokhttp: # 这个也是请求工具 移动端用的比较多 轻量级的请求enabled: false

2.4 api工具向consumer发送请求查看对provider的调用情况

http://localhost:8082/testRibbon?serviceName=provider
这是consumer接口的url,serviceName是provider的服务名,对应provider-a和provider-b
在这里插入图片描述

再次发送请求:
在这里插入图片描述

3. ribbon总结

Ribbon 总结(后面的代码中 不会出现 ribbon)
Ribbon 是客户端实现负载均衡的远程调用组件,用法简单

3.1 Ribbon 源码核心

ILoadBalancer 接口:起到承上启下的作用

  1. 承上:从 eureka 拉取服务列表
  2. 启下:使用 IRule 算法实现客户端调用的负载均衡
    设计思想:每一个服务提供者都有自己的 ILoadBalancer
    userService—》客户端有自己的 ILoadBalancer
    TeacherService—》客户端有自己的 ILoadBalancer
    在客户端里面就是 Map iLoadBalancers
    Map iLoadBalancers 消费者端
    服务提供者的名称 value (服务列表 算法规则 )

3.2 如何实现负载均衡的呢?

iloadBalancer loadbalance = iloadBalancers.get(“user-service”)
List servers = Loadbalance.getReachableServers();//缓存起来
Server server = loadbalance .chooseServer(key) //key 是区 id,–》IRule 算法
chooseServer 下面有一个 IRule 算法
IRule 下面有很多实现的负载均衡算法
你就可以使用 eureka+ribbon 做分布式项目

相关内容

热门资讯

iPhone手机怎么玩安卓系统... 你有没有想过,你的iPhone手机竟然也能玩安卓系统?没错,就是那个一直以来让你觉得遥不可及的安卓世...
平板删安卓系统更新不了,原因及... 最近是不是你也遇到了这样的烦恼?平板电脑上的安卓系统更新不了,是不是让你头疼得要命?别急,今天就来给...
苹果组装机安卓系统卡,卡顿背后... 你有没有发现,最近用苹果手机的时候,有时候系统有点卡呢?这可真是让人头疼啊!你知道吗,其实这背后还有...
安卓系统原生浏览器,功能与体验... 你有没有发现,每次打开手机,那个小小的浏览器窗口总是默默无闻地在那里,陪你浏览网页、搜索信息、看视频...
安卓机如何上苹果系统,跨平台体... 你是不是也和我一样,对安卓机和苹果系统之间的切换充满了好奇?想象你的安卓手机里装满了各种应用,而苹果...
安卓导入系统证书失败,原因分析... 最近在使用安卓手机的时候,你是不是也遇到了一个让人头疼的问题——导入系统证书失败?别急,今天就来给你...
安卓原生系统有哪些手机,盘点搭... 你有没有想过,为什么有些手机用起来就是那么流畅,那么顺心呢?这背后可大有学问哦!今天,就让我带你一起...
安卓系统关机了怎么定位,安卓系... 手机突然关机了,是不是有点慌张呢?别担心,今天就来教你一招,让你的安卓手机即使关机了,也能轻松定位到...
安卓系统游戏加速器,畅享无延迟... 你有没有发现,手机游戏越来越好玩了?不过,有时候游戏体验可能并不那么顺畅,是不是因为手机性能不够强大...
安卓4系统天气功能,尽在掌握 安卓4系统天气功能大揭秘在当今这个数字化的世界里,手机已经不仅仅是一个通信工具,它更是一个集成了各种...
安卓系统如何玩碧蓝幻想,攻略与... 你有没有想过,在安卓系统上玩《碧蓝幻想》竟然可以这么酷炫?没错,就是那个让你沉迷其中的二次元大作!今...
安卓系统搜不到图朵,图朵生成之... 最近是不是你也遇到了这样的烦恼?手机里明明有那么多美美的图片,但是用安卓系统搜索的时候,却怎么也找不...
魁族8刷安卓系统,系统升级后的... 哇,你知道吗?最近在安卓系统圈子里,有一个话题可是引起了不小的轰动,那就是魁族8刷安卓系统。你是不是...
微信正版安装安卓系统,畅享沟通... 你有没有想过,你的微信是不是正版安装的安卓系统呢?这可不是一个小问题哦,它关系到你的微信使用体验和隐...
电视能刷安卓系统吗,电视也能刷... 电视能刷安卓系统吗?揭秘智能电视的无限可能想象你家的电视不再只是用来观看节目的工具,而是变成了一个功...
安卓系统开通通知功能,畅享智能... 你知道吗?最近安卓系统更新后,新增了一个超级实用的功能——开通通知功能!这可是个大喜事,让咱们的生活...
苹果系统安卓爱思助手,系统兼容... 你有没有发现,手机的世界里,苹果系统和安卓系统就像是一对欢喜冤家,总是各有各的粉丝,各有各的拥趸。而...
安卓系统占用很大内存,揭秘内存... 手机里的安卓系统是不是让你感觉内存不够用,就像你的房间堆满了杂物,总是找不到地方放新东西?别急,今天...
安卓系统p30,安卓系统下的摄... 你有没有发现,最近安卓系统P30在手机圈里可是火得一塌糊涂呢!这不,我就来给你好好扒一扒这款手机的那...
siri被安卓系统进入了,智能... 你知道吗?最近科技圈可是炸开了锅,因为一个大家伙——Siri,竟然悄悄地溜进了安卓系统!这可不是什么...