ITPub博客

首页 > 架构设计 > > spring cloud云服务架构Spring Cloud Feign 及 Hystrix 回滚

spring cloud云服务架构Spring Cloud Feign 及 Hystrix 回滚

作者:gung123 时间:2020-02-14 15:50:33 0 删除 编辑

引入依赖 了解springcloud架构可以加求求:三五三六二四七二五九

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>

启动类: 

@EnableFeignClients(basePackages = "club.cearnach")
@SpringCloudApplication
@ComponentScan(basePackages = "club.cearnach")
public class OrderServerApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServerApplication.class, args);
}
}


 声明一个Client , fallback指定要回滚的实现类.

@FeignClient(name = "PRODUCT-SERVER", fallback = ProductClient.ProductClientFallback.class)
public interface ProductClient {
@GetMapping("/product/list")
String productList(@RequestParam("msg") String msg);

/**
* 回滚事件,需要实现要回滚的对象接口,该回滚是被调用方要执行的业务逻辑.
*/
@Slf4j
@Component
class ProductClientFallback implements ProductClient {

@Override
public String productList(String msg) {
String info = "productList fallback()";
log.info(info);
return info;
}
}
}

在另外一个模块中引用该Client所在的模块.

然后直接注入即可使用.

@Autowired
private ProductClient productClient;
/**
* HystrixCommand(fallbackMethod = "fallback") 指定单FeignClient不可用或者执行时抛出异常,需要回滚的方法
*
* @return
*/
@GetMapping("/feign/list")
@HystrixCommand(fallbackMethod = "fallback")
public String feignList() {
return productClient.productList("Fetch feign msg...");
}

  /**
  * 该回滚是当前调用方执行失败时的回滚.
  */

public String fallback() {
return "invoke fallback()";
}

或者实现 FallbackProvider 接口,实习该接口后, fallbackMethod 就不会生效了. 

package com.xmut.osm.zuul.filter;

import com.alibaba.fastjson.JSON;
import com.xmut.osm.common.bean.ResultVO;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.AbstractClientHttpResponse;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
* @author 阮胜
* @date 2018/7/22 20:01
*/
@Component
public class DefaultFallbackProviderImpl implements FallbackProvider {
@Override
public String getRoute() {
return null;
}

@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new AbstractClientHttpResponse() {
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.OK.value();
}

@Override
public String getStatusText() throws IOException {
return HttpStatus.OK.name();
}

@Override
public void close() {

}

@Override
public InputStream getBody() throws IOException {
ResultVO<String> resultVO = new ResultVO<>();
resultVO.setMessage("服务器正忙!");
resultVO.setSuccess(false);
return new ByteArrayInputStream(JSON.toJSONString(resultVO).getBytes());
}

@Override
public HttpHeaders getHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
return httpHeaders;
}
};
}
}

 最后,需要在调用FeignClient的那一方配置文件中添加如下配置: 

feign:
hystrix:
enabled: true



 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69952307/viewspace-3164906/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-11-01

  • 博文量
    200
  • 访问量
    79622