使用springcloud整合:
1、导入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、下载sentinel控制台
3、配置sentinel的控制台地址信息
4、在控制台调整参数,【默认所有的流控设置保存在内存中,重启失效】
5、每一个微服务都导入actuator,并配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: '*'
6、增加配置类,配置流控的自定义返回结果
@Configuration
public class SentinelConfig {
public SentinelConfig() {
WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {
@Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException {
R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMsg());
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("application/json");
httpServletResponse.getWriter().write(JSON.toJSONString(error));
}
});
}
}
Feign 支持
配置文件打开 Sentinel 对 Feign 的支持:
加入 spring-cloud-starter-openfeign 依赖使 Sentinel starter 中的自动化配置类生效:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1、调用方的熔断保护:配置feign.sentinel.enabled=true
2、调用方手动指定远程服务的降级策略,服务调用被降级处理,触发我们的熔断回调方法
@Slf4j
@Component
public class SeckillFeignServiceFallback implements SeckillFeignService {
@Override
public R getSkuSeckilInfo(Long skuId) {
log.error("熔断方法调用getSkuSeckilInfo。。。。");
return R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMsg());
}
}
3、超大浏览的时候,必须牺牲一些远程服务。在服务的提供方(远程服务)指定降级策略;
提供方是在运行,但是不运行自己的业务逻辑,返回的是默认的降级数据(限流的数据)
自定义受保护的资源
1、代码方式:
try (Entry entry = SphU.entry("seckillSkus")) {
//业务逻辑
} catch(Exception e) {}
2、基于注解
//使用该注解定义受保护资源,
@SentinelResource(value = "getCurrentSeckillSkus", blockHandler = "blockHandler")
//使用一下方法处理【返回类型需要和定义方法的返回类型一致】
public List<SeckillSkuRedisTo> blockHandler(BlockException e) {
log.error("资源被限流,{}", e.getMessage());
return null;
}
配置网关限流:
1、网关gateway服务添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
2、配置限流自定义返回:
@Configuration
public class SentinelGatewayConfig {
public SentinelGatewayConfig() {
GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMsg());
String errorJson = JSON.toJSONString(error);
Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(errorJson), String.class);
return body;
}
});
}
}
3、在控制台配置参数
使用Sleuth+Zipkin服务链路追踪
为什么用:
微服务架构中,如果出现问题或异常,很难去定位,必须实现分布式链路追踪,从而达到每个请求的步骤都清晰可见,出了问题,很快定位。
1.docker安装zipkin服务器
docker run -d -p 9400:9400 openzipkin/zipkin
2.导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
zipkin依赖也同时包含了sleuth,可以省略sleuth 的引用
3.添加zipkin相关配置
spring:
application:
name: user-server
zipkin:
base-url: http//192.168.1.15:9411 #zipkin服务器地址
discoveryClientEnabled: false #关闭服务发现,否则springcloud 会把zipkin的url当做服务名称
sender:
type: web
sleuth:
sampler:
probability: 1 #设置抽样采集率为100%,默认为0.1,即10%