apache / shenyu

Apache ShenYu is a Java native API Gateway for service proxy, protocol conversion and API governance.
https://shenyu.apache.org/
Apache License 2.0
8.43k stars 2.93k forks source link

[BUG] fallbackUri is only valid for APIs in `shenyu-bootstrap` in `Resilience4J` plugin. #2937

Closed hgaol closed 2 years ago

hgaol commented 2 years ago

Is there an existing issue for this?

Current Behavior

When setting the fallbackUri to APIs not in shenyu-bootstrap, like https://example.com, it will not redirect to the target endpint. As well as for other registered APIs like APIs in http-example module. e.g.

image

will return 404.

image

Expected Behavior

redirect to the fallbackUri as set in admin. like https://example.com.

Steps To Reproduce

  1. go to admin, enable resilience4j, and set proper config. below is an example.

    image
  2. call an API which will return 400 status.

  3. after calling many times, it will trigger circuit breaker and return 404.

    image

Environment

ShenYu version(s): current master branch (2.4.3-SNAPSHOT)

Debug logs

2022-02-25 13:00:54 [boundedElastic-1] WARN  org.apache.shenyu.common.utils.JsonUtils - write to json string error: org.apache.shenyu.plugin.api.result.DefaultShenyuEntity@6de86571
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Direct self-reference leading to cycle (through reference chain: org.apache.shenyu.plugin.api.result.DefaultShenyuEntity["data"]->org.springframework.web.server.ResponseStatusException["mostSpecificCause"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:944)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:721)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:4094)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3404)
    at org.apache.shenyu.common.utils.JsonUtils.toJson(JsonUtils.java:85)
    at org.apache.shenyu.plugin.api.result.ShenyuResult.format(ShenyuResult.java:58)
    at org.apache.shenyu.plugin.api.utils.WebFluxResultUtils.result(WebFluxResultUtils.java:58)
    at org.apache.shenyu.web.handler.GlobalErrorHandler.handle(GlobalErrorHandler.java:59)
    at org.springframework.web.server.handler.ExceptionHandlingWebHandler.lambda$handle$0(ExceptionHandlingWebHandler.java:77)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:88)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:100)
    at reactor.core.publisher.Operators.error(Operators.java:182)
    at reactor.core.publisher.MonoError.subscribe(MonoError.java:52)
    at reactor.core.publisher.Mono.subscribe(Mono.java:4105)

Anything else?

Related code.

https://github.com/apache/incubator-shenyu/blob/2603db2df10448c836933e7711a5c4daae28d087/shenyu-plugin/shenyu-plugin-resilience4j/src/main/java/org/apache/shenyu/plugin/resilience4j/executor/Executor.java#L64

If it's a bug, I can fix it. Thanks~

hgaol commented 2 years ago

Don't know if it's a bug, just submitted a PR. If it's not a bug, please ignore the PR and let me know. 😄

yu199195 commented 2 years ago

now, only fallback to shenyu. Not an outside service.

if you can support outside service, pls pull request.