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 做分布式项目

相关内容

热门资讯

安卓系统的总体框架,架构与核心... 你有没有想过,你的手机里那个神奇的安卓系统,它到底是怎么运作的呢?今天,就让我带你一探究竟,揭开安卓...
谁的安卓系统好,谁家的安卓系统... 说到安卓系统,这可是个热门话题呢!你有没有想过,这么多安卓手机品牌,哪个的操作系统最让你心动?今天,...
安卓系统信付通,安全无忧的移动... 你知道吗?在安卓手机的世界里,有一个超级好用的支付工具,它就是信付通。今天,就让我带你来全方位了解一...
小米官方系统安卓包,深度解析与... 亲爱的数码爱好者们,你是否曾为手机系统而烦恼?市面上那么多手机品牌,各种操作系统让人眼花缭乱。今天,...
自制安卓手机双系统,自制安卓手... 你有没有想过,自己的手机可以同时运行两个操作系统呢?没错,就是那种安卓手机双系统!听起来是不是很酷?...
小米安卓系统怎么设置,科技前沿... 小米手机的用户们,是不是觉得安卓系统有点复杂,设置起来有点头疼呢?别担心,今天就来手把手教你如何轻松...
点歌系统支持安卓系统么,安卓用... 你有没有想过,在手机上点歌听歌,是不是也能像在KTV里那样随心所欲呢?现在,就让我来告诉你一个超级酷...
原版安卓系统刷机,解锁无限可能 你有没有想过,你的安卓手机其实可以焕然一新?没错,就是那种原汁原味的安卓系统,让你的手机重新找回当初...
欧尚改装安卓系统,打造智能驾驶... 你有没有想过,你的欧尚汽车其实也可以变身成为智能座驾呢?没错,就是那个你每天上下班的伙伴——欧尚,现...
安卓系统最新事件,揭秘最新重大... 你知道吗?最近安卓系统可是发生了一件超级大事件,简直让人兴奋得心跳加速!这不,我就迫不及待地来和你分...
早期电话手表安卓系统,安卓系统... 你有没有想过,小时候那些看似简单的玩具,现在竟然也能玩出花来?比如,早期的电话手表,那时候的功能可真...
安卓老系统手机游戏,安卓老系统... 你有没有发现,那些安卓老系统手机,虽然看起来有点古老,但它们在游戏界可是有着自己独特的魅力呢!想象那...
安卓系统重启还是开关,重启与开... 手机突然卡壳了,是不是又该给安卓系统来个重启大法了?别急,今天就来聊聊这个让人又爱又恨的“安卓系统重...
安卓系统刷入iso,轻松实现个... 你有没有想过,你的安卓手机其实可以像变形金刚一样,换上全新的“皮肤”?没错,就是刷入ISO系统!这可...
安卓机系统无法关机,探究原因与... 最近我的安卓手机怎么啦?总是关机不成功,真是让人头疼啊!这可怎么办呢?别急,让我来帮你分析找出解决这...
安卓什么系统广告最多,揭秘最新... 你有没有发现,每次打开安卓手机,广告就像无处不在的小精灵,跳来跳去,让人眼花缭乱?今天,就让我带你一...
禁止中国使用安卓系统,“安卓系... 你知道吗?最近互联网上掀起了一股热议,那就是关于中国是否应该禁止使用安卓系统的话题。这可不是闹着玩的...
如何分辨ios系统和安卓系统,... 你有没有想过,你的手机里装的是iOS系统还是安卓系统呢?这两种系统各有千秋,但分辨它们其实并不难。今...
如何查询安卓系统版本,安卓系统... 你有没有想过,你的安卓手机里隐藏着一个小秘密——那就是它的系统版本!知道这个秘密,不仅能让你更好地了...
lg电视系统和安卓系统比较,性... 你有没有发现,现在家里的电视已经不再是那个傻乎乎的“大盒子”了?它变得聪明起来,能和你互动,能上网,...