alibaba / Sentinel

A powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件)
https://sentinelguard.io/
Apache License 2.0
22.32k stars 8k forks source link

No bean named 'sentinel-json-gw-flow-converter' available #1719

Closed yosamaru closed 4 years ago

yosamaru commented 4 years ago

sentinel+gateway+nacos集成如果rule-type为gw-flow报错如下,但是当ruleType为flow,没有错误展示,但在sentinel获取不到规则,gateway使用actuator/gateway/routes,获取规则正常。 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kassadin-gateway-sentinel-nacos-datasource': Cannot resolve reference to bean 'sentinel-json-gw-flow-converter' while setting bean property 'converter'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sentinel-json-gw-flow-converter' available 配置如下:

server.port=8201 spring.application.name=kassadin-gateway spring.cloud.gateway.discovery.locator.enabled=true spring.cloud.gateway.discovery.locator.lower-case-service-id=true spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.cloud.nacos.config.group=${kassadin.gateway.dynamicRoute.group} spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.file-extension=json spring.cloud.sentinel.transport.dashboard=localhost:8858 spring.cloud.sentinel.transport.port=8721 spring.cloud.sentinel.transport.client-ip=localhost spring.cloud.sentinel.transport.clientIp=localhost spring.cloud.sentinel.eager=true spring.cloud.sentinel.datasource.kassadin-gateway.nacos.server-addr=localhost:8848 spring.cloud.sentinel.datasource.kassadin-gateway.nacos.dataId=${spring.application.name}-flow-rules spring.cloud.sentinel.datasource.kassadin-gateway.nacos.groupId=SENTINEL_GROUP spring.cloud.sentinel.datasource.kassadin-gateway.nacos.data-type=json spring.cloud.sentinel.datasource.kassadin-gateway.nacos.rule-type=gw-flow kassadin.gateway.dynamicRoute.enabled=true kassadin.gateway.dynamicRoute.dataType=nacos kassadin.gateway.dynamicRoute.dataId=FIRE_ROUTES kassadin.gateway.dynamicRoute.group=FIRE_WALK 版本: nacos-client:1.2.1 sentinel:1.7

sczyh30 commented 4 years ago

Could you provide your dependencies?

yosamaru commented 4 years ago
2.2.1.RELEASE Hoxton.SR8 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-alibaba-sentinel com.alibaba.csp sentinel-datasource-nacos com.alibaba.csp sentinel-spring-cloud-gateway-adapter org.springframework.cloud spring-cloud-starter-gateway
yosamaru commented 4 years ago

lack dependency for alibaba-sentinel-gateway

icesugar commented 3 years ago

我也遇到这个问题了flow可以从nacos读取规则,gw-flow就提示 No bean named 'sentinel-json-gw-flow-converter' available,但是我引入了sentinel-spring-cloud-gateway-adapter的

环境如下: spring-cloud-alibaba-dependencies.version>2.2.1.RELEASE spring-boot-dependencies.version>2.2.9.RELEASE spring-cloud-dependencies.version>Hoxton.SR7

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
spring.cloud.sentinel:
      datasource:
        ds1:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            data-id: sentinel-gw-flow
            group-id: DEFAULT_GROUP
            ruleType: gw-flow
rainy0714 commented 3 years ago

请问大神们,这个问题解决了没有,我也遇到了同样的问题,导致网关规则没法持久化

rainy0714 commented 3 years ago

sentinel: transport: dashboard: localhost:8888 datasource:

流控规则

    flow:
      nacos:
        serverAddr: 127.0.0.1:8848
        dataId: ${spring.application.name}-flow-rules
        groupId: SENTINEL_GROUP
        # 规则类型,取值见:org.springframework.cloud.alibaba.sentinel.datasource.RuleType
        ruleType: flow
    # 降级规则
    degrade:
      nacos:
        serverAddr: 127.0.0.1:8848
        dataId: ${spring.application.name}-degrade-rules
        groupId: SENTINEL_GROUP
        ruleType: degrade
    # 系统规则
    system:
      nacos:
        serverAddr: 127.0.0.1:8848
        dataId: ${spring.application.name}-system-rules
        groupId: SENTINEL_GROUP
        ruleType: system
    # 授权规则
    authority:
      nacos:
        serverAddr: 127.0.0.1:8848
        dataId: ${spring.application.name}-authority-rules
        groupId: SENTINEL_GROUP
        ruleType: authority
    # 热点规则
    param-flow:
      nacos:
        serverAddr: 127.0.0.1:8848
        dataId: ${spring.application.name}-param-flow-rules
        groupId: SENTINEL_GROUP
        ruleType: param-flow
    gw-flow:
      nacos:
        serverAddr: 127.0.0.1:8848
        dataId: ${spring.application.name}-gateway-flow-rules
        groupId: SENTINEL_GROUP
        ruleType: gw-flow

其他的规则都没有问题,就是加了这个gw-flow,微服务启动就报下面的错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gw-flow-sentinel-nacos-datasource': Cannot resolve reference to bean 'sentinel-json-gw-flow-converter' while setting bean property 'converter'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sentinel-json-gw-flow-converter' available at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1697) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1442) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at com.alibaba.cloud.sentinel.custom.SentinelDataSourceHandler.registerBean(SentinelDataSourceHandler.java:203) ~[spring-cloud-starter-alibaba-sentinel-2.2.3.RELEASE.jar:2.2.3.RELEASE] at com.alibaba.cloud.sentinel.custom.SentinelDataSourceHandler.lambda$afterSingletonsInstantiated$0(SentinelDataSourceHandler.java:93) ~[spring-cloud-starter-alibaba-sentinel-2.2.3.RELEASE.jar:2.2.3.RELEASE] at java.util.TreeMap.forEach(TreeMap.java:1005) ~[na:1.8.0_261] at com.alibaba.cloud.sentinel.custom.SentinelDataSourceHandler.afterSingletonsInstantiated(SentinelDataSourceHandler.java:80) ~[spring-cloud-starter-alibaba-sentinel-2.2.3.RELEASE.jar:2.2.3.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:914) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:62) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.4.RELEASE.jar:2.3.4.RELEASE] at com.example.demo.ApiGatewaySentinelNacosPersistenceApplication.main(ApiGatewaySentinelNacosPersistenceApplication.java:10) ~[classes/:na] Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sentinel-json-gw-flow-converter' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:816) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1288) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:277) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] ... 24 common frames omitted

我的微服务依赖如下:

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

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>0.9.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>0.9.0.RELEASE</version>
    </dependency>

    <!-- 该依赖提供sentinel对SpringCloud gateway的适配 -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
                    <version>1.8.0</version>
    </dependency>

    <!-- 没添加该依赖的话不能从application配置文件配置sentinel -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
                    <version>2.2.3.RELEASE</version>
    </dependency>

    <!-- 连接sentinel控制台 客户端是通过transport模块与控制台进行通讯的 -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-transport-simple-http</artifactId>
                    <version>1.8.0</version>
    </dependency>

    <!-- 用nacos实现sentinel规则持久化 -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
                    <version>1.8.0</version>
    </dependency>
rainy0714 commented 3 years ago

兄弟们,我这个问题解决了,去掉那个sentinel-spring-cloud-gateway-adapter 然后换成这个依赖:spring-cloud-alibaba-sentinel-gateway,添加这个就再也不报错了