续SpringCloud入门
1.负载均衡
1.介绍
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行
本质:负载均衡是一个算法,可以通过该算法实现从地址列表中获取一个地址进行服务调用。
Ribbon提供了**轮询、随机两种负载均衡算法(默认是轮询)**可以实现从地址列表中使用负载均衡算法获取地址进行服务调用。
2.步骤
像双十一的时候,订单秒杀,一个服务的访问量会特别大,所以就需要多个来执行同一个功能,形成集群
1.产生多个provider实例
2.在consumer中设置当前方法的返回对象,使用负载均衡算法
3.consumer使用provider的集群的名称(不能有_下划线),找到集群,然后在由拦截器来根据算法分配
但是怎么去Eureka获取provider的集群的名称呢?
1.provider的集群名不能有下划线_
用虚拟机来获取端口号 ${}
# service name
spring.application.name=demo01-provider-user
# service port
server.port=${port:8081}
2.consumer的启动类要添加负载均衡
@LoadBalanced //在consumer中设置当前方法的返回对象,使用负载均衡算法
@SpringBootApplication
@EnableEurekaClient
public class Demo02ConsumerUser8082Application {
public static void main(String[] args) {
SpringApplication.run(Demo02ConsumerUser8082Application.class, args);
}
//把RestTemplate放进IOC容器
@Bean
@LoadBalanced //在consumer中设置当前方法的返回对象,使用负载均衡算法
public RestTemplate getRt(){
RestTemplate rt=new RestTemplate();
return rt;
}
}
3.consumer的Controller类
此处不能写死 provider的 ip,port ,只能写服务名。不能使用_,替换成-
@RequestMapping(path = "/{id}",method = {
RequestMethod.GET})
public Object get02(@PathVariable long id){
//3:此处不能写死 provider的 ip,port ,只能写服务名。不能使用_,替换成-
String url = "http://demo01-provider-user/users/11";//参1 地址
String json = rt.getForObject(url, String.class);//参2:数据要转换成什么类型
return json;
}
2.熔断Hystrix
1.介绍
Hystrix是一个延迟和容错库
使用服务降级,线程隔离解决雪崩问题
2.雪崩问题
微服务I 发生异常,请求阻塞,用户请求就不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成雪崩效应。
3.线程隔离
Hystrix为每个依赖服务调用分配一个小的线程池
如果线程池已满调用将被立即拒绝,默认不采用排队,加速失败判定时间
如果线程全部用完了就会进行服务降级
4.服务降级
及时的告诉你,某个服务访问失败,返回一个失败的结果,不会一直等待下去
优先保证核心服务,而非核心服务不可用或弱可用。用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回友好的提示信息)
。 服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。
\
步骤
1.添加依赖
先在父工程的pom.xml中添加版本控制
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
然后在再consumer的pom.xml中添加
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.在consumer的启动类上添加注解
@EnableCircuitBreaker //开启熔断
或者添加 @SpringCloudApplication注解则之前的三个注解都不要添加,因为该注解包含了
/*@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker //开启熔断*/
@SpringCloudApplication
public class Demo02ConsumerUser8082Application {
public static void main(String[] args) {
SpringApplication.run(Demo02ConsumerUser8082Application.class, args);
}
//把RestTemplate放进IOC容器
@Bean
@LoadBalanced //在consumer中设置当前方法的返回对象,使用负载均衡算法