你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

谷粒商城项目(学习笔记十七)

2022/1/2 4:56:50

第十四章:Sentinel服务

一、引入服务

1)、去官网下载jar包

Sentinel官网

2)、在common中引入spring-cloud-starter-alibaba-sentinel

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

3)、配置控制台

#sentinel控制台
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=localhost:8080
#暴露审计信息
management.endpoints.web.exposure.include=*

4)、配置自定义流控

@Configuration
public class SeckillSentinelConfig implements BlockExceptionHandler {

    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        R error = R.error(BizCodeEnume.TOO_MANY_REQUEST.getCode(), BizCodeEnume.TOO_MANY_REQUEST.getMsg());
        httpServletResponse.setCharacterEncoding("UTF-8");
        httpServletResponse.setContentType("application/json");
        httpServletResponse.getWriter().write(JSON.toJSONString(error));
    }

}

5)、为所有的微服务引入Sentinel

二、Sentinel保护

1)、流量监控

测试

 2)、熔断降级

1.熔断(被动的,服务出现问题,如宕机保护)

为Feign添加熔断注解

@FeignClient(value = "gulimall-seckill",fallback = SeckillFeignServiceFallBack.class)
@Slf4j
@Component
public class SeckillFeignServiceFallBack implements SeckillFeignService {
    @Override
    public R getSkuSeckillInfo(Long skuId) {
        log.info("熔断方法调用...getSkuSeckillInfo");
        return R.error(BizCodeEnume.TOO_MANY_REQUEST.getCode(),BizCodeEnume.TOO_MANY_REQUEST.getMsg());
    }
}

2.降级(手动的,设置的保护机制)

 3)、自定义保护

4)、网关流控

1.引入网关流控

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
        </dependency>

2.为网关设置流控和熔断降级

3.配置网关的流控

@Configuration
public class SentinelGatewayConfig {

    //TODO 响应式编程
    //GatewayCallbackManager
    public SentinelGatewayConfig(){
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler(){
            //网关限流了请求,就会调用此回调  Mono Flux
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {

                R error = R.error(BizCodeEnume.TOO_MANY_REQUEST.getCode(), BizCodeEnume.TOO_MANY_REQUEST.getMsg());
                String errJson = JSON.toJSONString(error);

//                Mono<String> aaa = Mono.just("aaa");
                Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(errJson), String.class);
                return body;
            }
        });

//        FlowRule flowRule = new FlowRule();
//        flowRule.setRefResource("gulimall_seckill_route");
        flowRule.set
//        FlowRuleManager.loadRules(Arrays.asList(flowRule));
    }
}

三、Sleuth+ZipkiN服务链路追踪

1)、docker安装Zipkin服务器

docker run -d -p 9411:9411 openzipkin/zipkin

2)、导入依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

3)、配置相关配置

#服务追踪
spring.zipkin.base-url=http://自己地址:9411/
spring.zipkin.discovery-client-enabled=false
spring.zipkin.sender.type=web
spring.sleuth.sampler.probability=1

4)、持久化配置

docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=es地址:9200
openzipkin/zipkin-dependencies