《SpringCloud专题12》-微服务架构编码构建-手写Ribbon负载均衡器
  eZw8kcl3fQWu 2023年11月12日 24 0

1.前言

Ribbon是SpringCloud的负载均衡器,默认的算法是轮询。在这里为了方便负载均衡的原理,可以自己手写一个负载均衡器

2.自定义一个本地负载均衡器

2.1.ApplicationContextBean去掉注解@LoadBalanced

package com.itxiongmao.config;

/**
* @BelongsProject: springcloud2020
* @BelongsPackage: com.itxiongmao.config
* @CreateTime: 2020-07-09 12:27
* @Description: TODO
*/
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;

@Configuration
public class ApplicationContextConfig {

@Bean
//@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

2.2.LoadBalancer接口

package com.itxiongmao.lb;

import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

public interface LoadBalaner {

ServiceInstance instance(List<ServiceInstance> instances);
}

2.3.MyLB

package com.itxiongmao.lb;


import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;

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

@Component
public class MyLB implements LoadBalaner {

private AtomicInteger atomicInteger = new AtomicInteger(0);

public final int getIncrement() {
int current;
int next;
do {
current = this.atomicInteger.get();
next = current >= 2147483647 ? 0 : current+1;
}while (!this.atomicInteger.compareAndSet(current,next));
System.out.println("------------第几次访问:次数next"+next);
return next;
}

@Override
public ServiceInstance instance(List<ServiceInstance> instances) {
int index = getIncrement() % instances.size();
return instances.get(index);
}
}

2.5.OrderController

@Resource
private DiscoveryClient discoveryClient;

@Resource
private LoadBalaner loadBalaner;

@GetMapping("payment/lb/selectOne/{id}")
public String getPaymentLB(@PathVariable("id") long id) {
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
if (instances == null || instances.size() == 0) {
return null;
}
ServiceInstance serviceInstance = loadBalaner.instance(instances);
URI uri = serviceInstance.getUri();
return restTemplate.getForObject(uri + "/payment/get", String.class);
}

2.6.测试

《SpringCloud专题12》-微服务架构编码构建-手写Ribbon负载均衡器_负载均衡
《SpringCloud专题12》-微服务架构编码构建-手写Ribbon负载均衡器_java_02
《SpringCloud专题12》-微服务架构编码构建-手写Ribbon负载均衡器_负载均衡_03


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
eZw8kcl3fQWu