1.数据服务不可用之后,视图服务怎么办
首先开启eureka,data-service,feign-service。也可以讲前面说的服务链路追踪所有加入的东西删掉,防止还要开zipkin这个现在不需要的东西,如果没删的话,又没开zipkin,一些配置就不能使用
现在是开启eureka,data-service,feign-service,并访问http://localhost:8004/products 在前端上显示的数据
学习到这里,我们知道,视图微服务是依赖于数据微服务的。 那么当数据微服务不可用的时候,会怎么样呢? 我们主动把
ProductDataServiceApplication 关闭,然后再访问 :
http://localhost:8004/products 就会抛出如图所示的异常。
出现这个问题肯定是难以避免的,比如数据微服务所在的机房停电了。 但是这样的提示信息是非常不友好的,客户也看不懂这个是什么。
为了解决这个问题,我们就会引入断路器的概念。
2.断路器的概念
所谓的断路器,就是当被访问的微服务无法使用的时候,当前服务能够感知这个现象,并且提供一个备用的方案出来。
比如在这个例子里,数据微服务无法使用了,如果有了断路器,那么视图微服务就能够知道此事,并且展示给用户相关的信息。
而不会报错或者一直卡在那里~
3.pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
4.ProductClientFeign
注解由原来的 @FeignClient(value = “PRODUCT-DATA-SERVICE”) 修改为
@FeignClient(value = “PRODUCT-DATA-SERVICE”,fallback =
ProductClientFeignHystrix.class)这就表示,如果访问的 PRODUCT-DATA-SERVICE 不可用的话,就调用 ProductClientFeignHystrix
来进行反馈信息。
package org.example.service;
import org.example.pojo.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
@FeignClient(value = "PRODUCT-DATA-SERVICE" ,fallback = ProductClientFeignHystrix.class)
public interface ProductFeignClient {
@GetMapping("/getProduct")
public List<Product> listProducts();
}
5.ProductClientFeignHystrix
package org.example.service;
import org.example.pojo.Product;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class ProductClientFeignHystrix implements ProductFeignClient {
@Override
public List<Product> listProducts() {
List<Product> list = new ArrayList<>();
list.add(new Product(0,"产品数据微服务不可用",0));
return list;
}
}
6.application.yml
feign:
hystrix:
enabled: true
开启断路器后,重启视图微服务(此时数据微服务是关的)
http://localhost:8004/products
如下可得:发现走的是断路器的实现类
本章详细信息请看:
https://how2j.cn/k/springcloud/springcloud-hystrix/2042.html#nowhere