学习Ribbon
- Ribbon是什么?
Robbion是负载均衡
- 什么负载均衡?
- 高可用,负载均衡 集群
高可用:任何一个服务都有备用,当某个服务意外停止,备用服务依然可用。
负载均衡:让访问的请求,平均的负载到每个服务上。
集群:多台服务器实现一个功能,这些服务器称为集群。
2.为什么要有Ribbon
3.如何实现Ribbon
1.添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
2.添加注解
在restTemplate中添加@LoadBalanced
3.修改代码
String baseUrl = "http://provider02/"+id; User user = restTemplate.getForObject(baseUrl, User.class);
4.查看负载均衡
Alt+contrl+shift+n,查找类RibbonLoadBalancerClient的reconstructURI方法。
这种默认的方式,是使用轮询方式。
4.修改轮训策略
格式是:{服务名称}.ribbon.NFLoadBalancerRuleClassName,值就是IRule的实现类。
provider02: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 设定重试
- 添加依赖
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
- 修改配置
spring:
cloud:
loadbalancer:
retry:
enabled: true # 开启Spring Cloud的重试功能
user-service:
ribbon:
ConnectTimeout: 250 # Ribbon的连接超时时间
ReadTimeout: 1000 # Ribbon的数据读取超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
MaxAutoRetries: 1 # 对当前实例的重试次数
学习Hystrix
什么是Hystrix?
豪猪,是一种保护微服务的一种框架。
什么要有Hystrix?
雪崩
就是来微服务相互访问的过程中,某个微服务出现等待情况,造成其他调用这个微服务的微服务都处于等待状态,最终造成服务崩溃。
Hystrix就是为了防止雪崩。
Hystix如何防止雪崩
- 线程隔离
在之前,比如tomcat中,所有的访问享有所有的线程权限。默认tomcat有200个线程。
(通铺)
我们现在的微服务都是设定好了,自己微服务需要的线程,当某个微服务线程占满的时候,并不会影响其他微服务。(单间)
- 服务降级
就是当访问微服务阻塞的时候,当超过一定时间,返回给错误的结果。而进行友好的提示。
造成阻塞的假象
就在服务提供者代码里添加线程休眠
try { Thread.sleep(10*1000); } catch (InterruptedException e) { e.printStackTrace(); }
- 局部服务降级
- 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
修改属性文件- 添加注解
@EnableHystrix
因为后面要将熔断
@EnableCircuitBreaker
最后发现
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
使用
@SpringCloudApplication
- 添加代码
在要进行服务降级的方法上,添加注解,指定注解的回调函数
@HystrixCommand(fallbackMethod = "helloFallback")
实现回调函数(参数,返回值类型一致)
public Object helloFallback(int id){ User user = new User(); user.setId(id); user.setName("降级处理了"); return user; }