博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hystix熔断解决雪崩问题
阅读量:4641 次
发布时间:2019-06-09

本文共 6101 字,大约阅读时间需要 20 分钟。

1.线程隔离,服务降级(服务的消费方做降级处理)

当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果。

这就好比去买鱼,平常超市买鱼会额外赠送杀鱼的服务。等到逢年过节,超时繁忙时,可能就不提供杀鱼服务了,这就是服务的降级。

系统特别繁忙时,一些次要服务暂时中断,优先保证主要服务的畅通,一切资源优先让给主要服务来使用,在双十一、618时,京东天猫都会采用这样的策略。

pom.xml

org.springframework.cloud
spring-cloud-starter-netflix-hystrix

UserConsumerApplication.java

 
package cn.itcast.user; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; //@EnableDiscoveryClient //@SpringBootApplication //@EnableCircuitBreaker //服务的熔断 @SpringCloudApplication  //SpringCloudApplication可以替代上面三个 public class UserConsumerDemoApplication {
@Bean @LoadBalanced //负载均衡 public RestTemplate restTemplate() {
// 这次我们使用了OkHttp客户端,只需要注入工厂即可 return new RestTemplate(new OkHttp3ClientHttpRequestFactory()); } public static void main(String[] args) {
SpringApplication.run(UserConsumerDemoApplication.class, args); } }
 

 3.UserHController.java

package cn.itcast.user.controller;import cn.itcast.user.pojo.User;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestController@RequestMapping("consumerH")public class UserHController {    @Autowired    private RestTemplate restTemplate;    @GetMapping("{id}")    @HystrixCommand(fallbackMethod = "queryUserByIdFallback")   //单个方法的超时返回    public String queryUserById(@PathVariable("id") Long id){        String url = "http://user-service/user/" + id;        //User user = restTemplate.getForObject(url, User.class);        //return  user;        String user = restTemplate.getForObject(url, String.class);        return user;    }    public String queryUserByIdFallback(@PathVariable("id") Long id){        return "用户信息查询出现异常!";//        User user = new User();//        user.setId(id);//        user.setNickName("用户信息查询出现异常!");//        return user;    }} ========================== 配置统一超时信息
package cn.itcast.user.controller; import cn.itcast.user.pojo.User; import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("consumerH") @DefaultProperties(defaultFallback = "queryUserByIdFallback") public class UserHController {
@Autowired private RestTemplate restTemplate; @GetMapping("{id}") //@HystrixCommand(fallbackMethod = "queryUserByIdFallback") @HystrixCommand public String queryUserById(@PathVariable("id") Long id){
String url = "http://user-service/user/" + id; //User user = restTemplate.getForObject(url, User.class); //return user; String user = restTemplate.getForObject(url, String.class); return user; } //public String queryUserByIdFallback(@PathVariable("id") Long id){
//return "用户信息查询出现异常!"; // User user = new User(); // user.setId(id); // user.setNickName("用户信息查询出现异常!"); // return user; //} public String queryUserByIdFallback(){
return "用户信息查询出现异常!"; } } =============================================================
package cn.itcast.user.controller; import cn.itcast.user.pojo.User; import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("consumerH") @DefaultProperties(defaultFallback = "queryUserByIdFallback") public class UserHController {
@Autowired private RestTemplate restTemplate; @GetMapping("{id}") @HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000"), //响应超时时间 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60") }) public String queryUserById(@PathVariable("id") Long id){
if(id % 2 ==0){
throw new RuntimeException(""); } String url = "http://user-service/user/" + id; String user = restTemplate.getForObject(url, String.class); return user; } public String queryUserByIdFallback(){
return "用户信息查询出现异常!"; } }
 

 

转载于:https://www.cnblogs.com/wuxiang12580/p/10785643.html

你可能感兴趣的文章
jvm-监控指令-jdump
查看>>
maven安装与配置
查看>>
关于Cascading
查看>>
小奇的仓库(树形DP)
查看>>
VS2010 中,windows服务不能添加 System.Web 引用
查看>>
Python全栈之jQuery笔记
查看>>
NPM常用命令install 淘宝镜像 update等
查看>>
如何修改帝国cms文章点击量默认值和成倍增加
查看>>
POJ 2888 Magic Bracelet
查看>>
C#中的接口
查看>>
http-关于application/x-www-form-urlencoded等字符编码的解释说明
查看>>
【Calculus 微积分の一些个人理解】
查看>>
vxworks固件分析
查看>>
对局匹配
查看>>
用kattle将数据从SQLserver中导入到vertica中
查看>>
【虚拟化】支持IDE/SATA/SCSI
查看>>
MySQL超大表如何提高count速度
查看>>
Scanner和BufferReader的效率问题
查看>>
ionic2中使用moment.js
查看>>
MySql备份和恢复
查看>>