• Sentinel整合OpenFeign对远程调用限流并降级


    微服务提供者demo-pay

    第一步:创建模块demo-pay添加依赖:

    <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>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    第二步:修改application.yml:

    server:
      port: 8801
      servlet:
        context-path: /pay
    spring:
      application:
        name: nacos-pay
      cloud:
        nacos:
          discovery:
            server-addr: http://localhost:8848  # 配置Nacos地址
    management:
      endpoints:
        web:
          exposure:
            include: '*' # 对外暴露出所有的端点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    第三步:项目主启动类添加注解

    @EnableDiscoveryClient
    
    • 1

    第四步:提供控制器PayController:

    @RestController
    public class PayController {
    
        @GetMapping("/fun/{id}")
        public String fun(@PathVariable("id") Long id) {
            System.out.println("1111111111111111");
            return "支付 id: " + id;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    微服务消费者demo-sentinel-openfeign

    第一步:创建模块demo-sentinel-openfeign并添加依赖:

    <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>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>
    
    
    <!--避免出现警告信息:Spring Cloud LoadBalancer is currently working with the default cache. You can switch to using Caffeine cache, by adding it and org.springframework.cache.caffeine.CaffeineCacheManager to the classpath.-->
    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>3.1.1</version>
    </dependency>
    <!--  nacos自从2020版本之后不再整合的是Netflix,也就没有ribbon了 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        <version>3.0.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>3.0.1</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    第二步:修改application.yml

    server:
      port: 6601
      servlet:
        context-path: /sentinelfeign
    
    spring:
      application:
        name: sentinel-feign
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 # 配置nacos地址
        sentinel:
          transport:
            # 配置sentinel dashboard地址
            dashboard: localhost:8080
            # 默认端口8719,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
            port: 8719
    
    management:
      endpoints:
        web:
          exposure:
            include: '*' #暴露出所有的端点
    # 激活SentinelFeign的支持
    feign:
      sentinel:
        enabled: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    第三步:在项目主启动类上添加注解:

    @EnableFeignClients
    @EnableDiscoveryClient
    
    • 1
    • 2

    第四步:创建Feign接口:

    @Service
    //name:指定调用Rest接口所对应的服务名
    //path:指定要调用的Rest接口所在的Controller指定的RequestMapping,如果Rest接口所在的Controller没有指定RequestMapping,则不用指定
    @FeignClient(name = "nacos-pay", path = "/pay", fallback = PayFeignServiceFallback.class)
    public interface PayFeignService {
        @GetMapping("/fun/{id}")
        public String fun(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    第五步:创建兜底类:

    @Component
    public class PayFeignServiceFallback implements PayFeignService {
        @Override
        public String fun(Long id) {
            return "兜底 服务降级: " + id;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第六步:创建测试Controller

    @RestController
    public class DemoCtroller {
        @Resource
        private PayFeignService payFeignService;
    
        @GetMapping("/fun1")
        public String fun1(Long a) {
            String res = payFeignService.fun(a);
            return "fun1 "+res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试:

    第一步:依次启动软件Nacos和Sentinel,然后再分别启动项目demo-pay和demo-sentinel-openfeign。

    第二步:结果:
    在这里插入图片描述

    添加流控规则:
    在这里插入图片描述

    在这里插入图片描述

    请求消费者中的示例控制器中的api接口:
    低频访问:
    在这里插入图片描述

    高频访问:

    在这里插入图片描述

  • 相关阅读:
    【软考】系统集成项目管理工程师(三)信息系统集成专业技术知识③
    矩阵中移动的最大次数
    安卓数据恢复工具哪个强? 10 个最佳 Android 数据恢复应用程序
    dgb调试
    【Android笔记19】Android中的事件处理(监听和回调事件)
    spring hibernate jpa redis mq等温故知新
    【公众号开发】访问第三方接口应用于开发 · 回复图文消息
    Java安全之Mojarra JSF反序列化
    elementUI textarea可自适应文本高度的文本域
    MySQL的指令大全和注意事项(强烈推荐收藏)
  • 原文地址:https://blog.csdn.net/lianghecai52171314/article/details/127316509