springcloud(12)SentinelResource注解配置应用及其他

摘要:
本篇接上篇的sentinel,主要介绍sentinelResource注解和兜底的方法fallback的各种参数和使用。--热部署--˃org.springframework.bootspring-boot-devtoolsruntimetrueorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestViewCodeyml文件server:port:9004spring:application:name:nacos-payment-providercloud:nacos:discovery:server-addr:localhost:8848management:endpoints:web:exposure:include:'*'ViewCodecontroller加入集合数据充当数据库进行测试@RestControllerpublicclassPaymentController{@ValueprivateStringserverPort;publicstaticHashMapmap=newHashMap();static{map.put;map.put;map.put;}@GetMappingpublicCommonResultpaymentSQL{PayMentpayment=map.get;CommonResultresult=newCommonResult;returnresult;}}ViewCode主启动类还是常规配置注解两个另一个服务提供者配置同上,只需要改一下端口即可。

本篇接上篇的sentinel,主要介绍sentinelResource注解和兜底的方法fallback的各种参数和使用。
1.配置服务提供者集群。

pom文件

springcloud(12)SentinelResource注解配置应用及其他第1张springcloud(12)SentinelResource注解配置应用及其他第2张
<dependencies>
        <!--SpringCloud ailibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bai</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
View Code

yml文件

springcloud(12)SentinelResource注解配置应用及其他第3张springcloud(12)SentinelResource注解配置应用及其他第4张
server:
  port: 9004

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

management:
  endpoints:
    web:
      exposure:
        include: '*'
View Code

controller加入集合数据充当数据库进行测试

springcloud(12)SentinelResource注解配置应用及其他第5张springcloud(12)SentinelResource注解配置应用及其他第6张
@RestController
public class PaymentController { @Value("${server.port}")
privateString serverPort;

    public static HashMap<Long, PayMent > map = new HashMap<>();
    static{
        map.put(1L,new PayMent(1L,"1111"));
        map.put(2L,new PayMent(2L,"2222"));
        map.put(3L,new PayMent(3L,"3333"));
    }

    @GetMapping(value = "/paymentSQL/{id}")
    public CommonResult<PayMent> paymentSQL(@PathVariable("id") Long id) {
        PayMent payment =map.get(id);
        CommonResult<PayMent> result = new CommonResult<>(200,"from mysql,serverPort: " +serverPort,payment);
        returnresult;
    }
}
View Code

主启动类还是常规配置注解两个

另一个服务提供者配置同上,只需要改一下端口即可。

2.消费者配置

pom文件

springcloud(12)SentinelResource注解配置应用及其他第7张springcloud(12)SentinelResource注解配置应用及其他第8张
<dependencies>
        <!--SpringCloud ailibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--SpringCloud ailibaba sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bai</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
View Code

yml文件

springcloud(12)SentinelResource注解配置应用及其他第9张springcloud(12)SentinelResource注解配置应用及其他第10张
server:
  port: 84
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719

#消费者将去访问的微服务名称
server-url:
  nacos-user-service: http://nacos-payment-provider

#激活Sentinel对Feign的支持
feign:
  sentinel:
    enabled: true
View Code

本次采用的有restTemplate所以添加配置类

@Configuration
public classApplicationConfig {
    @Bean
    @LoadBalanced
    publicRestTemplate gettemple(){
        return newRestTemplate();
    }
}

主启动类

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public classConsumer84 {
    public static voidmain(String[] args) {
        SpringApplication.run(Consumer84.class,args);
    }
}

controller

springcloud(12)SentinelResource注解配置应用及其他第11张springcloud(12)SentinelResource注解配置应用及其他第12张
@RestController
@Slf4j
public classCircleBreakerController {
    public static  final  String SERVICE_URL = "http://nacos-payment-provider";
    @Resource
    privateRestTemplate restTemplate;
    
    @RequestMapping("/consumer/fallback/{id}")
//@SentinelResource(value = "fallback")
//@SentinelResource(value = "fallback",fallback ="handlerFallback")
    @SentinelResource(value = "fallback",fallback ="handlerFallback",blockHandler = "blockHandler")
    public CommonResult<PayMent>fallback(@PathVariable Long id) {
        CommonResult<PayMent> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/" + id, CommonResult.class,id);
        //设置特定参数报错,进行降级
        if(id == 4){
            throw new IllegalArgumentException("IllegalArgument ,非法参数异常...");
        }else if(result.getData() == null) {
            throw new NullPointerException("NullPointerException,该ID没有对应记录,空指针异常");
        }
        returnresult;
    }
    publicCommonResult handlerFallback(@PathVariable Long id,Throwable e) {
        PayMent payment = new PayMent(id,"null");
        return new CommonResult(444,"异常handlerFallback,exception内容: " +e.getMessage(), payment);
    }

    publicCommonResult blockHandler(@PathVariable Long id, BlockException e) {
        PayMent payment = new PayMent(id,"null");
        return new CommonResult(444,"blockHandler-sentinel 限流,BlockException: " +e.getMessage(), payment);
    }

    @Resource
    privatePaymentFeign paymentFeign;

    @GetMapping(value = "/consumer/paymentSQL/{id}")
    public CommonResult<PayMent> paymentSQLC(@PathVariable("id") Long id){
        returnpaymentFeign.paymentSQL(id);
    }
}
View Code

创建feign接口

@FeignClient(value ="nacos-payment-provider",fallback = PaymentFallback.class)
public interfacePaymentFeign {
    @GetMapping(value = "/paymentSQL/{id}")
    public CommonResult<PayMent> paymentSQL(@PathVariable("id") Long id);
 }

兜底的fallback

@Component
public class PaymentFallback implementsPaymentFeign{
    @Override
    public CommonResult<PayMent>paymentSQL(Long id) {
        return new CommonResult<>(444,"服务降级返回,---PaymentFallbackService",new PayMent(id,"ErrorSerial"));
    }
}

3.sentenelResource注解参数分析

@SentinelResource(value = "fallback",fallback ="handlerFallback",blockHandler = "blockHandler")
   

其中有两个比较重要的参数,fallback和blockHandler这两个都是兜底的方法,不过处理的情况却不相同。

blockhandler处理的是sentinel工具出现的限制级错误,本身方法自己出现的错误不属于block管,若是方法出现自身的错误等,该报错还是报错。

fallback则是正常的降级策略,方法出现各种报错的信息都会有fallback来兜底。

4.sentinel熔断

从controller中调用的PaymentFeign接口,实现了openfeign的功能,同时也为接口中配置了兜底的fallback方法,所以sentinel的熔断和之前的没有区别,都是一样的配置。

5.规则持久化。

在学习的过程中 可能发现了随着每次重启应用,后台sentinel中的配置规则所有的 都消失了。下面介绍配合nacos进行持久化规则,避免每次重启都进行复制的配置。

之前的sentinel测试项目yml配置datasource进行持久化

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinal-service
  cloud:
    nacos:
      discovery:
        #Nacos服务注册中心地址
        server-addr: localhost:8848
    sentinel:
      transport:
        #配置Sentin dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,假如被占用了会自动从8719端口+1进行扫描,直到找到未被占用的 端口
        port: 8719
      datasource:   #配置流控规则持久化
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
management:
  endpoints:
    web:
      exposure:
        include: '*'

里面的参数在之前的nacos文章中有介绍,其实就是在nacos的配置列表中创建记录的对应信息。

还需要在nacos配置列表中新建想要配置的规则持久化。大致如下。

springcloud(12)SentinelResource注解配置应用及其他第13张

配置的内容参数含义,可以从sentinel的界面用开发者工具进行查看内部名称,决定填写对应的参数名的值。

6.版本冲突

openfeign和sentinel在整合的时候出现的版本问题报错。提供解决方案,推荐选择第二种添加额外的类。

https://blog.csdn.net/qq_29860591/article/details/108139270

本篇所有代码均在GitHub:

https://github.com/MaTsukun/springcloud2020

免责声明:文章转载自《springcloud(12)SentinelResource注解配置应用及其他》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在商城系统中使用设计模式简单工厂模式之在springboot中使用简单工厂模式《深入理解JAVA虚拟机》(一) JVM 结构 + 栈帧 详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

mysql之排序查询

高级文章目录3:排序查询功能:1.按单个字段排序案例1:查询员工信息,要求工资从高到低排序2.为排序添加筛选条件案例1:部门编号˃=90的员工信息,按员工编号降序排序案例2:部门编号˃=90的人员信息,按输入时间排序。按表达式排序案例1:按年薪显示员工信息和年薪4按别名排序案例1按年薪升序查询员工信息5.按函数(长度)排序案例1查询员工姓名并按姓名长度减少...

传奇服务端各文件用途说明

传奇外传服务端├数据库服务器│├联系│├美国联邦储备银行│├日志│├! ID列表。txt(付款帐户列表,在Setup.exe中ServiceMode=TRUE时有效)!服务器信息.txt│├DBServer.exe│└DBSrc.ini├登录门│├登录网关.exe│└配置ini├登录服务器│├Chr日志│├ConLog公司│├计数日志│├国际数据库││├ID...

Nacos开机自启

1.加入玉米片。服务文件vi/lib/systemd/system/nacos.service2.将以下内容写入nacos。服务文件ps:我的nacos路径是/usr/local/nacos[Unit]Description=nacosAfter=network。target[Service]Type=forkingExecStart=/usr/local/...

自定义样式滚动条

自定义IE浏览器滚动条样式追溯浏览器对滚动条的自定义,恐怕最早的就是IE浏览器了。感觉IE浏览器滚动条自定制功能并不是很强,只能控制一样显示各个部分的颜色而已,像宽度,结构等都无法控制,要靠出个性点的滚动条,很难!自定义FireFox浏览器滚动条在网上找了很多关于Firfox自定义浏览器滚动条的方法,发现firefox中却实是不支持的。...

如何从github下载项目的源代码,包含git客户端,直接下载,vs下载

很多小伙伴可能刚刚联系了github。如果他们使用github下载项目,他们将在这里编写一个统一的声明。从各种方式下载源代码,以加深对git的理解。英文描述:Git是一个免费开源的分布式版本控制系统,旨在以快速和高效的方式处理从小型到大型项目的所有事务。例如:在github上下载项目:https://github.com/dathlin/HslCommuni...

Windows事件ID大全

51Windows无法找到网络路径。136系统试图解除未合并驱动器的JOIN。150系统跟踪信息未在CONFIG.SYS文件中指定,或不允许跟踪。151为DosMuxSemWait指定的信号灯事件数量不正确。152DosMuxSemWait没有运行;已设置过多的信号灯。154输入的卷标超过目标文件系统的长度限制。158段已解除锁定。173对于提供取消区域进行...