"服务器忙,请稍后在试"不让客户达等待,立即返回一个友好的提示。
1.程序运行异常;
2.超时;
3.服务熔断触发服务降级;4
.线程池/信号量打满也会导致服务降级
在springcloud的框架里,熔断机制是通过hystrix实现,hystrix会监控服务之间的调用。当失败调用达到一定的阈值,默认是5s内失败20次,就会启用hystrix的熔断机制,使用命令@HystrixCommand。
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
代码
@GetMapping(value = "/consumer/payment/nacos/{id}")
@HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
})
public String paymentInfo(@PathVariable("id") Long id)
{
System.out.println("获取服务器配置信息serverUrl:"+serverURL);
System.out.println("9008的controller获取id:"+id);
String str=orderConsumerService.getPaymentByIdLjf22222(id);
return "ok:"+serverURL+""+str;
}
@GetMapping(value = "/consumer/getinfo/{id}")
public Object getUserInfo(@PathVariable("id") Long id)
{
User u=new User(id.intValue(),"beijing"+id);
return orderConsumerService.postQueryParams(u);
}
public String dealFallBackInfo(@PathVariable("id") Long id)
{
return "我是消费者9008,服务出错了,进行服务降级"+id;
}
添加:@EnableHystrix 注解
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
1.代码
@GetMapping(value = "/ljf/getinfo/{id}")
@HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
})
public String getPayment(@PathVariable("id") Integer id)
{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int k=10/0;
System.out.println("================服务9009 获取到的参数id:"+id);
return "服务9009 获取到的参数id:"+id;
}
@PostMapping("/path")
public String postQueryParams(@RequestBody User user) throws JsonProcessingException {
String str= new JsonMapper().writeValueAsString(user);
System.out.println("post提交....");
return str;
}
public String dealFallBackInfo(@PathVariable("id") Long id)
{
return "我是消费者9009,服务出错了,进行服务降级"+id;
}
2.截图
1.启动nacos,启动sleuth
2.启动consumer9008 provider9009
3.测试
1.代码
package com.ljf.mscloud.controller;
import com.ljf.mscloud.model.User;
import com.ljf.mscloud.service.OrderConsumerService;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: OrderConsumerController
* @Description: TODO
* @Author: admin
* @Date: 2023/08/14 18:09:14
* @Version: V1.0
**/
@RestController
@Slf4j
@RefreshScope //支持Nacos的动态刷新功能。
//
@DefaultProperties(defaultFallback = "globalFallBackInfo")
public class OrderConsumerController {
@Value("${service-url.nacos-user-service}")
private String serverURL;
@Autowired
private OrderConsumerService orderConsumerService;
@GetMapping(value = "/consumer/payment/nacos/{id}")
@HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
})
public String paymentInfo(@PathVariable("id") Long id)
{
System.out.println("获取服务器配置信息serverUrl:"+serverURL);
System.out.println("9008的controller获取id:"+id);
String str=orderConsumerService.getPaymentByIdLjf22222(id);
return "ok:"+serverURL+""+str;
}
@GetMapping(value = "/consumer/getinfo/{id}")
public Object getUserInfo(@PathVariable("id") Long id)
{
User u=new User(id.intValue(),"beijing"+id);
return orderConsumerService.postQueryParams(u);
}
public String dealFallBackInfo(@PathVariable("id") Long id)
{
return "我是消费者9008,服务出错了,进行服务降级"+id;
}
public String globalFallBackInfo()
{
return "Global异常处理信息,请稍后再试,客户端9008";
}
}
2.截图
原因在没有在制定方法加:@HystrixCommand 那么加上此注解后:
再次访问:http://localhost:9008/consumer/getinfo/666
package com.ljf.mscloud.controller;
import com.ljf.mscloud.model.User;
import com.ljf.mscloud.service.OrderConsumerService;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: OrderConsumerController
* @Description: TODO
* @Author: admin
* @Date: 2023/08/14 18:09:14
* @Version: V1.0
**/
@RestController
@Slf4j
@RefreshScope //支持Nacos的动态刷新功能。
//
//@DefaultProperties(defaultFallback = "globalFallBackInfo")
public class OrderConsumerController {
@Value("${service-url.nacos-user-service}")
private String serverURL;
@Autowired
private OrderConsumerService orderConsumerService;
@GetMapping(value = "/consumer/payment/nacos/{id}")
// @HystrixCommand(fallbackMethod = "dealFallBackInfo",commandProperties = {
// @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
// })
public String paymentInfo(@PathVariable("id") Long id)
{
System.out.println("获取服务器配置信息serverUrl:"+serverURL);
System.out.println("9008的controller获取id:"+id);
String str=orderConsumerService.getPaymentByIdLjf22222(id);
return "ok:"+serverURL+""+str;
}
@GetMapping(value = "/consumer/getinfo/{id}")
// @HystrixCommand
public Object getUserInfo(@PathVariable("id") Long id)
{
User u=new User(id.intValue(),"beijing"+id);
// int age = 10/0;
return orderConsumerService.postQueryParams(u);
}
public String dealFallBackInfo(@PathVariable("id") Long id)
{
return "我是消费者9008,服务出错了,进行服务降级"+id;
}
public String globalFallBackInfo()
{
return "Global异常处理信息,请稍后再试,客户端9008";
}
}
package com.ljf.mscloud.service;
import com.ljf.mscloud.model.User;
import feign.Headers;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@Component
@FeignClient(value = "mscloud-fegin-nacos-hystrix-provider9009",fallback = PaymentFallbackService.class)
public interface OrderConsumerService {
@GetMapping(value = "/ljf/getinfo/{yyid}") //相当于:
public String getPaymentByIdLjf22222(@PathVariable("yyid") Long ssid);
// @Headers({"Content-Type: application/json"})
// @PostMapping("/path")
@PostMapping(value = "/path",consumes ="application/json")
String postQueryParams(@RequestBody User user);
}
@Component
public class PaymentFallbackService implements OrderConsumerService{
@Override
public String getPaymentByIdLjf22222(Long ssid) {
return "getPaymentByIdLjf22222方法出现问题开始降级";
}
@Override
public String postQueryParams(User user) {
return "postQueryParams方法出现问题开始降级";
}
}
1.故意只启动 consuemr9008,不启动provider9009 模拟宕机的情况
2.测试