Ribbon负载均衡服务调用和OpenFeign服务接口调用

44 阅读2分钟

Ribbon负载均衡服务调用

Netflix公司推出的http和TCP的客户端负载均衡工具。

ribbon:

  • 简化远程调用代码(服务发现)
  • 内置很多负载均衡算法 ,默认是轮询的算法(通过一个策略拿到实例对象,并通过实例对象拿到对应的主机和端口号)

一、服务端负载均衡

负载均衡算法在服务端,服务端维护服务列表。通过Nginx负载均衡策略,把访问量平均分配给可以执行的服务器。这就是服务端负载均衡。

二、客户端负载均衡

  • 负载均衡算法在客户端。
  • 客户端维护服务列表。
  • 通过consumer向注册中心拿到provider的列表,consumer通过一些算法选出一个provider,并进行发送。在consumer发送前进行算法调度,挑选出一个provider。这就是客户端的负载均衡。

三、使用Ribbon服务调用

  1. 新版的eureka依赖已经集成了Ribbon依赖,所以可以不引用
  2. 声明restTemplate是@LoadBalanced
  3. restTemplate请求远程服务时,ip端口替换为服务名
String url="http://EUREKA-PROVIDER/goods/findById/"+id;
Goods goods = restTemplate.getForObject(url, Goods.class);

开启服务后,多次调用可以发现: ribbon客户端,默认使用轮询算法,进行均衡调用。

四、设置ribbon 负载均衡策略

4.1 consumer工程

  1. MyRule 返回想要的规则即可
@Configuration
public class MyRule {
    @Bean
    public IRule rule(){
        return new RandomRule();
    }
}
  1. 启动类
// 指定规则用在哪一个需要调用的服务上
@RibbonClient(name ="EUREKA-PROVIDER",configuration = MyRule.class)

总结:

  1. irule的具体实现类,看到他带的几个策略的写法。
  2. 仿照策略的写法,自己写策略。
  3. 调用不同的其他微服务时,可以采用不同的策略。

OpenFeign服务接口调用

一、OpenFeign简介

  • Feign 是一个声明式的 REST 客户端,它用了基于接口的注解方式,很方便实现客户端像调用本地接口方法一样,进行远程调用。
  • Feign 最初由 Netflix 公司提供,但不支持SpringMVC注解,后由 SpringCloud 对其封装,支持了SpringMVC注解,让使用者更易于接受。

二、项目搭建

consumer消费者端

2.1 在consumer端引入open-feign依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.2 编写Feign调用接口

@FeignClient("EUREKA-PROVIDER")
public interface GoodsFeign {
    @GetMapping("/goods/findById/{id}")
    public Goods findById(@PathVariable("id") Integer id);
}

2.3 在启动类 添加 @EnableFeignClients注解,开启Feign功能

2.4 改造商品controller

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    GoodsFeign goodsFeign;

    @GetMapping("/add/{id}")
    public Goods add(@PathVariable("id") Integer id){
           //ribbon 调用
           //String url="http://EUREKA-PROVIDER/goods/findById/"+id;
          //Goods goods = restTemplate.getForObject(url, Goods.class);

        //feign调用
        Goods goods = goodsFeign.findById(id);
        return goods;
    }
}