springcloud 中使用eureka/ribbon/Hystrix负载均衡及断路器
2017-04-19 17:31
609 查看
断路器相当于家里的空气跳闸,当某个应用实例挂了,它调用的以及掉用它的应用都会请求或者返回失败,这时如果不及时处理,大量的请求依旧在访问,会引起其他的正常的应用也挂了,最终导致雪崩,断路器会在每个请求的数量达到一定的阈值,会切断这个请求,返回预定的值,这样在修复前不会引起其他的应用的失效,最大程度控制整个项目,断路器有3个状态,打开,关闭,半开,当有应用挂了,请求在继续时,断路器打开;
当应用正常运行时,断路器关闭;
断路器在打开后,会切断某个请求,但是过一定时间,它会猜测这个应用是否已经修复了,它会将请求分流,即它收到10个请求,它拿2个请求继续正常访问请求,来看看是否修复,其余8个依旧返回预定值,这就是半打开状态。
代码还是上一篇的,http://blog.csdn.net/shunzi1046/article/details/70241982,只有简单的consumer中的部分修改:
pom文件中加入:<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
然后是启动类:
@EnableEurekaClient //通过该注解,实现服务发现,注册
@SpringBootApplication
@EnableCircuitBreaker //增加的断路器注解
public class DemoSimpleConsumerMovieApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoSimpleConsumerMovieApplication.class, args);
}
}
最后是控制器类:
package com.sino.cloud.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.sino.cloud.entity.User;
@RestController
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@HystrixCommand(fallbackMethod = "findByIdFallback")
@GetMapping("/movie/{id}")
public User findById(@PathVariable Long id){
return this.restTemplate.getForObject("http://user-service-provider/user/"+id,User.class );
}
public User findByIdFallback(Long id) {
User user = new User();
user.setId(-1L);
user.setName("默认用户");
return user;
}
}
其余的都不变。
然后还是先启动provier-user,再启动consumer-movie项目,请求访问成功后,停止provider,这时继续请求,
会进入我们设置好的页面,这样就不会因为挂了某个应用,用户不知情的情况下依旧反复大量的请求会引起雪崩。
当应用正常运行时,断路器关闭;
断路器在打开后,会切断某个请求,但是过一定时间,它会猜测这个应用是否已经修复了,它会将请求分流,即它收到10个请求,它拿2个请求继续正常访问请求,来看看是否修复,其余8个依旧返回预定值,这就是半打开状态。
代码还是上一篇的,http://blog.csdn.net/shunzi1046/article/details/70241982,只有简单的consumer中的部分修改:
pom文件中加入:<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
然后是启动类:
@EnableEurekaClient //通过该注解,实现服务发现,注册
@SpringBootApplication
@EnableCircuitBreaker //增加的断路器注解
public class DemoSimpleConsumerMovieApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoSimpleConsumerMovieApplication.class, args);
}
}
最后是控制器类:
package com.sino.cloud.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.sino.cloud.entity.User;
@RestController
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@HystrixCommand(fallbackMethod = "findByIdFallback")
@GetMapping("/movie/{id}")
public User findById(@PathVariable Long id){
return this.restTemplate.getForObject("http://user-service-provider/user/"+id,User.class );
}
public User findByIdFallback(Long id) {
User user = new User();
user.setId(-1L);
user.setName("默认用户");
return user;
}
}
其余的都不变。
然后还是先启动provier-user,再启动consumer-movie项目,请求访问成功后,停止provider,这时继续请求,
会进入我们设置好的页面,这样就不会因为挂了某个应用,用户不知情的情况下依旧反复大量的请求会引起雪崩。
相关文章推荐
- SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)
- SpringCloud使用eureka(rest)和ribbon实现服务调用和负载均衡
- 服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)
- SpringCloud(第 006 篇)电影微服务,使用 Ribbon 在客户端进行负载均衡
- SpringCloud(第 011 篇)电影Ribbon微服务,脱离Eureka使用配置listOfServers进行客户端负载均衡调度
- SpringCloud(第 014 篇)电影 Ribbon 微服务集成 Hystrix 断路器实现失败快速响应,达到熔断效果
- SpringCloud教程 | 五.断路器(hystrix)【基于ribbon和feign】
- springcloud-05-ribbon中不使用eureka
- SpringCloud(九):Ribbon脱离Eureka使用及原生api
- SpringCloud(第 013 篇)电影微服务使用定制化 Feign 在客户端进行负载均衡调度并为 Feign 配置帐号密码登录认证 Eureka
- SpringCloud 学习 | 第五篇: ribbon断路器使用(hystrix)
- SpringCloud(第 006 篇)电影微服务,使用 Ribbon 在客户端进行负载均衡
- SpringCloud(第 013 篇)电影微服务使用定制化 Feign 在客户端进行负载均衡调度并为 Feign 配置帐号密码登录认证 Eureka
- SpringCloud-----1、Eureka实现服务治理(Ribbon客户端负载均衡调用服务)
- springCloud学习01之eureka服务发现-提供者-消费者ribbon/feign-负载均衡
- 史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix Turbine)
- 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)
- ribbon使用eureka的meta进行动态路由
- 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)
- 史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix Turbine)