묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
질문이 하나 있습니다
api gate way 서버에서 refresh를 해도 모든 서버에 다 적용이 되는건가요 ? 가령 ecommerce.yml파일에서 토큰 정보를 바꿨는데 api gate way 서버 api로 refresh를 해도 유저 서비스에 token도 바뀌는 건가요? 강의에서는 그렇게 나오긴했는데 맞는지 확시히 잘 몰라서 질문드립니다
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
actuator/refresh 호출 시 오류 문의
안녕하세요. POSTMAN에서 POST방식으로 호출하는 경우, ConfigService쪽에 아래와 같은 오류가 발생합니다. 잘못 입력한 부분이 있는지 확인 부탁 드립니다. 1. user-service yml spring: application: name: user-service cloud: config: name: ecommerce config: import: optional:configserver:http://127.0.0.1:88882. config-service yml server: port: 8888spring: application: name: config-service cloud: config: server: git: uri: file://D:\\Projects\\intelliJ\\git-local-repo 3. 오류로그 org.springframework.cloud.config.server.environment.NoSuchLabelException: No such label: main at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:314) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.getLocations(JGitEnvironmentRepository.java:262) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.getLocations(MultipleJGitEnvironmentRepository.java:139) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository.findOne(AbstractScmEnvironmentRepository.java:55) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOneFromCandidate(MultipleJGitEnvironmentRepository.java:188) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOne(MultipleJGitEnvironmentRepository.java:173) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository.findOne(CompositeEnvironmentRepository.java:64) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentEncryptorEnvironmentRepository.findOne(EnvironmentEncryptorEnvironmentRepository.java:61) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentController.getEnvironment(EnvironmentController.java:134) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentController.defaultLabelIncludeOrigin(EnvironmentController.java:116) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na] at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.3.21.jar:5.3.21] at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:485) ~[spring-cloud-context-3.1.3.jar:3.1.3] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.cloud.config.server.environment.EnvironmentController$$EnhancerBySpringCGLIB$$dc31df60.defaultLabelIncludeOrigin(<generated>) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.21.jar:5.3.21] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.64.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.21.jar:5.3.21] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.64.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]Caused by: org.eclipse.jgit.api.errors.RefNotFoundException: Ref main cannot be resolved at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:223) ~[org.eclipse.jgit-5.12.0.202106070339-r.jar:5.12.0.202106070339-r] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.checkout(JGitEnvironmentRepository.java:468) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:307) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] ... 65 common frames omitted
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Gateway와 eureka 개념
안녕하세요 강사님 강의 진짜 잘 듣고 있습니다! 설명 너무나 잘 해주시는데, 제가 이해 한걸 확인 좀 하고 싶어서 질문 합니다. spring MSA가 유레카서버(eureak server)에서 각 모듈(eureka client)들의 API 주소를 등록 하고, 클라이언트에서 gateway(eureka client)를 통해 들어오면 gateway에서 각 API를 호출 하는 형식인가요?
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
client 설정 안되시는 분들은 이렇게 해보세요!
spring: application: name: user-service cloud: config: name: ecommerce config: import: optional:configserver:http://localhost:8888 application.yml 버전업이 되면서 boostrap.yml을 작성하는게 레거시가 되버렸네요... 그냥 application.yml에서 작업해도 될 것 같습니다
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
rabbitMQ 도커 기동 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. rabbitMQ 도커 기동 관련해서 질문드립니다. 도커로 rabbitMQ를 기동하면서 기존에 사용하던 포트번호를 그대로 사용하는거 같은데, 현재 로컬 PC에선 기존에 설치했던 rabbitMQ가 돌아가면서 해당 포트를 사용하고 있는거 같습니다. (컴퓨터 부팅 후 따로 설정하지 않아도 15672 포트로 웹 관리 콘솔에 접근이 되더라구요) 이러한 부분에 관해 설정을 따로 하거나 로컬의 rabbitMQ를 삭제하지 않아도 문제가 없을까요? (추가적으로 MQ를 설치하면서 함께 설치했던 erlang을 로컬에서 삭제해도 도커에선 문제없이 작동하는지도 궁금합니다)
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Event Sourcing 관련
안녕하세요. 강의 내용중에 Event Driven Architecture 파트 설명중에 Commit Trancation에서는 상태값을 두어 하나의 트랜잭션에 여러 Row가 기록되지 않는데, 다음에 설명하는 Event Sourcing 파트에서는 데이터의 마지막 상태만 저장하는 것이 아닌, 해당 데이터에 수행된 전체 이력을 기록한다고 설명하고 있습니다. 이 부분이 헷갈리는데, 데이터를 관리하는 방식이 서로 다른데 (그 외 Saga pattern 등) 상황에 맞게 쓰면 된다는것인가요? Event Driven Architecture라는 큰 개념이 있고 그 하위?에는 Event Sourcing, Saga pattern 등 다양항 방법이 있다고 생각하고 있는데 잘못 이해한것일까요? 감사합니다.
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Gateway 관련 질문이ㅛ
실습 따라서 하다가 문득 궁금해서 질문남깁니다. 이전 강의에서 말씀하셨는지 찾기어려워서 .. Cloud Gateway 애플리케이션을 Eureka Server에 등록하는 이유가 뭔가요? 인스턴스로 등록할 각 서비스들만 구독 시켜둬도 운영은 가능한게 아닌가요..? 직접 해보니fetch-registry, register-with-eureka 를 false 로 해도 되기는 하더라구요. 따로 적어둔거를 봤는데 fetch-registry, register-with-eureka 를 true로 하는 것이 유레카 서버로 부터 갱신된 인스턴스 정보들을 받기 위함이라고 적어두긴했는데 맞는건가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
KafkaProducer와 OrderProducer 차이
안녕하세요. Producer 구조 관련해서 문의드립니다. 어디선가 이해를 못하고 있는건지... order-service에서 catalogs-service 호출할때 KafkaProducer를 만들어서 send할때 그냥 topic, orderDto만 jsonString 형식으로 보냈는데 왜 OrderProducer에서는 스키마, 필드 등 형식을 만들어서 send하는지요? 둘다 Topic에 전달하는건 같고... 차이점은 다른 서비스에 전송(catalogs-service)하냐 자신(order-service)에게 전송하냐 차이가 보이는데 결국 Topic에 전송하는거라.. 같은게 아닌가 합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
maven이 아니라 gradle로 진행중이신 분들
```// maven 기준 > mvn spring-boot:run \ -Dspring-boot.run.jvmArguments='-Dserver-port=9003' // gradle 기준 (4.9 이상)> ./gradlew bootRun --args='--server.port=9003' // java jar 기준 > java -jar "-Dserver.port=9003" ./user-service.jar // 참고: gradle로 jar 만들려면.. > ./gradlew build //실행후 project의 최상단 디렉토리/build/libs에서 jar확인// gradle로 boot 실행하기> ./gradlew bootRun```알아서 잘 하시리라 생각되지만 조금이라도 시간절약이 되실까하여 올려봅니다
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
API Gateway와 웹 서버 차이
안녕하세요. API Gateway 공부하면서 간단한 질문이 있어 이렇게 올립니다. 라우팅 처리나 필터 처리하는 것이 웹서버의 역할과 크게 다르지 않아 보이는데 API Gateway와 웹서버(apache, nginx... ) 차이점이 어떻게 되는지 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
리버스 프록시와 차이점이 뭘까요?
아직 이것저것 공부중인 학생입니다. 오늘 어쩌다 리버스 프록시란 단어를 듣게되어 찾아보았는데 이곳에서 설명하는 gateway service가 리버스 프록시의 역할을 하는 거 같은데 맞는건가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
sink connect 생성시 fail 발생문제
WorkerSinkTask{id=my-sink-connect3-0} Task threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerTask) org.apache.kafka.connect.errors.ConnectException: Tolerance exceeded in error handler at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:178) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execute(RetryWithToleranceOperator.java:104) at org.apache.kafka.connect.runtime.WorkerSinkTask.convertAndTransformRecord(WorkerSinkTask.java:495) at org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:472) at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:328) at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:232) at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:204) at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:185) at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:235) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.apache.kafka.connect.errors.DataException: JsonConverter with schemas.enable requires "schema" and "payload" fields and may not contain additional fields. If you are trying to deserialize plain JSON data, set schemas.enable=false in your converter configuration. at org.apache.kafka.connect.json.JsonConverter.toConnectData(JsonConverter.java:370) at org.apache.kafka.connect.storage.Converter.toConnectData(Converter.java:87) at org.apache.kafka.connect.runtime.WorkerSinkTask.lambda$convertAndTransformRecord$1(WorkerSinkTask.java:495) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndRetry(RetryWithToleranceOperator.java:128) at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:162) ... 13 more [2022-03-06 11:22:24,134] ERROR WorkerSinkTask{id=my-sink-connect3-0} Task is being killed and will not recover until manually restarted (org.apache.kafka.connect.runtime.WorkerTask) sink connect 생성시 위와 같은오류가 발생합니다. 구글링 하여 connect-standalone 파일의 설정을 false로 하여도 동일하게 오류 발생하고 해결을 못하고 있습니다. key.converter.schemas.enable=false value.converter.schemas.enable=false
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
python flask를 eureka client로 등록
안녕하세요 강사님 현재 저는 python과 flask를 이용하여 간단한 마이크로서비스를 만들고 이것을 Spring cloud eureka에 client로 등록하는 것을 시도하고 있습니다. eureka client에 등록하는 것은 성공한 것처럼 보이는데 api gateway를 이용해서 해당서비스를 test하려고 하면 gateway에서 다음과 같은 에러가 발생합니다. ex: java.net.UnknownHostException: failed to resolve 'DESKTOP-3G0PNOT.mshome.net' after 2 queries 구글링을 많이 해봤는데 sidecar를 이용하라는 조언도 있고 prefer-ip-address: true 항목을 추가하라고 해서 해봤는데 소용이 없습니다.. 무엇이 문제인지, 제가 무엇을 놓치고 있는 것인지 알려주실 수 있나요..? 아래의 사진은 유레카화면과 제가 간단하게 만든 python 마이크로서비스(?) 코드입니다,,
-
미해결실전! 스프링 데이터 JPA
MSA 환경에서 쿼리는 어떻게 하는게 좋을까요?
안녕하세요 강사님! 커리큘럼에서 스프링 데이터 JPA까지 들었습니다.강의내용에서나 커뮤니티 답글에 종종 MSA 관련 설명도 들었는데요.강의 들으면서 최적화와 관련된 내용을 많이 봤는데 이런 MSA 환경에선 어떻게 해결하셨는지 궁금해 질문 남깁니다. 서비스 구성은 예를들면 이렇습니다. Member: 멤버만 관리하는 서비스Order: 주문 정보 관리하는 서비스admin: 관리자용 서비스 서비스별 DB는 분리되어있습니다. Member DB : Member(id,name) Order DB : Order(id, memberId, title) // memberId는 다른 db의 pk이므로 fk는 없습니다. 관리자용 서비스에서 멤버별 주문횟수와 최근 주문 제목을 리스트로 보여주려 합니다.페이징이 있는 리스트이며 멤버이름 또는 주문 제목 또는 둘다(통합검색)으로 검색,정렬 할 수 있습니다. 만약 모놀리틱 서비스인 경우에는 pageable을 request로 받아서 spring data jpa를 활용하여 repository에서 Page 객체를 반환하는 기능과 JPQL이나 QueryDSL로 페이징과 검색을 해결 할 수 있을것 같은데요 MSA에서는 DB가 분리되어있다보니 어떻게 해결할지 고민입니다. 제가 생각한 방법은 3가지정도가 있는데요. 1. member 정보들을 member db에 쌓지만 각 db(주문, 배송 등)에 따로 또 쌓고(주문에서 사용되는 멤버만) 이벤트 드리븐 아키텍쳐 등으로 동기화한 뒤 jpql, querydsl 사용한다. 2. 엘라스틱 서치 등을 사용한 검색용 서비스를 만든다. (하지만 큰 기능이 아니라면??) 3. Order서비스에서 Member 서비스에 이름으로 검색 요청을 한 뒤 결과로 id값들을 받아서 Order 서비스에서 쿼리를 만들어 사용한다. (이름 검색이 아닐경우에는 Order 서비스에서 검색한 뒤 나온 id값들을 Member서비스에 요청해 매핑한다.) 어떤 방법이 정석적인 방법일까요?? 요청이 많지 않은 admin 서비스는 3번으로 데이터가 많아 통합 검색이 필효한 서비스는 2번으로 요청이 많지만 데이터는 많지 않은 서비스는 ?? 으로 생각하고 있는데 괜찮은 방법일까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
secretkey의 용도, 토큰의 위,변조 검증, userId검증로직 질문드립니다.
강사님 안녕하세요. 좋은 강의 잘 듣고 있습니다. 강의 중 궁금점이 생겨 질문드립니다. 1. secret key의 용도 강의 중 언급해주신 jwt.io 사이트에서는 secret key값 없이 token을 복호화 할 수 있음을 확인했습니다. 즉, 데이터(payload)의 검증 과정에서는 secret key가 필요하지 않아도 가능하다.로 받아들여지는데요.. 그렇다면 secret key의 용도는 token에 내포된 데이터(payload)를 보호하기 위함이 아니라, "application내에서 복호화가 가능한 token인지 확인하는 용도" 가 맞을까요 ?? 2. 토큰의 위변조 검증 다른 질문을 참조하였을 때, 토큰의 위변조 확인 위해 request header의 userId와 token에서 얻은 userId를 비교하는 방법을 취했다고 이해하였습니다. 하지만 jwt.io에서 sercret key 없이도 userId를 얻을 수 있기 때문에 위,변조에 있어 취약하지 않을까? 라는 생각이 듭니다.. 실제 상용되는 서비스라면, token의 위,변조를 일반적으로 어떻게 검증하는지 궁금합니다.. ! 3. userId의 검증 강의에서 요구하신 userId를 검증하는 로직을 추가한다고 하면. 아래와 같이 작성하면 될까요 ? 위,변조 검증을 위한 조건을 "request header에 userId 필드가 존재해야 한다"로 가정하고 코드를 작성해보았습니다. 1. header에서 userId 필드를 검증하고, userId를 추출하여 isJwtValid를 호출할 때 인자로 함께 전달. 2. expire date를 검증 3. token에서 추출한 userId와 header의 userId를 비교 이런 식으로 진행하는게 강의에서 구현하라고 의도하신 바가 맞을까요 ??
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
비교적 최신 버전에서 에러가 발생합니다.
에러 내용을 자세하게 이해하진 못했지만 사용중인 임베디드 톰캣 버전에서 `hasIpAddress` 를 찾지 못하는 것 같습니다.스프링 버전은 2.6.2 사용중이고, starter-security 그대로 사용하고 있습니다. `hasIpAddress` 대신 다른 메서드를 사용하면 가능은 한데 의도한 것과 다른 것 같아서 남깁니다. java.lang.UnsupportedOperationException: public abstract java.lang.String javax.servlet.ServletRequest.getRemoteAddr() is not supported at org.springframework.security.web.FilterInvocation$UnsupportedOperationExceptionInvocationHandler.invoke(FilterInvocation.java:326) ~[spring-security-web-5.6.1.jar:5.6.1] at com.sun.proxy.$Proxy150.getRemoteAddr(Unknown Source) ~[na:na] at javax.servlet.ServletRequestWrapper.getRemoteAddr(ServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.56.jar:4.0.FR] at org.springframework.security.web.util.matcher.IpAddressMatcher.matches(IpAddressMatcher.java:65) ~[spring-security-web-5.6.1.jar:5.6.1]
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
서비스 디스커버리 관련 질문입니다.
안녕하세요. 수업 잘 듣고있습니다. 서비스 디스커버리 관련 질문인데요, 스프링 유레카를 클라우드에 올릴때, 1개의 서버(팟)에만 올려야 하는지요? 여러개의 팟에 올려서 등록된 인스턴스가 공유가 가능한건가요? 서버1개에서만 유레카가 돌면 서비스디스커버리 자체의 트래픽이 높아져, 혹은 커넥션이 꽉차 장애가 나는경우가 있지 않을까 해서요. 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
java.lang.NoClassDefFoundError: Could not initialize class javax.xml.bind.DatatypeConverterImpl 에러 대처법
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. private boolean isJwtValid(String jwt) { boolean returnValue = true; String subject = null; try { subject = Jwts.parser().setSigningKey(env.getProperty("token.secret")) .parseClaimsJws(jwt).getBody() .getSubject(); }catch (Exception ex){ returnValue = false; } if(subject==null || subject.isEmpty()){ returnValue = false; } return returnValue;} 이부분에서 디버깅을 따라가던중 getBody() 메서드에서 오류가 발생하는것을 발견 하였습니다. java.lang.NoClassDefFoundError: Could not initialize class javax.xml.bind.DatatypeConverterImpl 이러한 오류가 발생하였을때 pom.xml에 <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.1</version> </dependency> 해당 종속성을 추가해주게 되면 해결됩니다. 혹시 저같은 오류가 발생하신 분들에게 도움이 되었으면 좋겠습니다~! 음 뒷강의에서.... 바로 추가해주시는군요 ...ㅎㄷㄷ....
-
해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Api Gateway와 Service Discovery의 차이가 무엇인가요?
ServiceDiscovery layer 없이 Api gateway가 Instance A, B, C로 직접 호출할 수도 있을 것 같은 생각이 드는데요, Api gateway와 각 인스턴스들 사이에 ServiceDiscovery가 있어야하는 이유가 무엇인가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
무한 대기 설정 질문드립니다.
안녕하세요. 강의를 보고 따로 책으로 학습중인데 책 내용에 서비스에서 서비스 끼리 호출할때 timeout 설정을 하지 않으면 무한정 대기가 걸릴 수 있다고 하더라고요.그런데 강의 실습하면서 따로 timeout 설정한 부분이 없었던 거 같았는데, 혹시 제가 놓쳤던 것인지 아니면 의도적으로 설정하지 않으신건지 궁금해서 여쭤봅니다!감사합니다.