前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >05Ribbon负载均衡服务调用

05Ribbon负载均衡服务调用

作者头像
Remember_Ray
发布2020-10-29 11:08:15
3590
发布2020-10-29 11:08:15
举报
文章被收录于专栏:Ray学习笔记Ray学习笔记

Ribbon核心组件IRule

修改 3-cloud-consumer-order80

新建 Ribbon 规则类

注意该包不能被扫描到

代码语言:javascript
复制
package com.ray.myrule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description: Ribbon 规则类
 * @Author Administrator
 * @Date 2020/10/11 14:20
 * @Version 1.0
 */
@Configuration
public class MySelfRule {

    @Bean
    public IRule myRule() {
        return new RandomRule(); // 定义为随机
    }
}

config

代码语言:javascript
复制
package com.ray.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Description: 相当于封装了 HttpClient
 * @Author Ray
 * @Date 2020/10/07 11:40
 * @Version 1.0
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced // 赋予负载均衡能力
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

改 main

代码语言:javascript
复制
package com.ray.springcloud;

import com.ray.myrule.MySelfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

/**
 * @Description:
 * @Author Ray
 * @Date 2020/10/07 11:41
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient // 客户端
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class) // 负载规则替换,默认轮询
public class OrderMain80 {

    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class, args);
    }
}

测试

http://localhost/consumer/payment/get/130

随机使用 8001 或 8002 端口

Ribbon负载均衡算法

改造 8001 和 8002

controller

代码语言:javascript
复制
@GetMapping("/lb")
public String getPaymentLB() {
    return port;
}

改造 80

config

代码语言:javascript
复制
package com.ray.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Description: 相当于封装了 HttpClient
 * @Author Ray
 * @Date 2020/10/07 11:40
 * @Version 1.0
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    //@LoadBalanced // 赋予负载均衡能力
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

interface

代码语言:javascript
复制
package com.ray.springcloud.lb;

import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

/**
 * @Description: 自己实现轮询算法 - 接口
 * @Author Administrator
 * @Date 2020/10/11 14:57
 * @Version 1.0
 */
public interface LoadBalancer {

    /**
     * 得到目前注册中心可以使用的集群机器,放到集合里面
     */
    ServiceInstance instances(List<ServiceInstance> serviceInstances);
}

service

代码语言:javascript
复制
package com.ray.springcloud.lb;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Description: 自己实现轮询算法 - 实现
 * @Author Administrator
 * @Date 2020/10/11 15:14
 * @Version 1.0
 */
@Slf4j
@Component
public class MyLB implements LoadBalancer {

    // 默认从0开始
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    /**
     * 获取当前的次数
     */
    public final int getAndIncrement() {
        int current;
        int next;
        do {
            // 得到当前的值
            current = this.atomicInteger.get();
            // 考虑防止越界,实际肯定不会这么大
            next = current >= Integer.MAX_VALUE ? 0 : current + 1;
            // 如果值不相同,不停自旋,直到相同 compareAndSet
            log.info("<<<<< 自旋中 current: [{}] -- next: [{}]", current, next);
        } while (!this.atomicInteger.compareAndSet(current, next));
        log.info(">>>>> 访问次数 next: [{}]", next);
        return next;
    }

    /**
     * 第几次请求数
     */
    @Override
    public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
        int index = getAndIncrement() % serviceInstances.size();
        return serviceInstances.get(index);
    }
}

测试

http://localhost/consumer/payment/lb

结果:依次输出 8001 和 8002

结论:自定义算法实现Ribbon负载均衡默认轮询

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-15|,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Ribbon核心组件IRule
    • 修改 3-cloud-consumer-order80
      • 新建 Ribbon 规则类
      • config
      • 改 main
      • 测试
  • Ribbon负载均衡算法
    • 改造 8001 和 8002
      • controller
    • 改造 80
      • config
      • interface
      • service
      • 测试
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档