本文主要介绍如何在springcloud中通过hystrix实现服务熔断与服务降级。本例使用的springcloud版本为:2021.0.3,springboot版本为:2.6.8。
1、创建消费端项目
打开idea新建项目,选择maven,创建springboot项目consumer-hystrix-order。
2、pom文件配置
在项目pom中引入如下依赖:
<dependencies>
<dependency>
<groupId>com.knight.springcloud</groupId>
<artifactId>cloud-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
<version>2.2.10.RELEASE</version>
</dependency>
</dependencies>
3、application.yml文件配置
在项目resources文件夹下创建application.yml文件,并按如下内容进行配置:
server:
port: 80
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
fetch-registry: true
instance:
instance-id: consumer-hystrix-order-${server.port}
prefer-ip-address: true
spring:
application:
name: consumer-hystrix-order
feign:
circuitbreaker:
enabled: true
4、主应用类配置
在项目src/main/java下创建主应用类 ConsumerHystrixOrderApplication.java,添加注解@EnableEurekaServer、@SpringBootApplication、@EnableFeignClients。
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
public class ConsumerHystrixOrderApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerHystrixOrderApplication.class, args);
}
}
本文主要介绍如何在springcloud中通过hystrix实现服务熔断与服务降级。本例使用的springcloud版本为:2021.0.3,springboot版本为:2.6.8。
1、创建消费端项目
打开idea新建项目,选择maven,创建springboot项目consumer-hystrix-order。
2、pom文件配置
在项目pom中引入如下依赖:
<dependencies>
<dependency>
<groupId>com.knight.springcloud</groupId>
<artifactId>cloud-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
<version>2.2.10.RELEASE</version>
</dependency>
</dependencies>
3、application.yml文件配置
在项目resources文件夹下创建application.yml文件,并按如下内容进行配置:
server:
port: 80
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
fetch-registry: true
instance:
instance-id: consumer-hystrix-order-${server.port}
prefer-ip-address: true
spring:
application:
name: consumer-hystrix-order
feign:
circuitbreaker:
enabled: true
4、主应用类配置
在项目src/main/java下创建主应用类 ConsumerHystrixOrderApplication.java,添加注解@EnableEurekaServer、@SpringBootApplication、@EnableFeignClients。
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
public class ConsumerHystrixOrderApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerHystrixOrderApplication.class, args);
}
}
5、远程微服务接口声明
在项目src/main/java/service下创建远程微服务接口类PaymentClientService,其中PAYMENT-SERVER为支付服务的服务名称。同时配置服务降级时的回调类PaymentClientFallback。
@FeignClient(name = "PAYMENT-SERVER", fallback = PaymentClientFallback.class)
public interface PaymentClientService {
@GetMapping("/payment/get/{id}")
CommentResult<Payment> getById(@PathVariable(name = "id") Long id);
}
@Component
public class PaymentClientFallback implements PaymentClientService {
public CommentResult<Payment> getById(Long id) {
return new CommentResult<Payment>(500,"服务调用失败,请稍后重试", null);
}
}
6、controller层调用
在controller层可以通过PaymentClientService进行远程微服务接口调用,使用方法如下:
@RestController
@RequestMapping("/order")
public class OrderController {
@Resource
private PaymentClientService paymentClientService;
@GetMapping("/get/{id}")
CommentResult<Payment> getById(@PathVariable(name = "id") Long id) {
return paymentClientService.getById(id);
}
}
7、测试验证
7.1 修改payment服务接口
修改payment服务中的 getById 方法,当传入的 id 小于 0 时,抛出异常,用于测试服务熔断和降级。
public CommentResult<Payment> getById(Long id) {
if(id < 0){
throw new RuntimeException("id不能小于0");
}
Payment payment = mapper.getById(id);
if(payment == null){
return new CommentResult<Payment>(500, "未查询到数据: " + id, null);
} else {
return new CommentResult<Payment>(200, port + "查询成功", payment);
}
}
7.2 启动测试
同时启动并运行项目eueka-server-7001、eueka-server-7002、payment-8001、payment-8002、consumer-hystrix-order。然后在postman中进行接口调用测试,当传入的 id 为 1 时,正常返回了请求结果,当传入的 id 为 -1 时,返回了服务降级的结果。