묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
카프카 도커 오류
강의대로 docker-compose-single-brokey.yml 파일 작성하고 파일 안에 맨 밑에networks: my-network: external: true name: ecommerce-network 이렇게도 작성하고 아래 명령어 그대로 docker-compose -f docker-compose-single-broker.yml up -d 입력했는데 Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets 이런 오류 가 발생합니다..
-
해결됨RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
알림은 왜 pub sub 구조로 설계하나요?
동일한 메시지를 여러 서비스에서 처리하는 것을 pub sub 구조로 이해하였는데요,알림이라는 하나의 서비스에서 처리한다면 pub sub 구조로 설계할 필요가 없는 걸까요?
-
해결됨RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
Receiver를 여러개 하려면 어떻게하나요?
@Bean public SimpleMessageListenerContainer container(ConnectionFactory connectionFactor, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactor); container.setQueueNames(QUEUE_NAME); container.setMessageListener(listenerAdapter); return container; } @Bean public MessageListenerAdapter listenerAdapter(Receiver receiver) { return new MessageListenerAdapter(receiver, "receiveMessage"); // Receiver의 메소드명 }안녕하세요. 좋은 강의해주셔서 감사합니다.만약 하나의 큐에서 여러 컨슈머를 통해 동시에 여러개를 소비하고자한다면 Receiver를 추가해서 새롭게 MessageLisnterAdaper 빈을 추가하는걸까요? 어떤식으로 하는것인지 궁금합니다.여러큐와 거기에 따른 여러 컨슈머 구성시에는 어떤식으로 환경설정하면 될까요? 감사합니다.
-
해결됨RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
깃허브 step11 브랜치
Slack 관련된거 같은데, 강의에는 나와있지 않네요 ! step11은 혼자 공부하면 되는걸까요 ?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
프론트단에 대해
안녕하세요. 궁금한 점이 있어 질문드립니다.추후 스프링 클라우드로 msa 팀프로젝트 만들려고합니다. 프론트단을 만들려고 하면 공통 레이아웃 및 기능화면을 따로 공통 서비스 예를 들면 ui-service를 만들고 이 서비스의 yml에서 게이트웨이를 작성한다고 들었습니다. 이게 제일 효율적인 방법인지 아니면 다른 방법으로 프론트단 구현법이 있는지 알고 싶습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
버전 업데이트 질문
새롭게 마지막 섹션에 updated 된것은 어떻게 봐야하나요 ? 커리큘럼 중간에 deprecated 된것도 있는데, 건너뛰면 되는지 기존에 이것 대신에 updated 된곳에 어떤걸 봐라 라고 설명좀 해주실 수 있나요 ?
-
미해결RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
DLQ 재시도 로직 처리후 DLQ에 unacked 1건이 남는거에 대해서
안녕하세요.예시 학습 중에 DeadLetterQueue 수동 재시도 관련해서 질문있습니다. http 호출 이후에 추가적으로 DLQConsumer가 호출되지는 않는데, 처리 후 RabbitMQ 콘솔 확인해보니 DLQ에 unacked 한 건이 남아 있었습니다. 제 생각에는 DLQConsumer에서 정상적으로 메시지 소비했으면 마찬가지로 ack 처리 해줘야 하는게 아닌가 싶은데, DLQ에 unacked 상태로 남기는게 의도된 경우가 있을수 있는건지 궁금합니다. order_completed_queue에서는 모두 처리되서 메시지가 보이지 않습니다. 예시 코드@Component @RequiredArgsConstructor public class OrderDLQConsumer { private final RabbitTemplate rabbitTemplate; @RabbitListener(queues = RabbitMQConfig.DLQ) public void process(String message) { System.out.println("DLQ Message Received: " + message); try { String fixMessage = "success"; rabbitTemplate.convertAndSend( RabbitMQConfig.ORDER_EXCHANGE, "order.completed.shipping", fixMessage ); System.out.println("DLQ Message Sent: " + fixMessage); } catch (Exception e) { System.err.println("### [DLQ Consumer Error] " + e.getMessage()); } } }
-
해결됨RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
NotificationMessage가 필요한 이유 질문
학습중 궁금한 것은 언제든 문의 하세요.질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다.추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다.Pub-Sub 모델을 이용한 실시간 알림 part2에 질문이 있습니다 ! package com.example.messagequeue.step2.step2; public class NotificationMessage { private final String message; public NotificationMessage() { message = ""; } public NotificationMessage(String message) { this.message = message; } public String getMessage(){ return message; } }짊여기에서 NotificationMessage DTO를 만들어주셧는데, 뭐 때문에 만드신걸까요 ? 직렬화, 역직렬화와 관련이 있는거 같은데, 잘 이해가 안되네요 ㅎㅎ 답변 주시면 감사드리겠습니다 !
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
멀티모듈 질문
혹시 강의에 멀티모듈구조 설정하는 방법이 있을까요 ? 하나의 프로젝트에서 무듈별로 나누는 방법은 제공하지 않겠죠 ?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의 화면이 나오지 않고 소리만 납니다.
섹션1의 'Cloud Native Architecture', 'Cloud Native Application' 강의에서 영상이 나오지 않는데 원래 그런건가요? 아래처럼 까맣게 아무것도 안나오고 소리만 납니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
MSA 개발 배포 방식에 대한 선택과 방향성
안녕하세요! 강의를 마친 후, 여러 가지 궁금한 점이 생겼습니다.지금까지 로컬,및 도커에서 사용한 config-service, apigateway-service, discovery-service(유레카 서버) 의 역할이 Kubernetes 환경에서 대체될 수 있다는 것을 배웠습니다. 구체적으로는:유레카 대체: 각 Pod의 DNS 이름을 사용하여 서비스 간 통신API Gateway 대체: Ingress 리소스를 사용하여 외부 요청을 라우팅(강의엔 없음) Config 서버 대체: RabbitMQ를 통한 busrefresh로 설정 정보를 업데이트하는 대신, Kubernetes의 ConfigMap을 사용하여 설정을 동적으로 업데이트이렇게 Kubernetes에서 많은 기능을 간편하게 처리할 수 있다는 점에 대해 배우면서, 이전의 복잡한 서비스 구조가 생각보다 간단하게 대체될 수 있다는 점에서 약간 허무한 느낌도 듭니다.강의를 마친 후의 궁금증은, 실제 MSA 개발 시에 Kubernetes, Docker, AWS를 사용하는 다양한 배포 방식 중 어떤 선택을 해야 할지에 대한 부분입니다.EC2에 Docker 사용하여 배포EC2에 Kubernetes 사용하여 배포AWS의 EKS, ECS, API Gateway를 사용하는 방법 등 여러가지 방법이 있을텐데요 이와 같은 다양한 옵션 중에서 어떤 방식을 선택 해야하는지 공부의 방향성을 제시해주시면 감사하겠습니다.좋은 강의 감사합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
마지막강의 k8s catalog 404 오류
serivce 오타네여
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
grafana 그래프 nodata
https://www.inflearn.com/community/questions/267420/%EB%8C%80%EC%89%AC%EB%B3%B4%EB%93%9C%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EB%AA%BB%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94%EA%B2%83-%EA%B0%99%EC%8A%B5%EB%8B%88%EB%8B%A4를 참고하여 Legend: {{instance}}Instant 체크 + Fields 입력을 통해 위에 처리량은 잘나오는 모습입니다 하지만밑에 그래프들은 Fields 입력하는 부분이없어서 처리량때 처럼 설정을 할 수 없고 역시나no data로 나오네요설정은 이대로 했습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
route 설정이 동작을 안하는거 같아요.
RouteLocator gatewayRoutes(RouteLocatorBuilder builder)이 메소드를 만들기 위해 implementation 'org.springframework.cloud:spring-cloud-starter-gateway' 이걸로 수정했을 했는데 이후 저 메소드를 주석 처리하고 applicatio.yml을로 설정을 대체 했을 때는 동작을 안하고 implementation 'org.springframework.cloud:spring-cloud-starter-gateway-mvc'mvc로 다시 변경해줘야 올바르게 동작하는데무슨 차이가 있을까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
FeignErrorDecoder 질문
FeignErrorDecoder 에 대해서order_is_empty를 수정한뒤에127.0.0.1:8000/actuator/busrefresh 를 호출하면Keys refreshed [spring.cloud.bootstrap.enabled, order_service.exception.order_is_empty]로그는 정상적으로 뜨며디버깅 모드로 코드를 추가해서 실행한결과List<ResponseOrder> orders= orderServiceClient.getOrders(userId);코드전에env.getProperty("order_service.exception.order_is_empty") 를 확인해본 결과는정상적으로 리프레시되지만 이후에 오류를 터트리고 FeignErrorDecoder 처리 로직에서switch(response.status()){ case 400: break; case 404: if(methodKey.contains("getOrders")){ return new ResponseStatusException(HttpStatus.valueOf(response.status()),env.getProperty("order_service.exception.order_is_empty")); } break; default: return new Exception(response.reason()); }getProperty("order_service.exception.order_is_empty")이부분이 새로운 환경 변수가ErrorDecoder 에서는 반영 안되는것같아서 해결이 안되서 질문남깁니다 ! UserServiceImpl 에서는 정상적으로 바뀐값이 나오는거보면 ErrorDecoder 문제 같은데 정확히 모르겠습니다 @RefreshScope 이것도 해결책은 아닌것같아요 답변 부탁드립니다 !
-
미해결RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
스탭4 질문드립니다
안녕하세요, 스탭4 news 스크립트 코드가 궁금해 질문드립니다.우선 영상처럼 curl -X POST "http://localhost:8080/news/api/publish?newsType=ja"curl -X POST "http://localhost:8080/news/api/publish?newsType=sp"curl -X POST "http://localhost:8080/news/api/publish?newsType=vu"컬로 3번 찌르면 아래 사진과 같이 응답값이 찍히는데요스크립트 부분에서 connect 함수 실행시 현재 선택한 const newsType = document.getElementById("newsType").value; (java선택)값이 java이라subscribeToNews(newsType);이부분에 subscription = stompClient.subscribe(/topic/java, function (message) { alert(message.body); addMessageToDiv(message.body); }); 이렇게 /topic/java만 subscribe 할텐데 어떻게 spring , vue가 나왔는지 궁금합니다.curl 요청 -> restController -> publisher 에서 publishMessage 메서드를 통해 fanout으로 bindingBuilder가 설정된 큐에 send -> 클라이언트(html)에서 stomp를 이용해 구독 로직인것같은데클라이언트(html)에서 /topic/java만 구독한상태에서 다른 vue, spring을 받은지 궁금합니다
-
해결됨RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
생성자 질문드립니다
NotificationMessage모델에 생성자를 추가하는 이유가 Jackson 역직렬화때문에 추가하셨다 했는데 setter만 있으면 필드명과 알아서 바인딩되어서 생성자가 없어도 되는거 아닌가요? 실제로 생성자 삭제하고 message key값으로 /app/send 요청 찌르면 객체에 바인딩이 잘된상태인데 궁금합니다
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
로그인 에러
안녕하세요 강사님! 질문이 있어서 작성합니다.현재 섹션 7까지 수강한 상태입니다.회원가입을 하고 로그인을 시도했는데 회원가입은 정상, 로그인은 에러가 반환됩니다. 1) 섹션 19(165강)에서 WebSecurity 코드로 실행package com.example.user_service.sercurity; import com.example.user_service.service.UserService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authorization.AuthorizationDecision; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.Authentication; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager; import org.springframework.core.env.Environment; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.security.web.util.matcher.IpAddressMatcher; import java.util.function.Supplier; @Configuration @EnableMethodSecurity public class WebSecurity { private final UserService userService; private final BCryptPasswordEncoder bCryptPasswordEncoder; private final Environment env; public static final String ALLOWED_IP_ADDRESS = "127.0.0.1"; public static final String SUBNET = "/32"; public static final IpAddressMatcher ALLOWED_IP_ADDRESS_MATCHER = new IpAddressMatcher(ALLOWED_IP_ADDRESS + SUBNET); public WebSecurity(Environment env, UserService userService, BCryptPasswordEncoder bCryptPasswordEncoder){ this.env = env; this.userService = userService; this.bCryptPasswordEncoder = bCryptPasswordEncoder; } @Bean public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); authenticationManagerBuilder.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder); return authenticationManagerBuilder.build(); } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf((csrf) -> csrf.disable()) .authorizeHttpRequests((authz) -> authz .requestMatchers(new AntPathRequestMatcher("/actuator/**")).permitAll() .requestMatchers(new AntPathRequestMatcher("/h2-console/**")).permitAll() .requestMatchers(new AntPathRequestMatcher("/users", "POST")).permitAll() .requestMatchers(new AntPathRequestMatcher("/welcome")).permitAll() .requestMatchers(new AntPathRequestMatcher("/health_check")).permitAll() .anyRequest().access( new WebExpressionAuthorizationManager( "hasIpAddress('127.0.0.1') or hasIpAddress('192.168.219.119')")) ) .sessionManagement((session) -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .headers((headers) -> headers.frameOptions((frameOptions) -> frameOptions.disable())); return http.build(); } private AuthorizationDecision hasIpAddress(Supplier<Authentication> authentication, RequestAuthorizationContext object){ return new AuthorizationDecision(ALLOWED_IP_ADDRESS_MATCHER.matches(object.getRequest())); } }2) https://github.com/joneconsulting/toy-msa/tree/springboot3.2 에서 'springboot3.2' 브런치의 'WebSecurityNew', 'IpAddressLoggingFilter' 코드로 실행 그리고 IpAddressLoggingFilter 코드에 대한 강의도 있나요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
jwt 검증 로직 질문
강의 예제 코드에서는 user-service 라는 msa 에서 jwt발급 과정에서 user id를 Subject에 설정해서 발급하고이후에 gateway 에서 검증할 때 그냥 subject 만 추출하고 null 이 아니면 그냥 검증되는 식으로작성되어있습니다 그리고 강의에서 bearer 토큰으로 받은 값에서 subject 를 추출해서 그걸 user_id 랑 비교해서 검증하면 된다는 언급이 있습니다 여기서 의문인 건 비교할 실제 db 가 user-service 에있다는 점입니다추후 강의에서 msa 간 통신하여 user-service에 있는 db 에서 userId 가져와서 비교하는 식으로 처리가 되는 걸까요 ?궁금해서 질문 남깁니다.
-
해결됨RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
Pub/Sub & WebSocket 활용한 실시간 알림
SSE & Redis와 Pub/Sub & WebSocket을 비교하고 있는데요.실시간성과 정확성을 위해서라면 Pub/Sub & WebSocket을 더 많이 쓰나요? 알림의 특성상 채팅과 같은 양방향은 아니기 때문에 WebSocket이 적합한 선택인지 궁금합니다.