36、微服务远程调用 Ribbon 的使用

1、Ribbon 实现了 负载均衡和远程调用的一个组件,Ribbon: 进程内的LB 客户端的负载均衡加远程调用、Nginx: 集中式的LB服务端的负载均衡

Rinnon工作时分成两步:

一选择EurekaServer,选择同一区域内负载比较小的server。

二根据用户的策略选择server中一个远程地址,支持负载均衡,随机,响应时间加权重。

2、Ribbon自带的负载规则:IRule 接口,Ribbon默认时轮询规则

RoundRobinRule 轮询、RandomRule 随机、AvailabiltyFilteringRule 、BestAvailableRule 、ResponseTimeWeightedRule 、RetryRule 、WeightedResponseTimeRule 、ZoneAvoidanceRule

3、如何把默认的负载规则改成我们自己的负载规则

创建一个配置类,并且不能放在主启动类所在的包或者他的子包下,我们需要自己重新建一个包

@Configuration
public class MySelfRule {
    @Bean
    public RandomRule randomRule() {
        return new RandomRule();
    }
}

 

 

 修改主启动类,添加注解

@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)

 

 

 4、手写自己的负载均衡算法

在cloud-provider-payment8001 和 cloud-provider-payment8002 服务提供者的controller添加测试方法

    @GetMapping(value = "/lb")
    public String paymentLB() {
        return serverPort;
    }

修改 cloud-consumer-order80 服务消费者 修改主启动类

 

 

 添加自己的负载算法接口和实现类

 

 具体的实现类

@Component
public class MyLB implements LoadBalancer {

    private AtomicInteger atomicInteger = new AtomicInteger(0);

    public final Integer getAndIncrement() {
        int current;
        int next;
        do {
            current = atomicInteger.get();
            next = current >= Integer.MAX_VALUE?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 = getAndIncrement() % instances.size();
        ServiceInstance instance = instances.get(index);
        return instance;
    }
}

修改RestTemplate的配置类

@Configuration
public class RestConfig {

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

    @Bean(name = "restTemplate2")
    public RestTemplate restTemplate2 () {
        return new RestTemplate();
    }
}

业务controller 类测试自己手写的负载均衡算法

    @Autowired
    private LoadBalancer loadBalancer;
    @Autowired
    private DiscoveryClient discoveryClient;
    @Autowired
    @Qualifier("restTemplate2")
    private RestTemplate restTemplate2;

    @GetMapping(value = "/payment/lb")
    public String getPaymentLB() {
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        ServiceInstance instance = loadBalancer.instance(instances);
        URI uri = instance.getUri();
        String result = restTemplate2.getForObject(uri + "/payment/lb", String.class);
        return result;
    }

最后浏览器访问测试:http://localhost/consumer/payment/lb

posted @ 2021-06-29 13:39  shunnWcs  阅读(180)  评论(0)    收藏  举报