Springboot-cli 开发脚手架系列
简介
-
在微服务中断路器在方法执行失败时可以优雅的处理失败,避免跨调用堆栈产生级联失败。
-
断路器起初会处于关闭状态,允许进行方法的调用。如果因为某种原因,方法调用失败了,断路器就会打开,就不会对失败的方法再执行调用了。此时会调用一个后备方法代替失败的方法返回结果。在调用后备方法的过程中断路器偶尔会进入半开状态,去再次尝试调用发生失败的方法:如果依然失败,断路器就恢复打开状态;如果调用成功,它会认为问题已经解决,断路器回到闭合状态。
-
nacos安装: http://t.csdn.cn/nuufT
1. 环境
- 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
- 本项目cloud版本
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>2020.0.5</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
<spring-boot-dependencies.version>2.5.3</spring-boot-dependencies.version>
<fastjson.version>1.2.80</fastjson.version>
</properties>
- 结尾有完整项目源码,这里就不贴完整
pom.xml
文件了
2. 提供者
bootstrap.yml
server:
port: 9998
# NaCos
spring:
application:
name: provider
# NaCos
cloud:
service-registry:
auto-registration:
# 是否注册到注册中心
enabled: true
nacos:
discovery:
server-addr: 192.168.0.251:8848
# namespace: 1d5a097c-898e-403e-8935-fdbe2cf854f6
namespace: be88b2b8-987c-4801-a5f1-05b867e6370e
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: ${spring.cloud.nacos.discovery.namespace}
file-extension: yaml
prefix: ${spring.application.name}
IndexController
接口,模拟一个超时连接
@RestController
@Slf4j
public class IndexController {
@GetMapping("get")
public String get() throws InterruptedException {
Thread.sleep(5000);
return "喵喵喵";
}
}
3. 消费者
- 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
feign.circuitbreaker.enabled
开启服务熔断,Feign默认关闭了对Hystrix的支持,需要在application.yml进行配置feign.httpclient.connection-timeout
设置超时时间 2Sbootstrap.yml
完整配置
server:
port: 9999
# NaCos
spring:
application:
name: consumer
# NaCos
cloud:
service-registry:
auto-registration:
# 是否注册到注册中心
enabled: true
nacos:
discovery:
server-addr: 192.168.0.251:8848
# namespace: 1d5a097c-898e-403e-8935-fdbe2cf854f6
namespace: be88b2b8-987c-4801-a5f1-05b867e6370e
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: ${spring.cloud.nacos.discovery.namespace}
file-extension: yaml
prefix: ${spring.application.name}
feign:
# 开启熔断机制
circuitbreaker:
enabled: true
# 设置超时时间
httpclient:
connection-timeout: 2000
ProviderApi
openfeign 接口,fallback
用于指定请求错误时的回调,用于降级处理
/**
* 利用openfeign 调用消费者的api
*
* @author lqd
*/
@FeignClient(value = "provider", fallback = ProviderApiImpl.class)
public interface ProviderApi {
/**
* @return ``
*/
@GetMapping("/get")
ResponseEntity<String> get();
}
- 处理错误回调的实现类
ProviderApiImpl
@Service
public class ProviderApiImpl implements ProviderApi {
@Override
public ResponseEntity<String> get() {
return ResponseEntity.ok("请求出错啦,进入熔断处理。");
}
}
- 编写消费者api
ConsumerController
@RestController
@Slf4j
@RequiredArgsConstructor
public class ConsumerController {
private final ProviderApi providerApi;
@GetMapping("/test")
public String get() {
// 从提供者中获取数据
ResponseEntity<String> stringResponseEntity = providerApi.get();
log.info("从提供者中获取数据:{}", stringResponseEntity);
return stringResponseEntity.getBody();
}
}
4. 效果测试
- 浏览器访问
localhost:9999/test
- 可以看到我们的服务熔断降级生效了
6. 源码分享
本项目已收录
- Springboot、SpringCloud各种常用框架使用案例,完善的文档,致力于让开发者快速搭建基础环境并让应用跑起来,并提供丰富的使用示例供使用者参考,快速上手。
- 项目源码github地址
- 项目源码国内gitee地址