springcloud 中使用eureka/ribbon/Hystrix负载均衡及断路器
断路器相当于家里的空气跳闸,当某个应用实例挂了,它调用的以及掉用它的应用都会请求或者返回失败,这时如果不及时处理,大量的请求依旧在访问,会引起其他的正常的应用也挂了,最终导致雪崩,断路器会在每个请求的数量达到一定的阈值,会切断这个请求,返回预定的值,这样在修复前不会引起其他的应用的失效,最大程度控制整个项目,断路器有3个状态,打开,关闭,半开,当有应用挂了,请求在继续时,断路器打开;当应用正常
断路器相当于家里的空气跳闸,当某个应用实例挂了,它调用的以及掉用它的应用都会请求或者返回失败,这时如果不及时处理,大量的请求依旧在访问,会引起其他的正常的应用也挂了,最终导致雪崩,断路器会在每个请求的数量达到一定的阈值,会切断这个请求,返回预定的值,这样在修复前不会引起其他的应用的失效,最大程度控制整个项目,断路器有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,这时继续请求,
会进入我们设置好的页面,这样就不会因为挂了某个应用,用户不知情的情况下依旧反复大量的请求会引起雪崩。
更多推荐
所有评论(0)