当前位置:   article > 正文

nacos+sentinel+openfeign实现流控Demo_openfeign demo

openfeign demo

需求

使用nacos进行服务的注册与发现
使用openfeign进行服务间的调用
使用sentinel进行消费者服务的流量控制
大体逻辑:

  • 两个服务,一个comsumer,一个provider,浏览器访问consumer的/echo地址,consumer内部通过feign访问provider的/echo拿到处理结果,返回给浏览器
  • 同时定义一个流量超过限制的/echo

项目结构图

在这里插入图片描述

Sentinel控制台准备

到github release下载sentinel dashboard 的jar包,在自己电脑cmd启动起来然后最小化即可

java -Dserver.port=8718 -jar sentinel-dashboard-1.8.0.jar
  • 1

nacos准备

网上搜一下吧,云服务器记得开8848,9848,9849端口

根模块内容

pom.xml

spring boot 2.3.3.RELEASE
spring-cloud-dependencies Hoxton.SR9
spring-cloud-alibaba-dependencies 2.2.6.RELEASE
  • 1
  • 2
  • 3
  • 注意boot于cloud的版本兼容问题,不然会报错Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationPropertiesBeans' defined in class path resource
  • dependencies是要写在dependencyManagement里的,而不是dependencies里,dependencyManagement的作用是版本管理,它下面的不会被maven自动导入,在根模块添加了这个dependencyManagement,子模块里使用它下面的包时,就不用管它的版本了,可以观察consumer和provider的pom文件

consumer

pom.xml

<dependencies>
        <!-- OpenFeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- 注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- Sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

spring-cloud-starter-openfeign是由spring-cloud-dependencies进行版本管理的,下面nacos注册和sentinel的版本由spring-cloud-alibaba-dependencies管理

bootstrap.yml

注意不能是application.yml

server:
  port: 9200
spring:
  application:
    # 应用名称
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: nacos服务器IP:8848
    sentinel:
      transport:
        dashboard: localhost:8718
feign:
  sentinel:
    enabled: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

到时候就直接访问localhost:9200就是consumer

RemoteService

@FeignClient(value = "nacos-provider", fallback = RemoteServiceFallback.class)
public interface RemoteService
{
    @GetMapping(value = "/echo")
    String echo();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

RemoteServiceFallback

用在上面@FeignClient的fallback中,当sentinel发现流量超过后面自己设置的流控规则后,就会让feign走这个fallback

@Service
public class RemoteServiceFallback implements RemoteService
{
    @Override
    public String echo()
    {
        return "系统繁忙,请稍后";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

ConsumerController

@RestController
public class ConsumerController
{
    @Resource
    private RemoteService remoteService;

    @GetMapping(value = "/echo")
    public String echo() {
        return remoteService.echo();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

启动程序

加两个注解

//使用注册中心
@EnableDiscoveryClient
//获取注册中心的接口
@EnableFeignClients
  • 1
  • 2
  • 3
  • 4

Provider

pom.xml

<dependencies>
        <!-- 注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

bootstrap.yml

server:
  port: 9201
spring:
  application:
    # 应用名称
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: nacos服务器IP:8848
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

ProviderController

@RestController
public class ProviderController
{
    @GetMapping("/echo")
    public String echo() {
        System.out.println("有一个请求");
        return "来自Provider Demo";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

启动程序

@EnableDiscoveryClient
  • 1

测试

  1. localhost:9200/echo疯狂刷新,每次都得到
    在这里插入图片描述
  2. http://localhost:8718,账号密码sentinel,看到通过QPS,没有拒绝QPS在这里插入图片描述
  3. 添加流控规则,注意资源名为GET:http://nacos-provider/echo,修改一个阈值为2保存即可在这里插入图片描述
  4. 然后再回去狂刷新,就会看到有时提示在这里插入图片描述
  5. 实时监控也监控到了在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/889218
推荐阅读
相关标签
  

闽ICP备14008679号