Ribbon负载均衡服务调用
Netflix公司推出的http和TCP的客户端负载均衡工具。
ribbon:
- 简化远程调用代码(服务发现)
- 内置很多负载均衡算法 ,默认是轮询的算法(通过一个策略拿到实例对象,并通过实例对象拿到对应的主机和端口号)
一、服务端负载均衡
负载均衡算法在服务端,服务端维护服务列表。通过Nginx负载均衡策略,把访问量平均分配给可以执行的服务器。这就是服务端负载均衡。
二、客户端负载均衡
- 负载均衡算法在客户端。
- 客户端维护服务列表。
- 通过consumer向注册中心拿到provider的列表,consumer通过一些算法选出一个provider,并进行发送。在consumer发送前进行算法调度,挑选出一个provider。这就是客户端的负载均衡。
三、使用Ribbon服务调用
- 新版的eureka依赖已经集成了Ribbon依赖,所以可以不引用
- 声明restTemplate是@LoadBalanced
- restTemplate请求远程服务时,ip端口替换为服务名
String url="http://EUREKA-PROVIDER/goods/findById/"+id;
Goods goods = restTemplate.getForObject(url, Goods.class);
开启服务后,多次调用可以发现: ribbon客户端,默认使用轮询算法,进行均衡调用。
四、设置ribbon 负载均衡策略
4.1 consumer工程
- MyRule 返回想要的规则即可
@Configuration
public class MyRule {
@Bean
public IRule rule(){
return new RandomRule();
}
}
- 启动类
// 指定规则用在哪一个需要调用的服务上
@RibbonClient(name ="EUREKA-PROVIDER",configuration = MyRule.class)
总结:
- irule的具体实现类,看到他带的几个策略的写法。
- 仿照策略的写法,自己写策略。
- 调用不同的其他微服务时,可以采用不同的策略。
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;
}
}