当前位置:   article > 正文

springcloud入门(一):整合openfeign和hystrix_feigin整合hystrix

feigin整合hystrix

一、背景介绍

这两天在折腾升级项目框架,springboot由2.2.2.RELEASE升级到2.7.6,springcloud由Hoxton.SR1升级到2021.0.6

直接替换版本发现代码有报错,有些注解报错了,所以学习了下,在此做个学习笔记。

作为入门篇,先不深究openfeign和hystrix怎么实现的,有啥详细配置;大概知道有什么作用就行。

openfeign:实现RPC调用

hystrix:实现接口熔断,即被调用的接口出现异常,或者调用超时,调用方直接返回备胎方法

二、整合步骤

准备一个Eureka注册中心,一个订单服务order-service(接口提供方),一个商品服务goods-service(接口调用方)。

我们先整合openfeign,测试ok再整合hystrix

1、订单服务order-service

order-service的pom.xm引入l如下

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <!-- spring-cloud -->
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-dependencies</artifactId>
  14. <version>2021.0.6</version>
  15. <type>pom</type>
  16. <scope>import</scope>
  17. </dependency>
  18. <!-- 整合openfeign -->
  19. <dependency>
  20. <groupId>org.springframework.cloud</groupId>
  21. <artifactId>spring-cloud-starter-openfeign</artifactId>
  22. <version>3.1.5</version>
  23. </dependency>
  24. <!-- 整合eureka客户端 -->
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  28. <version>3.1.5</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-test</artifactId>
  33. <scope>test</scope>
  34. </dependency>
  35. <!-- swagger -->
  36. <dependency>
  37. <groupId>com.github.xiaoymin</groupId>
  38. <artifactId>knife4j-spring-boot-starter</artifactId>
  39. <version>3.0.3</version>
  40. </dependency>
  41. </dependencies>

yml配置文件内容如下

  1. server:
  2. port: 8088
  3. spring:
  4. application:
  5. name: order-service
  6. # swagger用到的配置
  7. mvc:
  8. pathmatch:
  9. matching-strategy: ant_path_matcher
  10. eureka:
  11. client:
  12. # 需要将我的服务注册到eureka上
  13. register-with-eureka: true
  14. # 需要检索服务
  15. fetch-registry: true
  16. service-url:
  17. # 当前服务注册到eureka地址
  18. defaultZone: http://localhost:8761/eureka/
  19. # 从eureka服务器注册表中获取注册信息的时间间隔(s),默认为30秒
  20. registry-fetch-interval-seconds: 15
  21. # 心跳检测与续约时间
  22. # 测试时将值设置小些,保证服务关闭后注册中心及时剔除服务
  23. instance:
  24. # Eureka客户端向服务端发送心跳的间隔时间,单位秒
  25. lease-renewal-interval-in-seconds: 15
  26. # 服务端在收到最后一次心跳之后等待的时间上限,单位秒,超过则剔除
  27. lease-expiration-duration-in-seconds: 30
  28. # 以IP地址注册到服务中心,相互注册使用IP地址
  29. prefer-ip-address: true

随便定义一个Order实体类:

  1. import io.swagger.annotations.ApiModel;
  2. import io.swagger.annotations.ApiModelProperty;
  3. @ApiModel(value = "订单实体", description = "")
  4. public class Order {
  5. @ApiModelProperty(value = "订单号", required = true, example = "123")
  6. private String orderNo;
  7. @ApiModelProperty(value = "数量", required = true, example = "456")
  8. private Integer num;
  9. public String getOrderNo() {
  10. return orderNo;
  11. }
  12. public void setOrderNo(String orderNo) {
  13. this.orderNo = orderNo;
  14. }
  15. public Integer getNum() {
  16. return num;
  17. }
  18. public void setNum(Integer num) {
  19. this.num = num;
  20. }
  21. }

定义一个测试用的Controller接口

  1. @Api(tags = "订单接口")
  2. @RestController
  3. @RequestMapping("/order")
  4. public class OrderController {
  5. @ApiOperation(value = "列表查询", notes = "")
  6. @PostMapping(value = "/list")
  7. public BaseResult getList(@RequestBody Order params) {
  8. List<Order> list = new ArrayList<Order>();
  9. Order order = new Order();
  10. order.setOrderNo("123");
  11. order.setNum(456);
  12. list.add(order);
  13. return BaseResult.success(list);
  14. }
  15. }

 启动类增加注解,如下:

  1. @EnableDiscoveryClient
  2. @EnableFeignClients
  3. @SpringBootApplication
  4. public class SpringcloudApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(SpringcloudApplication.class, args);
  7. }
  8. }

2、商品服务goods-service

pom.xm引入和订单服务一样,yml配置也一样,修改下端口。Order实体也复制过去(实际项目中可以抽出来放到公共模块),启动类注解也一样。

定义一个远程调用的接口

  1. import org.springframework.cloud.openfeign.FeignClient;
  2. import org.springframework.web.bind.annotation.PostMapping;
  3. import org.springframework.web.bind.annotation.RequestBody;
  4. import com.example.springcloud.base.BaseResult;
  5. import com.example.springcloud.entity.Order;
  6. @FeignClient(value = "order-service") // 订单服务的应用名
  7. public interface OrderServiceFeign {
  8. @PostMapping(value = "/order/list") // 接口路径
  9. public BaseResult getList(@RequestBody Order params); //参数和订单服务的controller一致
  10. }

定义一个测试用的Controller接口,并且调用订单服务Controller的接口

  1. @Api(tags = "商品接口")
  2. @RestController
  3. @RequestMapping("/goods")
  4. public class GoodsController {
  5. @Autowired
  6. private OrderServiceFeign orderServiceFeign;
  7. @ApiOperation(value = "列表订单查询", notes = "")
  8. @PostMapping(value = "/orderList")
  9. public BaseResult getList(@RequestBody Order params) {
  10. return orderServiceFeign.getList(params);
  11. }
  12. }

3、启动服务

启动两个服务,可以在Eureka看到两个服务都注册上来了

然后打开商品服务的swagger,调用接口

响应内容是我们在订单服务controller接口设置的,测试没问题,说明能正常远程调用。

4、整合hystrix 

 在商品服务(调用方)的pom.xml引入:

  1. <!-- 整合hystrix -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  5. <version>2.2.10.RELEASE</version>
  6. </dependency>

yml文件加入以下:

  1. hystrix:
  2. command:
  3. default:
  4. execution:
  5. isolation:
  6. thread:
  7. # 接口超时时间3s
  8. timeoutInMilliseconds: 3000

启动类加入@EnableHystrix注解:

  1. @EnableHystrix
  2. @EnableDiscoveryClient
  3. @EnableFeignClients
  4. @SpringBootApplication
  5. public class SpringcloudApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(SpringcloudApplication.class, args);
  8. }
  9. }

商品测试服务的controller定义熔断方法fallbackMethodOne,并在测试接口加入注解@HystrixCommand,指定熔断方法:

  1. @Api(tags = "商品接口")
  2. @RestController
  3. @RequestMapping("/goods")
  4. public class GoodsController {
  5. @Autowired
  6. private OrderServiceFeign orderServiceFeign;
  7. @HystrixCommand(fallbackMethod = "fallbackMethod")
  8. @ApiOperation(value = "列表订单查询", notes = "")
  9. @PostMapping(value = "/orderList")
  10. public BaseResult getList(@RequestBody Order params) {
  11. return orderServiceFeign.getList(params);
  12. }
  13. // 熔断方法,注意这里参数要和上面方法的参数一致
  14. public BaseResult fallbackMethod(@RequestBody Order params) {
  15. return BaseResult.fail(500,"fail,接口熔断");
  16. }
  17. }

4.1、测试场景1:被调用的方法出现异常

在订单服务的接口增加异常:

  1. @ApiOperation(value = "列表查询", notes = "")
  2. @PostMapping(value = "/list")
  3. public BaseResult getList(@RequestBody Order params) {
  4. List<Order> list = new ArrayList<Order>();
  5. Order order = new Order();
  6. order.setOrderNo("123");
  7. order.setNum(456);
  8. list.add(order);
  9. System.out.println(1/0); //设置异常
  10. return BaseResult.success(list);
  11. }

继续swagger上调用,结果如下

符合预期

4.2、测试场景2:被调用的方法超时未返回 

在订单服务的接口增加sleep,睡眠4s或者更长,因为我们配置文件设置的超时时间是3s

  1. @Api(tags = "订单接口")
  2. @RestController
  3. @RequestMapping("/order")
  4. public class OrderController {
  5. @ApiOperation(value = "列表查询", notes = "")
  6. @PostMapping(value = "/list")
  7. public BaseResult getList(@RequestBody Order params) {
  8. List<Order> list = new ArrayList<Order>();
  9. Order order = new Order();
  10. order.setOrderNo("123");
  11. order.setNum(456);
  12. list.add(order);
  13. //System.out.println(1/0); //设置异常
  14. try {
  15. // 设置睡眠
  16. Thread.sleep(4*1000L);
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. return BaseResult.success(list);
  21. }
  22. }

继续swagger上调用,结果如下

可以看到接口耗时3s,等待订单服务接口响应3s,超时未返回,返回了备胎的熔断方法结果,

测试符合预期。

到此整合结束。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/428858
推荐阅读
相关标签
  

闽ICP备14008679号