25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
@LoadBalanced 관련 질문입니다.
@LoadBalanced 를 사용할시에 apigateway를 거치지 않고 user -> order 로 가는것을 확인했는데 제가 궁금한것은 보통 client 단에서 첫 요청이 들어왔을 시에만 api gateway를 거치고 그 이후 비지니스 로직을 처리하기 위해서 ms간에 소통하는것은 api gateway를 거치지 않는것이 일반적인 건가요?
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
각 애플리케이션에 랜덤포트를 부여하는 이유
안녕하세요!!! 랜덤포트를 부여하는 이점에 대해서 아직도 이해가 잘 안갑니다.ㅜㅜ 마이크로서비스 애플리케이션의 확장성과 랜덤포트를 부여하는게 얼마나 깊은 관계가있나요?? 저는 정해두고 쓰는게 더 편하다고 생각했거든요. 그리고 실무에서도 정말 이렇게 랜덤포트로 사용하나요?
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
코드 제공
익숙한 내용은 강의를 보면서 코드를 따라치기 번거로워서 그런데 강의하시는 코드를 깃허브로 제공받을 수 있을까요?
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
rabbit mq가 ms(configservice, apigatway ,userservice) 들이랑 connection을 맺을 수 있는 조건?
안녕하세요 선생님제목처럼 어떤 조건을 갖춰야 ms가 rabbit mq와 connection을 맺는지 궁금합니다.제가 # rabbitmq: # host: localhost # port: 5672 # username: guest # password: guest이것 도 지우고 management include에서 busrefresh도 지워서 결국에는 pom.xml에 dependency 만 남아있는데 다 껐다켜도(ms랑 rabbitmq도) 그래도 ms들이 rabbitmq와connection을 새로 잘 맺는것을 확인 할 수 있었습니다.https://spring.io/guides/gs/messaging-rabbitmq/여기에서 springboot는 Spring Boot automatically creates a connection factory and a RabbitTemplate, reducing the amount of code you have to write.이러하다는데 이래서 depdency만 추가하면 알아서 척척 연결이 되는 것이고 이렇게 사용을 해도 괜찮을 까요?
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
cannot resolve property
application.yml 파일에서 글로벌 필터의 속성 ( baseMessage, preLogger, postLogger) 는 인식하는데 로깅 필터의 속성은 인식하지 못해 cannot resolve property 에러가 납니다. 왜인지 이유를 알 수 없어 질문드립니다.LoggingFilter.java 파일입니다.package com.todaypills.apigatewayservice.Filter; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.OrderedGatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @Slf4j //for print log @Component /**커스텀 필터의 일종임, 단지 로그를 찍기 위한 필터이므로 이름을 Logging 이라고 지은 것*/ public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> { public LoggingFilter() { super(Config.class); } @Override public GatewayFilter apply(Config config) { /** * 위쪽 주석부분은 람다 표현식으로 바로 리턴한 것이고 이것은 람다를 사용하지 않고 리턴한 것임, * 따라서 인스턴스부터 만들어주어야 하고 GatewayFilter는 인터페이스이기 때문에 직접 인스턴스를 생성할 수는 없고, OrderedGatewayFilter() 를 이용하여 인스턴스를 만들어주어야함 * */ GatewayFilter filter = new OrderedGatewayFilter(((exchange, chain) -> { /** exchange: request와 response 객체를 얻기 위함 */ ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); log.info("logging filter: request id -> {}", config.getBaseMessage()); if(config.isPreLogger()){ log.info("logging pre filter start: request id -> {}", request.getId()); } return chain.filter(exchange).then(Mono.fromRunnable(() -> { if(config.isPostLogger()){ //Mono 객체: 웹플럭스(스프링5)에서 지원하는 기능으로 비동기방식의 서버에서 단일값을 전달할 때 모노타입으로 전달 log.info("logging post filter end: response code -> {}", response.getStatusCode()); } })); }), Ordered.HIGHEST_PRECEDENCE); //HIGHEST_PRECEDENCE 는 적용할 필터가 여러개일 때 어느것이 먼저 실행될지 우선순위를 부여함 return filter; } @Data // setter getter 함수 생성 (isPreLogger(), isPostLogger() 등) public static class Config{ // 여기에 configuration 이 있다면 삽입 private String baseMessage; private boolean preLogger; private boolean postLogger; } } application.yml 파일입니다.server: port: 8000 eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka spring: application: name: apigateway-service cloud: gateway: default-filters: - name: GlobalFilter args: # 우리가 정의한 변수 baseMessage: 게이트웨이 글로벌 필터입니다. preLogger: true #prefilter의 유무 postLogger: true routes: #FilterConfig의 라우팅 정보를 yml 파일로도 설정할 수 있음 - id: nutrients-service uri: http://localhost:8081/ predicates: - Path=/nutrients-service/** filters: # - AddRequestHeader=nutrients-request, nutrients-request-heaer-value # - AddResponseHeader=nutrients-response, nutrients-response-header-value - name: CustomFilter - name: LoggingFilter args: baseMessage: 커스텀 로깅 필터입니다. preLogger: true postLogger: true
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
마이크로서비스 간 파일 동기화
안녕하세요 강사님.데이터 동기화와 관련된 강의를 듣다가, DB에 저장되는 데이터가 아닌, 로컬 서버에 저장되어야 하는 파일 데이터는 어떻게 관리해야 하는지 궁금하여 문의드립니다.각 마이크로서비스가 파일을 저장해야 하는 일이 생긴다면, 이 파일은 어떻게 관리하는 것이 best practice일까요? 제가 생각했을 때는 아래 두 방식 중 2번인데요..각 마이크로서비스 로컬에 저장하고 마이크로서비스 간 동기화모든 마이크로서비스가 참조하는 외부 스토리지에 저장강사님의 생각이 궁금하여 문의드립니다.
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
jwt.io 에서 invalid signature 가 게속 뜨는 문제
1) 해당 사이트에서secret 을 먼저 설정해주고복붙하면 invalid 하다고 뜹니다.스택 오버플로우를 참고해서 순서를 알았는데안되서 순서를 바꿔서 해봐도 잘 되지 않습니다. (base64 encoded 등등 순서 바꾸고 여러시도를 해봄)코드와 dependency는 동일하고 secret 만 secret 으로 바꿨습니다. 2) 뒤에서 강의에서 api gateway 에서 AuthorizationHeaderFilter 에서 검증과정은 무사히 통과 합니다.제가 놓친게 있을까요?
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
MSA구조 Frontend는 어디에 있어야 하나요?
강사님 안녕하세요.강사님 강의를 듣고 작게 MSA 구조로 프로젝트를 만들어보고 있는데요.frontend는 어디서 가지고 있어야 하나요?? app1, app2 를 bootstrap 활용해서 만들고 api gateway에서 접근하면 css는 하나도 적용되지 않던데 그럼 frontend는 각 어플리케이션이 가지고 있는게 아닌건가요??
- 해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Kafka sink connector를 통해서 단일 데이터베이스 저장을 했을 때 장점?
안녕하세요.Kafka Connect 를 활용한 단일 데이터베이스를 사용 파트를 듣고 있는데요.Multiple Order Service가 같은 DB URL을 가지고, JPA를 통해서 데이터 저장을 하면 될 것 같은데, 굳이 Kafka Sink Connector를 통해서 데이터 저장을 하는 이유가 따로 있을까요?JPA를 쓰면 Persistence Manager가 제공하는 여러 장점을 이용할 수 있을 것 같은데, Kafka sink connector는 그런 장점을 이용할 수 없을 것 같아서요.. 실제 현업에서 많이 사용되는 테크닉인지 궁금하고, 만약 사용한다면 장점은 무엇인지 궁금합니다!
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
jwt 관련 질문입니다.
signWith(SignatureAlgorithm.HS256, env.getProperty("token.secret"))jwt 버전 0.10 버전이상부터는 관련 내용이 문자열이 작다고 합니다. 혹시 0.11버전에 맞춰서 한다면 어떤 방식으로 해야합니까?추가적으로 signWith의 deprecated 또한 해결 하는 방법에 대해 알려주시면 감사하겠습니다. => document 사이트 위치라도 알려주시면 직접찾아보겠습니다. 전체적으로 따라해봤는데 해쉬값이 작다고 하여 관련내용에 대해 이해를 하지 못해서 작성합니다.
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
busrefresh로 gateway.ip 변경 시 user-service 내 WebSecurity 설정 자동 반영 여부
강사님 안녕하세요. busrefresh로 설정값을 변경 후에 각 마이크로서비스에서 해당 값을 잘 읽어오는지 테스트 하던 중 궁금한 점이 생겨 문의드립니다.token.secret 값을 변경하면 gateway나 user microservice에서 매번 값을 새로 참조하기 때문에, 변경된 값을 잘 읽어올 수 있었는데요.user service의 WebSecurity에 설정된 gateway의 IP 값이 변경된 경우, busrefresh를 통해 gateway.ip 값을 변경하여 적용하고 싶은데요. 강의 코드대로 설정했는데, WebSecurity에서 설정한 IP 설정값은 busrefresh로 값을 업데이트해도 반영되지 않아 문의드립니다. 기존 코드로는 uri path 별 동적 IP 허용 설정 등이 불가능할까요?>>> 테스트 로직처음 로딩 시 실제 gateway ip로 설정 --> user service 모두 정상 호출 가능gateway.ip 값을 임의로 수정하여 busrefresh --> 호출 실패를 원했지만 user service 모두 정상 호출 가능.user service에서 /health_check api 호출 시에는 변경된 gateway.ip 값이 잘 나옴>> WebSecurity.java protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); http.authorizeRequests() .antMatchers("/actuator/**") .permitAll() .antMatchers("/**") .hasIpAddress(environment.getProperty("gateway.ip")) // 값 변경 시 반영되는지 .and() .addFilter(this.getAuthenticationFilter()); } >> 설정 파일token: expiration-time: 860000 secret: 1231231232222 gateway: ip: 1.1.1.1 # 이 값을 변경하고 바로 security 적용 감사합니다.
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Filter 람다식 관련 질문드립니다.
안녕하세요!Custim Filter 강의 중 아래 코드 부분에서 GatewayFilter의 생성자가 exchange와 chain이기 때문에 return (exchange, chain) -> { .. 이 되는 것 까지는 이해를 하였습니다.그런데 이 때 exchange와 chain 변수가 어디에서 정의되어서 여기서 사용되는 건지 잘 모르겠습니다 ㅠㅠ return (exchange, chain) -> {// GatewayFilter의 생성자 Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
k8s 추가질문
https://www.inflearn.com/questions/670959해당 글의 추가 질문 드립니다. 우선 local과 docker에서는 정상 작동하는 것을 확인했습니다. 혹시 apigateway에 - Path=/customer-svc/customers이런식으로 경로가 설정되어 있다면 각 각의 서비스들이 다른 pod에 배포되어 있을 경우정상적으로 경로를 찾아 갈 수 있는 건가요??각 pod 들에는 ClusterIP로 서비스를 연결해 준 상태입니다. 자세히 말하자면강의에서 docker 배포 목적으로 spring cloud apigateway를 이미지로 만들었던 것을yaml을 이용하여 쿠버네티스(192.168.1.10)에 배포하였고 이를 nodeport(30502)로 노출 시켰습니다.그리고 각 각의 서비스들도 마찬가지로 yaml로 배포하였고ClusterIp로 노출시켜놨습니다.이렇게 되면 192.168.1.10:30502/customer-svc/customers로 계정 생성 서비스(POST)가 정상적으로 동작하나요??아니면 단지 apigateway를 이미지 형태로 배포한 것으로 독립된 pod에 있는 customer-svc를 찾아가는 것이 안 되는 건가요..? 그렇기 때문에 500에러가 발생하고요.apigateway POD의 에러 메세지는 다음과 같습니다빨간 박스 내용2022-10-19 19:22:35.106 INFO 1 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration 2022-10-19 19:27:35.106 INFO 1 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration 2022-10-19 19:29:55.347 INFO 1 --- [or-http-epoll-1] c.p.a.filter.GlobalFilter : Global Filter baseMessage: Spring Cloud Gateway Global Filter 2022-10-19 19:29:55.348 INFO 1 --- [or-http-epoll-1] c.p.a.filter.GlobalFilter : Global Filter Start: request id -> f6eabebe-14 2022-10-19 19:29:59.358 ERROR 1 --- [or-http-epoll-2] a.w.r.e.AbstractErrorWebExceptionHandler : [f6eabebe-14] 500 Server Error for HTTP POST "/customer-svc/customers" java.net.UnknownHostException: Failed to resolve 'customer-deployment-5bf5fbc484-wxmlh' after 2 queries at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1047) ~[netty-resolver-dns-4.1.82.Final.jar!/:4.1.82.Final] Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): *__checkpoint ⇢ org.springframework.boot.actuate.web.trace.reactive.HttpTraceWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ HTTP POST "/customer-svc/customers" [ExceptionHandlingWebHandler]해당 내용으로 봤을 때, 쿼리가 간다는 것은 통신은 정상적으로 이루어지는 것 같은데 어떤 문제가 있을까요??
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka CRUD 관련 문의 드립니다.
안녕하세요.정성을 다해 만들어주신 강의 잘 듣고 있습니다.kafka 관련 CRUD 문의 드립니다.DB CRUD관련 이벤트를 모두 수집하여 처리하고자 합니다.kafka 및 kafka debezium 플러그인을 활용하여아래와 같은 DB CRUD 관련 Topic 정보를 수집 하였습니다.["payload": {"before": {"id": 22,"name": "chp"},...중략 ]이러한 CRUD Topic정보를 DB 에 적용하려면sinkconnector 를 활용하는 방법외에어떠한 다른 방법이 있을까요?해당 json Topic을 java 에서 파싱하여응용프로그램 레벨에서 DB를 처리해야 하는건지다른 처리 패턴이나 솔루션 혹은 플러그인이 있을까요?해외사이트 구글링을 해봐도 debezium을 통해CRUD Topic 정보를 수집하는 것 까지만 나오고 이후 처리에 대해서는 어떠한 내용도 없어서 문의드리게 되었습니다.
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
date 관련 에러입니다.
@ColumnDefault(value = "CURRENT_TIMESTAMP")현재 Order을 주입할때 자동으로 date가 생성이 안됩니다.{ "productId": "CATALOG-001", "qty": 10, "unitPrice": 1500, "totalPrice": 15000, "createdAt": null, "orderId": "e2672367-43bb-48bf-955f-d38917979c11" }server: port: 0 spring: application: name: order-service h2: console: enabled: true settings: web-allow-others: true path: /h2-console jpa: hibernate: ddl-auto: update show-sql: true generate-ddl: true defer-datasource-initialization: true datasource: url: jdbc:h2:mem:testdb driver-class-name: org.h2.Driver eureka: instance: instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}} client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka logging: level: com.example.orderservice: DEBUG
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의록 문의드립니다
깃헙에 올려주신 강의록 관련 문의드립니다.제가 눈이 좋지 않아 인쇄해서 보는 것을 선호하는데 깃헙에 공유해주신 PDF파일들은 인쇄가 불가능하게 지정된것 같습니다. 인쇄를 할수 있는 버전으로 공유가 가능할지 확인 부탁드립니다.감사합니다.
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
K8S에 배포
안녕하세요.해당 강의를 듣고 K8S에 배포를 해보고 있는데,500에러가 떠서 질문을 드립니다. docker 강의를 보고 yaml을 작성하여 k8s에 배포하였으며 github 주소는 다음과 같습니다.https://github.com/giimaeng/test1 혹시 500 에러가 뜬다면 예상되시는 원인이 있을까요??원인이 예상이 안되니 해결이 안되어, 예상 되는 원인이 몇 가지 있으시다면 말씀해주시면 감사하겠습니다.
- 해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Spring Web 디팬던시 관련 문의
안녕하세요! 먼저 좋은 수업 감사드립니다.Spring Cloud Gateway - 프로젝트 생성 강의 수강중 질문이 있습니다. 이전까지 다른 프로젝트에서는 Spring Web 디팬던시를 추가해주었는데, apigateway-service를 만들때는 Spring Web 디팬던시를 추가해주지 않았습니다.Spring Web이 어떤 역할을 하는지 구글링으로 찾아보려했지만 명확하게 이해하지 못한 것 같아서 여쭤봅니다.감사합니다!
- 미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
docker로 mariadb배포 시 문제 발생
현재 증상입니다.환경은 windows10입니다. mariadb를 켰을 때사진이 잘 안 보일 수 있어서 에러 메세지를 아래 써놨습니다.PS C:\Users\ccro1> docker run -d -p 3306:3306 --network ecommerce-network --name mariadb ccro1307/test:mariadb 33de5e6b75944d49e8e4220d428d0674d90103f4719387db1f566e7c927429e8 docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. mariadb를 껐을 때껐을 때는 mysql이 없다고 그러고켰을 때는 port가 중첩되서 안된다는 것 같은데..해결책이 어떻게 될 까요 mariadb는.\bin\mariadb-install-db.exe --datadir=C:\Work\mariadb-10.5.17-winx64\data --service=mariaDB --port=3306 --password=test1357로 설치하였습니다.
- 해결됨Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
2개 이상의 마이크로 서비스가 결합됐을 때는 테스트코드는 어떻게 작성하는지 궁금합니다.
UserService API 를 호출할때 RestTemplate 를 통해 OrderService 의 API 를 추가로 호출하는 방법을 보고 각 마이크로 서비스들이 엔티티 단위로 모듈화 되어 설계되어있다면 이런식으로 하는구나~ 배울 수 있었습니다. 그런데 이렇게 두개 이상의 마이크로서비스가 호출되는 API 는 테스트 코드를 어떻게 작성해야 하는지 감이 잡히지 않습니다. Web Layer(Controller) 를 테스트할때는 Service 객체를 Mocking 해서 해결할 수 있을것 같은데, Service layer(Service 클래스) 를 테스트할때는 어떻게 해야할까요?