묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨장애 없는 서비스를 만들기 위한 Resilience4j - CircuitBreaker
slow call 관련 옵션을 무시할 수 있나요?
slow call 관련 옵션 설정이 필수인 것 같은데 해당 옵션은 무시하도록 설정하는 방법이 있나요?외부 api 호출 구간에서 500 에러가 발생할 때만 서킷 동작하게 하고 싶은데 옵션을 끄는 기능은 따로 제공이 되지 않은 것 같습니다. api 호출 시 어차피 지연되면 read time out, connection time out 등이 발생하면서 500에러를 내려 줄 거라 slow 옵션은 무시하고 싶은데 따로 방법이 있을까요? 제가 못 찾는 것일 수도 있지만 slow call exceed 이벤트가 발생할 때 일어나는 exception 이 따로 있는 것 같지 않아 ignoreException 으로 등록하는 것도 어려운 것 같습니다. 혹시 방법이 있는지 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
gateway 예외처리
안녕하세요!강사님 강의를 듣고 msa 적용하는 프로젝트를 진행중인데, 프로젝트 controller단 전역에서 발생하는 예외를 처리하고 싶어 @@RestControllerAdvice를 활용하려고 생각중입니다.msa에서 예외를 전역으로 처리하려면 gateway에서 @RestControllerAdvice를 활용해야 될까요? 아니면 각각의 마이크로서비스마다 @RestControllerAdvice를 활용해야 될까요?둘중 어떤 설계가 더 효율적일지 답변주시면 감사하겠습니다🙏🙏
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
spring boot 3 버젼애선, grafana Spring Cloud Gateway가 값을 못읽어옵니다.
https://grafana.com/grafana/dashboards/11506-spring-cloud-gateway/내용: Spring Cloud Gateway Dashboard provided by: https://github.com/spring-cloud/spring-cloud-gatewayA Gateway built on Spring Framework 5.x and Spring Boot 2.x providing routing and morespirng boot 3 이상이신 분들은 참고 바랍니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
springboote 3 관련 : zipkin 관련 로그에 traceId, spanid가 안나오는 문제가 있습니다.
안녕하세요강의에서는 zipkin 명령어창에서 실행시 접속로그가 나오며, orderservice에 주문 요청시traceid,spanid가 나오지만,저의 경우에는 zipkin 설치시 sl4fj 바인딩 오류가 있더라고요.혹시 이 사항이 orderservice에서 로그와 관련된 문제인지 아니면 gradle 설정에 관한 부분인지 어떤 부분을 확인해봐야 될까요?혹은 스프링부트 3.0버젼부터 되지 않는 부분인가요? *gradle 의존성 설정은 강의와 똑같습니다. **아래는 zipkin설치시 sl4fj 관련된 내용 입니다!SLF4J(W): No SLF4J providers were found.SLF4J(W): Defaulting to no-operation (NOP) logger implementationSLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.SLF4J(W): Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.SLF4J(W): Ignoring binding found at [jar:nested:/C:/Users/son/zipkin.jar/!BOOT-INF/lib/log4j-slf4j-impl-2.21.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J(W): See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
오타발생 관련 카프카 특정 레코드 삭제가 윈도우 기반에서는 가능한가요?
안녕하세요! 강의 잘 보고 있습니다. topic에 입력시,오타가 있는 스크립트를 입력했는데,해당 오타가 있는 레코드가 지속적으로 남아 있더군요,또한 이로 인해 jsonParser 오류가 발생해서,topic을 삭제할까 하다가, 윈도우 기반에서는 오류가 발생할 수 있다고 (https://www.inflearn.com/questions/644825)하여, topic의 오타가 있는 레코드를 삭제하고자 합니다. 혹시 방법이 있을까요??
-
미해결Java 마이크로서비스(MSA) 프로젝트 실습
여전히 타겟을 찾을 수 없습니다..
강의와 같은 버전으로 모두 같게 진행하지 않아서 그런지..windows 타겟을 찾을 수가 없습니다.전에 AI가 알려준 건 도움이 되질 않았어요분명 prometheus 타겟은 잡힌 것으로 봐서는 app 폴더 내부로 들어가서 prometheus.yml 파일도 잘 읽은 것 같은데요..왜 그대ㅑ로 아래에 job_name이 windows인 것은 왜 설정이 안 되는지 모르겠습니다..
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka connect status - tasks가 빈 배열
안녕하세요,kafka source connect 등록할 때 mariadb가 연결이 잘 안되서 h2 db로 진행을 했습니다.등록 후 kafka connect status를 보면 tasks가 빈 배열로 나오네요,,CLI에서는 마지막에 tables were not found라고 나오는데 테이블이 있는데도 없다고 하는데 혹시 이런 증상 해결하신 분 계실까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
예외처리시 포스트맨에 출력안되는 문제
안녕하세요 ! 강사님좋은 강의 잘 보고 있습니다.Feign의 예외처리에서 강의와 다른부분이 발생하여 질문 남깁니다. FeignErrorDecoder를 통해 예외 처리시 .[user-service] [-auto-1-exec-10] .w.s.m.a.ResponseStatusExceptionResolver : Resolved [org.springframework.web.server.ResponseStatusException: 404 NOT_FOUND "사용자의 주문이 비었습니다"] 위 로그가 user-service에서 error catch를 통해 잘 나오는 것을 확인했습니다.(09:36)강의영상에서는 404 Error를 전달하여 포스트맨 응답에서 Error msg까지 출력이 되었지만, 저의 경우에선 APIGatgeway에서의 로그및 포스트맨응답에Global Filter End : response id -> 403 FORBIDDEN으로 응답이 보내집니다. 이전 강의 부분(정상 응답)에서 해당 문제가 없었지만, 에러 응답시 403응답으로 처리되어지는 부분에 대해서 추가적으로 ApiGateWay에 대해서 github에서는 따로 handling이 없어서 추가적으로 handler를 등록하여 적용되어야하는 부분인지 여쭤봅니다 .++해당부분 user-service의 WebSecurity특정 ip 통과부분에 실제 ip(자신의 ip)를 누락하였네요.Error에 대한 부분도 응답이 됩니다.추가적으로 error에 대해서 403으로 응답이 되는부분은https://colabear754.tistory.com/182해당글을 참고하시면 될것같습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Filter의 로그가 출력되지 않습니다.
gateway에 의해서 api는 정상적으로 호출이 되는데 로그가 출력되지 않습니다.customFilter, globalFilter 모두 출력이 되지 않았습니다. 코드에 혹시 누락된 부분이 있을까요.Global Filterpackage com.example.springgateway.filter; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @Component @Slf4j public class GlobalFilter extends AbstractGatewayFilterFactory<GlobalFilter.Config> { public GlobalFilter() { super(Config.class); } @Override public GatewayFilter apply(Config config) { // Custom Pre Filter return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); log.info("Global Filter baseMessage : {}", config.getBaesMessage()); if (config.isPreLogger()) { log.info("Global Filter Start : request id -> {}", request.getId()); } else { log.info("preLogger is false"); } // Custom Post Filter return chain.filter(exchange).then(Mono.fromRunnable(()-> { if (config.isPostLogger()) { log.info("Global Filter End : request id -> {}", response.getStatusCode()); } else { log.info("postLogger is false"); } })); }; } @Data public static class Config { //put the configuration properties private String baesMessage; private boolean preLogger; private boolean postLogger; } } application.ymlspring: application: name: gateway-service cloud: gateway: routes: - id: first-service uri: http://localhost:8081/ predicates: - Path=/first-service/** filters: - CustomFilter - id: second-service uri: http://localhost:8082/ predicates: - Path=/second-service/** filters: - CustomFilter # - AddRequestHeader=second-request, second-request-header2 # - AddResponseHeader=second-response, second-response-header2 - id: user-service uri: http://localhost:8083/ predicates: - Path=/user-service/** filters: - CustomFilter # filters: # - AddRequestHeader=user-request, user-request-header2 # - AddResponseHeader=user-response, user-response-header2 - id: catalog-service uri: lb://CATALOG-SERVICE predicates: - Path=/catalog-service/** - id: order-service uri: lb://ORDER-SERVICE predicates: - Path=/order-service/** default-filters: - name: GlobalFilter args: baseMessage: Spring Cloud Gateway Global Filter preLogger: true postLogger: true eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka server: port: 8000 Filter Configpackage com.example.springgateway.config; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; //@Configuration public class FilterConfig { // @Bean public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.path("/user-service/**") .filters(f -> f.addRequestHeader("user-request", "user-request-header") .addResponseHeader("user-response", "user-response-header")) .uri("http://localhost:8083/")) .route(r -> r.path("/second-service/**") .filters(f -> f.addRequestHeader("second-request", "second-request-header") .addResponseHeader("second-response", "second-response-header")) .uri("http://localhost:8082/")) .build(); } } Postman 실행 결과
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
spring config bus에 actuator 안쓰는거같은데 설치하는 이유있나요?
궁금힌ㅂ니다
-
미해결Java 마이크로서비스(MSA) 프로젝트 실습
wmi exporter - prometheus 연동 실패
prometheus 와 WMI exporter 연동이 왜 안되는지 모르겠습니다.global: scrap_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "windows" static_configs: - targets: ["192.168.0.101:9182"]위와같이 제 pc의 ip를 192.168.0.101로 설정했습니다.cmd창에서 확인한 것입니다.PS D:\study-workspace\springBoot-workspace\iron-msa> ipconfig Windows IP 구성 이더넷 어댑터 vEthernet (Default Switch): 연결별 DNS 접미사. . . . : 링크-로컬 IPv6 주소 . . . . : fe80::2609:80c8:ea62:2e07%31 IPv4 주소 . . . . . . . . . : 192.168.16.1 서브넷 마스크 . . . . . . . : 255.255.240.0 기본 게이트웨이 . . . . . . : 이더넷 어댑터 이더넷: 연결별 DNS 접미사. . . . : 링크-로컬 IPv6 주소 . . . . : fe80::f3d1:5994:1b9d:5bf8%9 IPv4 주소 . . . . . . . . . : 192.168.0.101 서브넷 마스크 . . . . . . . : 255.255.255.0 기본 게이트웨이 . . . . . . : 192.168.0.1 연결별 DNS 접미사. . . . : 이더넷 어댑터 vEthernet (WSL): 연결별 DNS 접미사. . . . : 링크-로컬 IPv6 주소 . . . . : fe80::a35b:8530:2f6d:4eb9%38 IPv4 주소 . . . . . . . . . : 172.18.0.1 서브넷 마스크 . . . . . . . : 255.255.240.0 기본 게이트웨이 . . . . . . : 아래는 혹시 ip를 잘못지정한 것일까봐 확인한 것입니다.도와주실 수 있나요
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka producer/consumer test
해당 예제를 통해 주키퍼를 먼저 실행을 해볼려하지만 계속해서 해당 classpath를 찾지 못하고 있습니다. 비슷한 상황을 겪은 사람들의 경우 바이너리 파일이 아닌 소스 파일을 다운 받아 해당 문제를 겪었다고 했지만 저의 경우 알맞은 파일을 설치하여 압축을 해제하였는데 어떤게 원인일까요
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
안녕하세요 싱크 커넥터로 DB에 적용이 안되어 질문드리게 되었습니다.
좋은강의 잘듣고있습니다! 다름아니라 현재 싱크 커넥터등록후 DB에 데이터가 등록되지 않고 있습니다.먼저 아래사진처럼 post요청을 통해 커넥터 등록을 하였습니다.토픽은 예제를 똑같이 따라하였을 때도 안되었어서 my-topic-orders로 새로 바꿔서 등록하였습니다.이에 맞게 테이블도 아래 사진처럼 생성하였습니다. post요청을 한 후 주문이 해당 토픽으로 전달했음에도 아래 사진처럼 DB에 적용이 되지않아 어디가 문제일지 커뮤니티를 뒤져도 잘모르겠어서 질문드립니다 ㅠㅠ (토픽도 "my_topic_orders"로 지정하였습니다.)현재 커넥터 등록상태입니다.추가로 kafka confluent에서 발생한 로그입니다
-
해결됨장애 없는 서비스를 만들기 위한 Resilience4j - CircuitBreaker
n 대의 서버간 서킷 브레이커의 상태를 동기화 시키려면 어떻게 해야 될까요?
가상의 상황외부 연동의 책임을 가진 external-interface 서버기상청에서 제공하는 api 로부터 오늘의 날씨 를 가져올 수 있습니다.n 대로 스케일 아웃 될 수 있습니다.현재 구성은 각 서버별로 독립적으로 서킷 브레이커를 관리하고 있습니다.ex)기상청 api 장애 상황에서1번 서버로 요청이 집중되어 1번 서버는 open 되었지만2번 서버는 요청이 별로 들어오지 않아 아직 close 상태일 수 있습니다.이 때 n 대의 서버간 서킷 브레이커의 상황을 필수적으로 공유해야 된다면 어떻게 할 것 인가? 생각하는 안redis pub/sub 기능을 통해 구현한다.1번 서버는 외부 연동 실패로 서킷브레이커가 open 되었다.1번 서버는 onStateTransition 의 로직으로 open 상태를 redis 에 pub 한다.2번 서버는 sub 하여 자신의 상태를 open 으로 동기화 한다.하지만 우려되는 맹점이 있습니다.pub, sub 방식은 서버간 동기화의 간극이 있습니다.결과적 일관성은 보장될지 언정 이 간극은 또 다른 이슈를 유발할 수 있습니다.ex)1번 서버는 open 상태를 pub 했습니다.2번 서버는 open 상태를 pub 했습니다. (1번 서버의 open 을 sub 하기 전에)1번 서버는 close 상태가 되었지만 (외부 연동이 정상적으로 복구되었음에도 불구하고)2번 서버에서 pub 한 open 정보에 의해 자신을 open 상태로 변경하였습니다. 동기화의 간극으로 인해 서로의 open 상태를 공유하는 것이 무한히 반복 됩니다.물론 실제 실패로의 event 만 pub/sub 하고,redis 의 상태 공유는 pub/sub 하지 않으면 될 것 같기도 합니다.하지만 가능/불가능 여부를 떠나 여전히 위험할 것 같다는 직감이 듭니다.redisson 과 같은 공유락까지도 생각을 해보았는데, 배보다 배꼽이 큰 것 같다는 생각이 듭니다.그외만약 actuator api 호출을 통해 명시적인 변경을 하고 싶다면실무라면 대표 도메인에 elb 나 ingress 등을 설정할 것 입니다.그러면 n 대의 서버에 상태 변경 명령을 어떻게하면 api 로 보낼 수 있나요?혹시 이건 아예 불가능한 생각일까요?사실 실무라면 굳이 서버간 서킷 브레이커의 상태를 공유하지 않을 것 같습니다.장애 상황이 자주 발생하지도 않을 것이거니와서킷 브레이커 발동을 위한 window 크기를 충분히 작게 설정한다면회복을 방해할 정도의 트래픽이 더 들어가지는 않을 것이라고 생각하기 때문 입니다.오히려 이런 공유 로직으로 인해 복잡도만 높아질 것이라고 생각해서 입니다. 하지만 실무를 떠나 기술적인 방법은 무엇이 있을까 인사이트가 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
유저서비스의 yml파일 관련 profile 설정방법이 궁금합니다.
안녕하세요 강의를 듣던중 profile이 어떻게 적용되는지 궁금하여 질문드리게 되었습니다. 현재 dev관련 설정파일이 왼쪽공통 항목 테스트를 위한 application.yml 파일이 오른쪽입니다.모두 같은 common이라는 환경변수로 어떤 .yml파일의 값을 사용하는지 확인하였는데요user-service의profile설정은 아래 사진처럼 하였습니다.health-check를 보내서 common값을 확인했을 때,아래사진 처럼 application.yml파일의 common값을 사용하는 것을 확인하였습니다. 공통으로 가져오는 application.yml파일의 common값과 ecommerce-dev.yml의 common값이 겹칠 때 profile을 dev라 설정했기 때문에health-check로 요청시common값에 common-dev 로 찍힐것이라 생각했었습니다. 혹시 common-dev로 안찍히는 이유가 공통으로 가져오는 application.yml값과 환경변수가 겹친다면 공통으로 가져오는 yml파일의 환경변수로 찍히는 것인지 제가 profile설정을 잘못한 것인지 궁금해 질문드렸습니다 ㅠㅠ
-
해결됨EDA 기반 Microservice 구현 (with Hexagonal, DDD)
domain.model.event에 정의되는 객체들에 대한 질문이 있습니다
MSA강의 재밌게 잘 보고 있습니다 👏 강의를 보던 중 카프카 연동을 위해 kafkaadapter와 event 패키지를 정의하고 객체들을 넣고있는데, 저희 회사에서도 겪고 있는 문제가 떠올라서 궁금한게 생겼는데, 프로듀싱하는 서비스와, 컨슘하는 서비스의 프로토콜을 ItemReturned, ItemRented등으로 정의하고 내부 값에서IDName등을 사용한다고 할 때 이 프로토콜 스펙이 변경될 때마다 각 팀별로 객체 정보를 수정한다고 하면, 마치 서비스내에 코드 중복들이 된 상태에서 기능이 변경될때마다 중복된 코드들을 같이 관리하며 싱크를 맞춰줘야하는 작업들과 유사해보이는데, 이에 대해서는 어떻게 풀어나가야 하나요? 즉, 서비스간에 데이터 송수신을 위한 객체들이 중복코드처럼 보이는데 스펙변경이 있을때마다 각 서비스마다 직접 코드 수정을 하는건 한 팀에서 수정을 누락하거나 관리를 놓친 프로젝트에서 수정이 누락되면 문제가 될 수 있을 것 같은데 어떤식으로 풀어나가는지 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
method patch 설정시 404에러
- id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** - Method=PATCH filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment} - AuthorizationHeaderFilter 이렇게 작성했는데요@postmapping("/user/test")@patchmapping("/user/test")포스트는 잘동작하는데 패치는 404가 납니다뭐가 문제일까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
ReWritePath필터의 세그먼트 식은 정규식일까요??
안녕하세요 선생님!강의를 잘 듣던 와중에 궁금증이 생겨 질문 드립니다. 게이트 웨이에 설정한 필터 중,요청 uri를 재정의 하기 위해서 RewritePath 라는 필터를 사용하잖아요. 이때 /user-service/(?<segment>.*), /$\{segment}는 정규식인가요??... 정규식표현에 segment라는 것이 찾아봐도 나오지 않아서요!!
-
해결됨Microservice 내부 아키텍처 와 EventStorming 설계
VO 관련 궁금한점
VO Money 에서 add(money:Money) 함수에 대해서 궁금합니다.VO는 불변인데 Money를 초기화 해서 값을 재할당 하는건지 어떤식으로 이해하면 좋을지 궁금합니다.
-
해결됨Java 마이크로서비스(MSA) 프로젝트 실습
스케일업 개념 관련 질문드려요
안녕하세요! 강의 잘 보고있습니다.이번 강의에서 블루그린배포 개념을 설명해주시며 스케일 업에 대해 알려주셨는데요! 제가 공부했던 얕은 지식을 떠올려보면,스케일 업은 기존 서버의 사양 등을 업그레이드해 시스템을 확장 (수직적)스케일 아웃은 서버를 여러대 추가하여 시스템을 확장 - 로드밸런싱 동반 (수평적)라고 배웠던 것 같은데.. 아무튼, 질문의 요점은 블루 그린 배포는 여러 대의 서버가 있는 스케일 아웃 방식에서 무중단 배포가 가능한 배포 모델이 아니라, 스케일 업 방식인가요?? 감사합니다!