0
点赞
收藏
分享

微信扫一扫

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

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负载均衡器_spring
《SpringCloud专题12》-微服务架构编码构建-手写Ribbon负载均衡器_spring_02
《SpringCloud专题12》-微服务架构编码构建-手写Ribbon负载均衡器_java_03


举报

相关推荐

0 条评论