负载均衡
服务器为了提高并发性能、可用性一般会以集群方式部署。
负载均衡是将流量均匀的分配到每一台服务器上,从而实现集群作用的最大化。
负载均衡的分类:
服务器端实现:Nginx(软件)、F5(硬件)
客户端实现:Ribbon基于注册中心实现,服务消费者调用服务提供者集群时,Ribbon通过注册中心拉取服务地址,通过特定的负载均衡策略实现服务调用。
Ribbon的使用
1.引入Ribbon依赖,已经包含在Eureka-Client依赖中。
2.在配置类里面的RestTemplate加@LoadBalanced。
/**
* 配置RestTemplate
*/
@Configuration
public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.调用提供者时自动生效。
Ribbon负载均衡的策略
Ribbon的负载均衡策略,都实现com.netflix.loadbalancer.IRule接口。
配置方法:
全局:
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.策略名称
局部:
服务名.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.策略名称类名
Hystrix的使用
Netflix提供的熔断器,能在服务出现长时间等待或崩溃的情况下提供一系列处理方法,解决服务雪崩的问题。
方法有:
熔断:当失败率达到一定的阈值,会触发熔断,进行快速失败。
降级:降级处理,返回兜底数据
缓存:对请求进行缓存、请求合并处理
实时监控、报警、控制等
使用步骤:
1.引入hystrix依赖
2.在启动类加 @EnableHystrix
3.在需要熔断降级的方法上添加注解 @HystrixCommand(fallbackMethod="降级方法名")
4.在同一个类中添加降级方法,返回兜底数据
@Service
public class ProductService {
@Autowired
private RestTemplate restTemplate;
//熔断和降级
@HystrixCommand(fallbackMethod = "getProductByIdFallback")
public Product getProductById(Long id){
//商品服务查询商品
ResponseEntity<Product> entity =
restTemplate.getForEntity("http://product-service/product/" + id, Product.class);
return entity.getBody();
}
//降级方法
public Product getProductByIdFallback(Long id){
//兜底的商品对象
return new Product(0L,"兜底商品",new BigDecimal("0"));
}
}
Hystrix的资源隔离模式
Hystrix会为每个调用的方法(@HystrixCommand)分配一定的资源,资源之间相互隔离。
分为两种:
1.线程池隔离
2.信号量隔离
线程池隔离
服务消费者调用每个服务提供者时,都分配单独的线程池,进行远程的调用。
线程池隔离的优缺点:
优点:1. 可以配置线程池的长度,从而对流量进行限流。
2. 线程异步执行,并发效率高。
缺点:1.消耗系统资源较多。2.线程池的控制相对复杂。
信号量隔离
为每个调用方法设置信号量,当请求数超过信号量后就被丢弃。
信号量隔离的优缺点:
优点:1.占用资源少,2.控制简单。
缺点:功能相对简单。
配置:
线程池
hystrix.command.default.execution.isolation.strategy=THREAD
信号量
hystrix.command.default.execution.isolation.strategy=SEMAPHORE