Versions Compared

Key

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

...

Dept44 erbjuder en möjlighet att addera “circuit-breakers” och health“health-indicators indicators” på en resurs (t.ex. en integrationsklient). Dept44 använder sig av Resilience4j för detta syfte. Detta ramverk möjliggör att addera mycket mer funktionalitet än vad som beskrivs här. T.ex. RateLimiter, TimeLimiter, Retry, osv. För ytterligare info hänvisas till dokumentationen av Resilience4j. I detta avsnitt beskrivs enbart funktionalitet kopplad till Circuit breakers och health-indicatorss.k. “circuit-breakers” och “health-indicators”.

Genom att lägga till en Circuit breaker “circuit-breaker” på en resurs får man automatiskt även en health indicator. Denna health indicator exponeras per autmatik under sökvägen “/actuator/health” för tjänsten och kan plockas upp av t.“health-indicator”. Dessa går hand i hand och återspeglar varandras status. Om en “circuit-breaker” öppnas kommer således motsvarande “health-indicator” att rapportera “DOWN”. Den “health-indicator” som skapas kommer att per automatik exponeras under sökvägen “/actuator/health” och kan plockas upp av t.ex. Spring boot admin om tjänsten anslutit sig mot en sådan server.

Komma igång

Börja med att annotera din resurs, . Resursen brukar vanligtvis var t.ex. en integrationsklient, databas-klient, etc.:

...


Ovanstående är allt som krävs för att att skapa en “Circuit breaker” som bryter kretsen om resursen kastar exceptionsen exception. Kretsen kommer vid dessa tillfällen att hållas öppen under en kort tidsperiod (default 60 sekunder), innan den övergår till ett “halvöppet läge”, där den tillåter . I det “halv-öppna” läget tillåts ett konfigurerbart antal anrop för att utvärdera resursens status. Under tiden som kretsen hålls öppen kommer den automatiskt registrerade health-indicatorn att visa “DOWN” för denna resurs. När resursen åter fungerar bra kommer kretsen att stängas helt och health“health-indicatorn indicatorn” visar “UP”.

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 följande inställningar från av alla standardinställningar som erbjuds av Resilience4j.

Exempel på inställningar i application.properties:

Code Block
languagejson
resilience4j.circuitbreaker.instances.MyFeignClient.ignoreExceptions=se.sundsvall.dept44.exception.ClientProblem,javax.validation.ConstraintViolationException            [default: ej satt]
resilience4j.circuitbreaker.instances.MyFeignClient.failureRateThreshold=60                                      [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: 50]
resilience4j.circuitbreaker.instances.MyFeignClient.waitDurationInOpenState=200s                                                                                          [default: 60strue]
resilience4j.circuitbreaker.instances.MyFeignClient.allowHealthIndicatorToFail=false         slidingWindowSize=20                                                                             [default: true]
resilience4j.circuitbreaker.instances.MyFeignClient.slidingWindowSize=20                                                           [default: 10]
resilience4j.circuitbreaker.instances.MyFeignClient.permittedNumberOfCallsInHalfOpenState=10                                     [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 t.ex. vara bra att låter 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“health-indicator 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“health-indicator:ss”. M.a.o. om en health“health-indicator indicator” är “DOWN” så blir applicationens health också “DOWN”, om denna property är 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 circuitbreakers “circuit-breakers” som måste tilldelas andra värden än default (, för att slippa upprepningar).

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" ]
}

...