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

浙公网安备 33010602011771号