Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Vill man anpassa detta beteende för att t.ex. ändra kretsens öppettid, vilka exceptions som skall ignoreras, osv, kan man använda sig av alla standardinställningar som erbjuds av Resilience4j.

Exempel på inställningar i application.properties:

Code Block
languagejsontext
resilience4j.circuitbreaker.instances.MyFeignClient.ignoreExceptions=se.sundsvall.dept44.exception.ClientProblem                   [default: ej satt]
resilience4j.circuitbreaker.instances.MyFeignClient.failureRateThreshold=60                                                        [default: 50]
resilience4j.circuitbreaker.instances.MyFeignClient.waitDurationInOpenState=200s                                                   [default: 60s]
resilience4j.circuitbreaker.instances.MyFeignClient.allowHealthIndicatorToFail=false                                               [default: true]
resilience4j.circuitbreaker.instances.MyFeignClient.slidingWindowSize=20                                                           [default: 10]
resilience4j.circuitbreaker.instances.MyFeignClient.permittedNumberOfCallsInHalfOpenState=10                                       [default: 5]

resilience4j.circuitbreaker.configs.mySharedConfig.baseConfig=default
resilience4j.circuitbreaker.configs.mySharedConfig.slidingWindowSize=50
resilience4j.circuitbreaker.instances.MyOtherFeignClient.baseConfig=mySharedConfig

[1] Låter resursen “MyFeignClient” ignorera en lista av Exceptions. Kastas dessa fel markeras anropet som “successful”. Kan Det torde t.ex. vara bra önskvärt att låter låta fel i HTTP-400 serien ignoreras (dessa betyder ju inte att integrationen har problem).)
[2] Tröskelvärde för antal fel (inom slidingWindowSize) som skall öppna kretsen och markera “health-indicator” som “DOWN”. Anges i procent.
[3] Den tid som kretsen hålls öppen innan den övergår till ett “halv-öppet” läge.
[4] Låter applicationens “health” återspeglas av enskilda “health-indicator:s”. M.a.o. om en “health-indicator” är “DOWN” så blir applicationens health också “DOWN”, om denna property är truesatt till “true”.
[5] Storleken på den buffer som används för att spara och utvärdera resultatet på anropen när kretsen är sluten.
[6] Antal tillåtna anrop som tillåts när kretsen är “halv-öppen”.
[8] Skapar en egen konfigurationsprofil (mySharedConfig) som “ärver” från default (definierad i dept44).
[9] Skriver över default-värden för en property i mySharedConfig
[10] Sätter aktuella värden i konfigurationsprofilen till en resurs (myOtherSharedConfig). Denna mekanism (d.v.s. rad: 8, 9, 10) är bra om man t.ex. har flera “circuit-breakers” som måste tilldelas andra värden än default, för att slippa upprepningar.

Ingorerade exceptions

Det är viktigt att ha i åtanke att en “circuit-breaker” reagaerar på alla typer av exceptions som inte är exkluderade via propertyn ignoreExceptions. Av den anledningen är det viktigt att särskilja på exceptions som beror på rena indata-fel (som inte betyder att resursen har problem) och på de exceptions som tyder på att tjänsten har problem.

I den Feign-klient som erbjuds av dept44 har två nya subklasser av “Zalando Problem” införts:
se.sundsvall.dept44.exception.ClientProblem: Kastas när Feign-klienten tar emot ett svar med HTTP-status i 400-serien. Dessa brukar vanligtvis bero på fel orsakade av felaktiga parametrar och betyder vanligtvis inte att tjänsten ligger nere.
se.sundsvall.dept44.exception.ServerProblem: Kastas när Feign-klienten tar emot ett svar med HTTP-status i 500-serien. Dessa brukar vanligtvis bero på att tjänsten har problem.


Använder man nämnda Feign-klient kan det alltså vara bra att ignorera exceptions av typen se.sundsvall.dept44.exception.ClientProblem (se exempel ovan). Gör man inte detta bör man tillse att man har en egen mekanism på plats för att uppnå samma sak. Annars kommer kretsen att bryta för t.ex. enkla “HTTP-400 Bad request”-fel, vilket sannolikt inte är önskvärt.


Viktiga endpoints

Path

Beskrivning

Exempel

/actuator/health

Här visas alla health-indicators och deras aktuella status (hälsovärde).

Code Block
languagejson
{
  "status" : "UP",
  "components" : {
    "circuitBreakers" : {
      "status" : "UP",
      "details" : {
        "MyFeignClient" : {
          "status" : "UP",
          "details" : {
            "failureRate" : "-1.0%",
            "failureRateThreshold" : "50.0%",
            "slowCallRate" : "-1.0%",
            "slowCallRateThreshold" : "100.0%",
            "bufferedCalls" : 1,
            "slowCalls" : 0,
            "slowFailedCalls" : 0,
            "failedCalls" : 1,
            "notPermittedCalls" : 0,
            "state" : "CLOSED"
          }
        }
      }
    }
  }
}

/actuator/circuitbreakerevents

De senaste [n] resultaten av anrop som övervakas av en CircuitBreaker.

Storleken på event-buffern sätts via attributet “eventConsumerBufferSize”. Default är 100 poster per circuit-breaker.

Denna endpoint kan vara bra att använda när man vill se orsaken till att en krets öppnats och en health-indicator rapporterar “DOWN”.

Code Block
languagejson
{
  "circuitBreakerEvents" : [ {
    "circuitBreakerName" : "MyFeignClient",
    "type" : "ERROR",
    "creationTime" : "2022-06-14T10:45:00.967115+02:00[Europe/Stockholm]",
    "errorMessage" : "javax.validation.Exception: test.uuid: not a valid UUID",
    "durationInMs" : 16
  }, {
    "circuitBreakerName" : "MyFeignClient",
    "type" : "IGNORED_ERROR",
    "creationTime" : "2022-06-14T10:46:08.104328300+02:00[Europe/Stockholm]",
    "errorMessage" : "about:blank{502, Bad Gateway, POB error: {detail=, status=401 Unauthorized, title=Authorization has been denied for this request.}}",
    "durationInMs" : 289
  } ] 
}

/actuator/circuitbreakers

Listar alla registrerade circuitbreakers i applikationen.

Code Block
languagejson
{
  "circuitBreakers" : [ "MyFeignClient", "MyOtherFeignClient" ]
}

...