博客
关于我
Spring Cloud系列_18 feign实现服务熔断,降级
阅读量:672 次
发布时间:2019-03-16

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

以下是优化后的内容:


Spring Boot + OpenFeign + Hystrix 服务消费者 ```python

基于Spring Boot和OpenFeign的组合使用案例,展示如何构建服务消费者并实现服务失效处理。

本案例中,服务消费者通过OpenFeign与服务提供者进行通信,并在服务失效时引入Hystrix进行熔断处理。---### 依赖管理```xml
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-openfeign
org.project.lombok
lombok
io.github.openfeign
feign-httpclient
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine

OpenFeign 集成 Hystrix ```python

本案例中,OpenFeign与Hystrix集成后,服务消费者在服务失效时可以通过Hystrix进行熔断处理,避免了长时间等待或抛出异常。


配置说明

server:    port: 8110    compression:        enabled: true        mime-types: application/json,application/xml,text/xml,text/html,text/plain        min-response-size: 512spring:    application:        name: service-consumer-hystrix-feigneureka:    client:        service-url:            defaultZone: http://root:123@localhost:8761/eureka/,http://root:123@localhost:8762/eureka/        register-with-eureka: false        registry-fetch-interval-seconds: 10feign:    hystrix:        enabled: true

实体类定义

@Data@NoArgsConstructor@AllArgsConstructorpublic class Order implements Serializable {    private Long id;    private String orderNo;    private String orderAddress;    private BigDecimal totalPrice;    private List
productList;}@Data@NoArgsConstructor@AllArgsConstructorpublic class Product implements Serializable { private Long id; private String name; private Integer num; private BigDecimal price;}

服务接口定义

@FeignClient(value = "service-provider", fallback = ProductServiceFallbackImpl.class)public interface ProductService {    @GetMapping("/provider/getProducts")    List
getProductList(); @GetMapping("/provider/getProductsById/{id}") Product getProductsById(@PathVariable("id") Long id); @PostMapping("/provider/getProductsByIdWithPost") Product selectProductByIdWithPost(Product product); @PostMapping("/provider/create") Map
createProduct(Product product); @GetMapping("/provider/pojo") Product selectProductByPojo(Product product);}public interface OrderService { Order getOrderById(Long id); Order getById(Long id); Order selectProductByIdWithPost(Product product); Map
createProduct(Product product); Product selectProductByPojo(Product product);}

熔断处理实现

public class ProductServiceFallbackImpl implements ProductService {    @Override    public List
getProductList() { return Arrays.asList( new Product(1L, "fallback01", 1, new BigDecimal("100")), new Product(2L, "fallback02", 1, new BigDecimal("100")) ); } @Override public Product getProductsById(Long id) { return new Product(id, "fallback0" + id, 1, new BigDecimal("100")); } @Override public Product selectProductByIdWithPost(Product product) { return new Product(product.getId(), "fallback0" + product.getId(), 1, new BigDecimal("100")); } @Override public Map
createProduct(Product product) { return null; } @Override public Product selectProductByPojo(Product product) { return null; }}

服务实现类

@Servicepublic class OrderServiceImpl implements OrderService {    @Resource    private ProductService productService;    @Override    public Order getOrderById(Long id) {        return new Order(            id,             "order01",             "address",             new BigDecimal("200"),             productService.getProductList()        );    }    @Override    public Order getById(Long id) {        return new Order(            id,             "order01",             "address",             new BigDecimal("200"),             Collections.singletonList(productService.getProductsById(id))        );    }    @Override    public Order selectProductByIdWithPost(Product product) {        return new Order(            product.getId(),             "order01",             "address",             new BigDecimal("200"),             Collections.singletonList(productService.selectProductByIdWithPost(product))        );    }    @Override    public Map
createProduct(Product product) { return productService.createProduct(product); } @Override public Product selectProductByPojo(Product product) { return productService.selectProductByPojo(product); }}

启动类注解

@EnableFeignClients

测试结果

通过上述配置和实现,消费者可以直接调用服务提供者的端点,返回的数据如下:

{    "id": 1,    "orderNo": "order01",    "orderAddress": "address",    "totalPrice": 200,    "productList": [        {            "id": 1,            "name": "fallback01",            "num": 1,            "price": 100        },        {            "id": 2,            "name": "fallback02",            "num": 1,            "price": 100        }    ]}

以上是基于Spring Boot和OpenFeign的服务消费者案例,展示了如何实现服务发现、过渡到Hystrix熔断,以及客户端的封装与调用。

转载地址:http://ggoqz.baihongyu.com/

你可能感兴趣的文章
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>