2.2:服务消费者(Ribbon)

本文详细介绍了Ribbon作为HTTP和TCP客户端的负载均衡器的工作原理,包括如何与Eureka配合使用,实现服务发现和负载均衡。并通过实例展示了如何在Spring Cloud项目中配置和使用Ribbon,最后分析了Ribbon的源码和负载均衡策略调整方法。

一. 什么是Ribbon?

  1. Ribbon是一个基于HTTP和TCP客户端的负载均衡器。Feign中也使用Ribbon。

  2. Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。

  3. 当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。


二. 使用Ribbon

  1. 在pom.xml中添加依赖

<dependencies>

    ...

    <dependency>

        <groupId>org.springframework.cloud</groupId>

        <artifactId>spring-cloud-starter-ribbon</artifactId>

    </dependency>

</dependencies>

 

  1. 配置application.yml,指定Eureka注册中心地址

server:

  port: 8781

 

#指定注册中心地址

eureka:

  client:

    serviceUrl:

      defaultZone: http://localhost:8761/eureka/

 

#服务的名称

spring:

  application:

    name: order-service

 

  1. 创建应用启动类

    1. 添加RestTemplate

    2. 添加两个注解

@SpringBootApplication

public class OrderServiceApplication {

 

    public static void main(String[] args) {

        SpringApplication.run(OrderServiceApplication.class, args);

    }

 

    @Bean

    @LoadBalanced

    public RestTemplate restTemplate() {

        return new RestTemplate();

    }

}

 

  1. 在调用其他服务的地方使用RestTemplate(一般是service的实现类中)

@Service

public class ProductOrderServiceImpl implements ProductOrderService {

 

    @Autowired

    private RestTemplate restTemplate;

 

//    @Autowired

//    private LoadBalancerClient loadBalancer;

 

    @Override

    public ProductOrder getProductOrder(int userId, int productId) {

 

        Map<String,Object> productMap = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId, Map.class);

 

        //调用方式二(主函数可以不加@LoadBalanced)

//        ServiceInstance instance = loadBalancer.choose("product-service");

//        String url = String.format("http://%s:%s/api/v1/product/find?id="+productId,instance.getHost(),instance.getPort());

//        RestTemplate restTemplate = new RestTemplate();

//        Map<String,Object> productMap = restTemplate.getForObject(url, Map.class);

 

        ProductOrder productOrder = new ProductOrder();

        productOrder.setCreateTime(new Date());

        productOrder.setUserId(userId);

        productOrder.setTradeNo(UUID.randomUUID().toString());

        productOrder.setProductName(productMap.get("name").toString());

        productOrder.setPrice(Integer.parseInt(productMap.get("price").toString()));

        return productOrder;

    }

}

 


三. Ribbon负载均衡源码分析及策略调整

  1. Ribbon负载均衡@LoadBalance分析

    1. 首先从注册中心获取provider的列表

    2. 通过一定的策略选择其中一个节点

    3. 再返回给restTemplate调用

  2. 策略调整

    1. 官方文档:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_customizing_the_ribbon_client_by_setting_properties

    2. 方式:在application.yml里面,自定义负载均衡策略

    3. 策略选择

      1. 如果每个机器配置一样,则建议不修改策略 (推荐)

      2. 如果部分机器配置强,则可以改为 WeightedResponseTimeRule

 

application.yml:

#自定义负载均衡策略

product-service:

  ribbon:

    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值