분류 전체보기
-
io.kubernetes.client.openapi.ApiException configmaps is forbiddenDevOps/Kubernetes 2024. 4. 8. 17:53
io.kubernetes.client.openapi.ApiException: Message: HTTP response code: 403 HTTP response body: { "kind":"Status", "apiVersion":"v1", "metadata":{}, "status":"Failure", "message":"configmaps is forbidden: User \"system:serviceaccount:default:default\" cannot list resource \"configmaps\" in API group \"\" in the namespace \"default\"", "reason":"Forbidden", "details":{"kind":"configmaps"}, "code"..
-
Reactor Resilience4J CircuitBreaker 알아보기카테고리 없음 2023. 8. 22. 17:53
CircuitBreaker 필요한 이유 : Circuit Breaker 는 누전차단기로 전류를 차단하는 장치를 의미한다. 누전 차단기의 역할로 사고가 발생하기 이전에 전류를 차단하여 사고를 미리 방지하는것과 같이 문제가 있는 마이크로서비스간의 트래픽을 차단하여 해당 서비스로 인한 전체 장애를 방지한다. 최소요청 횟수 몇 회 이후 통계건수 기반으로 몇건을 평가했을때, 실패율이 얼마정도 되는지에 따라 CircuitBreaker가 Open 되고 이 Open 되는 시간의 지속시간을 얼만큼 유지할 것인지 등의 설정이 가능하다. 서킷브레이커 동작원리 : Consumer와 Producer 사이에 Circuit Breaker 을 두고 통신하며 Circuit Breaker는 아래의 그림과 같은 3가지 상태를 가진다. C..
-
스프링 배치 반복 및 오류 제어Spring/Spring Boot 2022. 3. 30. 23:39
Repeat 스프링 배치에서 반복을 종료할 것인지 여부를 결정하는 세가지 항목 1. RepeatStatus 스프링 배치의 처리가 끝났는지 판별 위한 열거형 CONTINUABLE, FINISEHD 2. CompletionPolicy 정상 종료를 알리는데 사용. RepeatTemplate 의 iterate 메서드 안에서 반복을 중단할지 결정 3. ExceptionHandler 비정상 종료를 알림. RepeatCallback 안에서 예외 발생시 해당 핸들러를 참조해서 예외를 다시 던질지 여부 결정 RepeatContext - 일시적으로 사용할 필요가 있는 데이터를 저장 tasklet 을 수행하다가 예외가 발생했다고 가정하자. 이 때 ExceptionHandler를 설정했다면 반복여부를 결정 할 수 있다. 설정..
-
SubscribeOn , PublishOnSpring/Spring 2021. 12. 23. 10:28
1. SubscribeOn 와 PublishOn이 혼용된 코드 1.1. Code 1 2 3 4 5 6 Flux.range(1,5) .publishOn(Schedulers.newSingle("pub1")) .map(i -> i * 10) .subscribeOn(Schedulers.newSingle("sub1")) .log() .subscribe(); cs subscribeOn 이후에 log() 를 봐보자. 어떤 쓰레드에서 log() 가 실행될까? 리엑터 공식 문서를 보면 subscribeOn을 호출한 객체를 구독할 때는 해당 스트림 전체가 해당 스케쥴러로 다 바뀐다고 하였다. 따라서 "sub1" 이라는 쓰레드에서 실행이 될까? 아니면 그 위에 publishOn에 의해 "pub1" 이라는 쓰레드에서 실행 될..
-
스프링 트랜잭션 전파Spring/Spring Boot 2021. 11. 9. 23:59
트랜잭션이 이미 진행중인데, 여기에 추가로 트랜잭션을 수행하면 어떻게 될까? 기존 트랜잭션과 별도의 트랜잭션을 진행해야 할까? 아니면 기존 트랜잭션을 그대로 이어 받아서 트랜잭션을 수행해야 할까? 이런 경우 어떻게 동작할지 결정하는 것을 트랜잭션 전파(propagation)라 한다. 참고로 스프링은 다양한 트랜잭션 전파 옵션을 제공한다. 1. 외부 트랜잭션이 수행중인데, 내부 트랜잭션이 추가로 수행됨 - 기본 전파 옵션인 REQUIRED 기준 스프링에서는 이 경우 외부 트랜잭션과 내부 트랜잭션을 묶어서 하나의 트랜잭션을 만들어준다. 내부 트랜잭션이 외부 트랜잭션에 참여하는 것이며 이것이 기본 동작이고 옵션을 통해 다른 동작방식도 선택할 수 있다. 스프링은 논리 트랜잭션과 물리 트랜잭션이라는 개념을 나눈다..
-
스프링 @Transaction 이해Spring/Spring Boot 2021. 10. 29. 12:10
스프링의 트랜잭션 우리는 선언적 트랜잭션 관리를 주로 사용하는데 @Transactional` 애노테이션 하나만 선언해서 매우 편리하게 트랜잭션을 적용하는 것을 선언적 트랜잭션 관리라 하며 스프링 부트로 개발한다면 주로 이 어노테이션 방법으로 개발하게 된다. @Transaction 애노테이션을 선언한다면 스프링의 트랜잭션 AOP는 이 애노테이션을 인식해서 트랜잭션을 처리하는 프록시를 적용해준다. 구체적으로 @Transactional`애노테이션이 특정 클래스나 메서드에 하나라도 있으면 트랜잭션 AOP는 cglib 기반의 프록시 클래스를 만들어서 스프링 컨테이너에 등록한다. 따라서 실제 객체 대신에 프록시인 {클래스}$$CGLIB 을 스프링 빈으로 등록한다. 그리고 프록시는 내부에 실제 객체를 참조하게 된다...
-
clusterRole, clusterRoleBindingDevOps/Kubernetes 2021. 10. 29. 08:59
롤과 롤바인딩은 네임스페이스가 지정된 리소스로, 하나의 네임스페이스상에 상주하며 해당 네임스페이스의 리소스에 적용된다는 것을 의미한다. 일반 롤은 롤이 위치하고 있는 동일한 네임스페이스의 리소스에만 액세스할 수 있다. 다른 네임스페이스의 리소스에 누군가가 액세스 할 수 있게 하려면 해당 네임스페이스마다 롤과 롤바인딩을 만들어야 한다. 클러스터 수준 리소스에 액세스 권한을 부여하려면 클러스터롤바인딩과 클러스터롤을 사용해야 한다. 예를 들어 어떤 리소스들은 전혀 네임스페이스를 지정하지 않는데 노드, 퍼시스턴트 볼륨 등이 있다. 클러스터 롤은 네임스페이스가 지정되지 않은 리소스나 리소스가 아닌 URL에 액세스를 허용하는 클러스터 수준의 리소스로 각 네임스페이스에 동일한 롤을 재정의할 필요 없이 개별 네임스페이..
-
[springboot, kotlin] 배포시 FileReader FileNotFoundExceptionSpring/Spring Boot 2021. 9. 28. 01:17
FileReader("src/main/resources/templates/$fileName.yaml") .readText() 로컬에서는 파일 경로를 읽어와서 잘 읽지만 쿠버네티스 파드에 JAR 패키징으로 실행한 어플리케이션 안에서는 FileNotFoundException이 발견되었다. 실행할 때 jar 로 패키징해서 실행하였다면 InputStream을 써서 읽어야 한다. File로 읽을 수 있는건 자바 메인으로 실행했을 때 파일 경로로 읽을 수 있는것이고 JAR 안에 들이었는 리소스를 클래스패스로 접근해서 읽을 때는 파일시스템에 있는 파일이 아니라 JAR 안에 있는 파일이기 때문이다. javaClass.getResourceAsStream("/data/$fileName") ?.bufferedReader(..