묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
SpringBoot 3점대 버전 Spring Security 설정
Spring Security 가 3점대 버전으로 오면서 상당한 변화가 있습니다. 강의 내용을 따라 하다보니 순환참조나, 현재는 지원하지 않는 기능이 상당수 존재하였습니다. 현재 작업한 코드가 문제 해결에 많은 도움이 되면 좋겠어서 글을 첨부합니다. SecurityConfig.class 입니다.@Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig{ private final CustomAuthenticationManager customAuthenticationManager; private final UserFindPort userFindPort; private final Environment environment; @Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring(). requestMatchers(new AntPathRequestMatcher("/h2-console/**")) .requestMatchers(new AntPathRequestMatcher( "/favicon.ico")) .requestMatchers(new AntPathRequestMatcher( "/css/**")) .requestMatchers(new AntPathRequestMatcher( "/js/**")) .requestMatchers(new AntPathRequestMatcher( "/img/**")) .requestMatchers(new AntPathRequestMatcher( "/lib/**")); } @Bean protected SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception { http.csrf(AbstractHttpConfigurer::disable); http.authorizeHttpRequests(authorize -> authorize.requestMatchers(new MvcRequestMatcher(introspector, "/**")).permitAll() // requestMatchers(new MvcRequestMatcher.Builder(introspector).pattern(HttpMethod.GET, "/users/**")).permitAll() // .requestMatchers(new MvcRequestMatcher(introspector, "/greeting")).permitAll() // .requestMatchers(new MvcRequestMatcher(introspector, "/welcome")).permitAll() // .requestMatchers(new MvcRequestMatcher(introspector, "/health-check")).permitAll() // .requestMatchers(new MvcRequestMatcher.Builder(introspector).pattern(HttpMethod.POST, "/users")).permitAll() .anyRequest() .authenticated()) .addFilter(getAuthenticationFilter()) .httpBasic(Customizer.withDefaults()); return http.build(); } private AuthenticationFilter getAuthenticationFilter() { return new AuthenticationFilter(customAuthenticationManager, userFindPort, environment); } }requestMatcher에서 AntPathRequestMatcher, MvcRequestMatcher에 관한 설명은부족하지만 https://velog.io/@dktlsk6/Spring-Security-RequestMatcher에서 확인 가능하십니다. CustomUserDetailService.class 입니다. 순환참조 문제가 발생하여 강의와 달리 새로 CustomService를 생성하여 implements 하였습니다.@Component @RequiredArgsConstructor public class CustomUserDetailService implements UserDetailsService { private final UserFindPort userFindPort; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { UserDto userByEmail = userFindPort.findUserByEmail(username); if (userByEmail == null) { throw new UsernameNotFoundException("User Not Found"); } return new User(userByEmail.getEmail(), userByEmail.getEncPasswd(), true, true, true, true, new ArrayList<>()); } } CustomAuthenticationManager.class 입니다. AuthenticationFilter의 AuthenticationManager로 사용할 것입니다.@Component @RequiredArgsConstructor @Slf4j public class CustomAuthenticationManager implements AuthenticationManager { private final CustomUserDetailService customUserDetailService; @Bean protected PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { UserDetails userDetails = customUserDetailService.loadUserByUsername(authentication.getName()); if (!passwordEncoder().matches(authentication.getCredentials().toString(), userDetails.getPassword())) { throw new BadCredentialsException("Wrong password"); } return new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities()); } } AuthenticationFilter.class 입니다. 해당 부분은 강의와 차이점이 없습니다.@Slf4j public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final UserFindPort userFindPort; private final Environment environment; public AuthenticationFilter(AuthenticationManager authenticationManager, UserFindPort userFindPort, Environment environment) { super.setAuthenticationManager(authenticationManager); this.userFindPort = userFindPort; this.environment = environment; } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { try { LoginRequestDto creds = new ObjectMapper().readValue(request.getInputStream(), LoginRequestDto.class); UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(creds.getEmail(), creds.getPassword(), new ArrayList<>()); return getAuthenticationManager().authenticate(token); } catch (IOException e) { throw new RuntimeException(e); } } @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { String username = authResult.getName(); UserDto user = userFindPort.findUserByEmail(username); if (user == null) { throw new UsernameNotFoundException(username); } log.debug("user id {}", user.getUserId()); String token = Jwts.builder() .setSubject(user.getUserId()) .setExpiration(new Date(System.currentTimeMillis() + Long.parseLong(environment.getProperty("token.expiration.time")))) .signWith(SignatureAlgorithm.HS512, environment.getProperty("token.secret")) .compact(); response.addHeader("token", token); response.addHeader("userId", user.getUserId()); } } 아래는 실제 결과입니다.404가 뜨는 이유는 login 성공시 redirect url을 설정해주지 않아서 /(루트) 경로로 이동해서입니다. 해당 경로와 매핑되는 resource나 api가 없기 때문에 해당 오류가 발생한것이므로 정상작동으로 생각하시면 됩니다.아래는 잘못된 정보를 기입하여 실패 테스트 입니다. 추후 강의를 들으며 업데이트 하도록 하겠습니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
3강 Spring Cloud Gateway - Custom Filter 적용 Bean 관련 질문있습니다.
안녕하세요 수업 잘 듣고 있습니다. 수업중 내용에 관해서 질문이 있어서 질문을 남깁니다. 수업 5분50초쯤에 Gateway Filter를 Bean으로 하나 등록한다고 하셨는데 @Component어노테이션이 붙은 클래스의 아래의 메소드의 반환값은 자동으로 Bean으로 등록되나요? @Bean어노테이션을 붙여줘야 등록이되는 줄 알았는데 제가 잘못이해하고있었는지 궁금해서 질문을 남깁니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
hasIpAddress(), getRemoteAddr() 질문입니다.
이전에 이런 질문들((https://www.inflearn.com/questions/423204))이 있던 것을 확인하였으나 저는 해결이 되지 않아 질문을 남깁니다.postman으로 회원가입하고 로그인하려고 하면 401 Unauthorized가 나며 많이 보셨을 이런 에러가 나옵니다.java.lang.UnsupportedOperationException: public abstract java.lang.String javax.servlet.ServletRequest.getRemoteAddr() is not supported....이와 같은 에러의 질문과 답변을 보고 hasIpAddress()에서 .access("hasIpAddress('" + IP + "')")로 바꿔서 해보았는데도 또는 스프링 부트 버전을 바꾸어 시도해(2.6.2, 2.4.2 등)보았으나 해결이 되지 않아 질문을 드립니다.처음 설정한 spring boot 버전은 2.7.15입니다.build.gradleplugins { id 'java' id 'org.springframework.boot' version '2.7.15' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } ext { set('springCloudVersion', "2021.0.8") } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2:1.3.176' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.modelmapper:modelmapper:3.1.1' implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } tasks.named('test') { useJUnitPlatform() } WebSecurity은@Configuration @EnableWebSecurity public class WebSecurity extends WebSecurityConfigurerAdapter { private final Environment environment; private final UserService userService; private final BCryptPasswordEncoder bCryptPasswordEncoder; private String IP = "192.168.1.2"; @Autowired public WebSecurity(Environment environment, UserService userService, BCryptPasswordEncoder bCryptPasswordEncoder) { this.environment = environment; this.userService = userService; this.bCryptPasswordEncoder = bCryptPasswordEncoder; } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); http.authorizeRequests() .antMatchers("/**") // .hasIpAddress(IP) .access("hasIpAddress('" + IP + "')") .and() .addFilter(getAuthenticationFilter()); http.headers().frameOptions().disable(); } private AuthenticationFilter getAuthenticationFilter() throws Exception { AuthenticationFilter authenticationFilter = new AuthenticationFilter(authenticationManager(), userService, environment); return authenticationFilter; } // db password와 input password 비교 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder); } }2.7 이후 버전에서는 https://www.inflearn.com/chats/789887와 같이 WebSecurityConfigurerAdapter 를 상속하지 않고 configure함수 오버라이드 대신 SecurityFilterChain을 사용해보았으나 이렇게 해도 되지 않았습니다.AuthenticationFilter에 unsuccessfulAuthentication를 오버라이드하여 확인해본 결과org.springframework.security.authentication.BadCredentialsException: 자격 증명에 실패하였습니다. at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:80) at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:147) at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182) at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:201) at com.example.userservice.filter.AuthenticationFilter.attemptAuthentication(AuthenticationFilter.java:46)라고 오류가 나오는 것을 확인했습니다.AuthenticationFilter.java:46 부분은 return getAuthenticationManager().authenticate( 부분 입니다.AuthenticationFilter 코드는 다음과 같습니다.@Slf4j public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final UserService userService; private final Environment environment; public AuthenticationFilter(AuthenticationManager authenticationManager, UserService userService, Environment environment) { super.setAuthenticationManager(authenticationManager); this.userService = userService; this.environment = environment; } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { try { RequestLogin creds = new ObjectMapper().readValue(request.getInputStream(), RequestLogin.class); return getAuthenticationManager().authenticate( new UsernamePasswordAuthenticationToken( creds.getEmail(), creds.getPassword(), new ArrayList<>() ) ); } catch (IOException e) { throw new RuntimeException(e); } } @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { // log.debug(((User)authResult.getPrincipal()).getUsername()); String userName = ((User)authResult.getPrincipal()).getUsername(); UserDto userDetails = userService.getUserDetailsByEmail(userName); System.out.println("details :" + userDetails); String token = Jwts.builder() .setSubject(userDetails.getUserId()) .setExpiration( new Date((System.currentTimeMillis() + Long.parseLong(environment.getProperty("token.expiration_time")))) ) .signWith(SignatureAlgorithm.HS512, environment.getProperty("token.secret")) .compact(); System.out.println("token :" + token); response.addHeader("token", token); response.addHeader("userId", userDetails.getUserId()); } @Override protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException { // super.unsuccessfulAuthentication(request, response, failed); failed.printStackTrace(); } } 어느 부분을 어떻게 수정하여 진행을 해야 할까요? AuthenticationFilter에서 attemptAuthentication 함수를 UsernamePasswordAuthenticationToken 받는 것으로 수정하여 디버깅해보니 아래 코드의 authenticationToken 값은 잘 나옵니다. 그런데 위의 질문처럼 getAuthenticationManager().authenticate 여기서 문제가 발생합니다.문제가 발생하는 부분은 AbstractAuthenticationProcessingFilter의 저 부분으로 잡히며AuthenticationFilter 코드는 다음과 같습니다.import com.example.userservice.dto.UserDto; import com.example.userservice.service.UserService; import com.example.userservice.vo.RequestLogin; import com.fasterxml.jackson.databind.ObjectMapper; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.User; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Date; @Slf4j public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final UserService userService; private final Environment environment; public AuthenticationFilter(AuthenticationManager authenticationManager, UserService userService, Environment environment) { super.setAuthenticationManager(authenticationManager); this.userService = userService; this.environment = environment; } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { try { RequestLogin creds = new ObjectMapper().readValue(request.getInputStream(), RequestLogin.class); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( creds.getEmail(), creds.getPassword(), new ArrayList<>()); return getAuthenticationManager().authenticate(authenticationToken); } catch (IOException e) { throw new RuntimeException(e); } } @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { // log.debug(((User)authResult.getPrincipal()).getUsername()); String userName = ((User)authResult.getPrincipal()).getUsername(); UserDto userDetails = userService.getUserDetailsByEmail(userName); System.out.println("details :" + userDetails); String token = Jwts.builder() .setSubject(userDetails.getUserId()) .setExpiration( new Date((System.currentTimeMillis() + Long.parseLong(environment.getProperty("token.expiration_time")))) ) .signWith(SignatureAlgorithm.HS512, environment.getProperty("token.secret")) .compact(); System.out.println("token :" + token); response.addHeader("token", token); response.addHeader("userId", userDetails.getUserId()); } // @Override // protected void unsuccessfulAuthentication(HttpServletRequest request, // HttpServletResponse response, // AuthenticationException failed) throws IOException, ServletException { //// super.unsuccessfulAuthentication(request, response, failed); // failed.printStackTrace(); // } } 해결 방법 좀 알려주시면 감사하겠습니다.
-
해결됨Backend 멀티쓰레드 이해하고 통찰력 키우기
캐시 플러시 관련 궁굼한게 있어서 질문 드립니다!!
컨텍스트 스위칭에서 캐시 플러시가 발생한다고 되어 있는데,이는 프로세스 간의 컨텍스트 스위칭이 아니라 스레드간 컨텍스트 스위칭에서도 발생하는지 궁굼합니다.왜냐하면 스레드는 주소 공간을 공유하기 때문에 데이터 영역은 플러시해야겠지만, 명령어 영역은 플러시 하지 않아도 되는거 아닌가 생각이 듭니다. 또한 캐시를 플러시 한다는 뜻이 캐시의 데이터를 메모리에 반영하는, 즉 write-back 동작인지도 궁굼합니다.제가 검색을 통해 찾아봤을 때는 캐시 flush는 캐시를 invalidate 하여 캐시를 메인 메모리에 반영하지 않고 초기화만 하는 것으로만 나왔습니다. 그런데 캐시 플러시가 메인 메모리에 반영하지 않는다면 데이터가 없어져 버리니, 제가 알아본 개념이 잘못된 것이 아닌가 합니다. 제가 자바로 실행했을 때 역시 컨텍스트 스위칭이 발생하면서 캐시 데이터가 메인 메모리로 반영이 되고, 그 값을 가져옴으로써 스레드가 종료될 수 있었습니다.
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
로그와 세그먼트
안녕하세요. 강의듣다 헷갈려서 질문드립니다.로그와 세그먼트에서 설명이 로그에서 갑자기 세그먼트로 넘어가는 느낌을 받았는데, 어떻게 이해하면될까요 로그 = 세그먼트 로그 = 세그먼트 들을 저장하는 로그파일세그먼트 = 오프셋 1ea의 명칭
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
네트워크 비용관련 설명 질문드립니다.
안녕하세요.프로듀서에서 토픽으로 데이터가 들어갈때, 초당 데이터가 1건/1000건의 예시를 들으셨는데,해당부분을 배치로 묶어서 1000건을 100개당 1건으로 가정하여 1000건의 처리를 100건으로 줄이는 부분에 대해서 카프카만이 할수있는 부분인가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
강의자료
강의자료는 따로 없을까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
섹션 16 mysql 문의드립니다
$ docker run -d -p 3306:3306 --network ecommerce-network --name mariadb nhw0926/my-mariadb:1.0c5aed5c624e8c48d18a32f8beea882f5373745350a4a069f64058d459045016ddocker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "mysqld": executable file not found in $PATH: unknown 실행 시 위와같은 오류가 발생하는데 몇시간을 찾아도 도저히 답이나오지않습니다.....하...아시는분있을까요
-
미해결15일간의 빅데이터 파일럿 프로젝트
JAVA 1.8 버전 설치 관련 에러
java 버전을 확인해보니 1.7 이더라고요그래서 1.8 버전을 설치 하려고 yum unstall oracle-j2sdk1.8 했는데 다음과 같은 에러가 납니다. [root@server01 yum.repos.d]# yum install oracle-j2sdk1.8Loaded plugins: fastestmirror, refresh-packagekit, securitySetting up Install ProcessDetermining fastest mirrorsYumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. Invalid release/repo/arch combination/removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txtError: Cannot find a valid baseurl for repo: base 그런데 실습은 하지 말라고 했는데 1.8 버전 설치 안해도 되는건가요??
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
컨슈머 랙 모니터링 아키텍처 관련 질문
안녕하세요. 좋은 강의 잘 보고 있습니다. 컨슈머 랙 모니터링 아키텍처 관련 질문이 있습니다.카프카 버로우, 텔레그래프 application에 대해서 각각의 노드에서 구성하는 것이 일반적인지 아니면 카프카 버로우, 텔레그래프를 하나의 노드에서 동작시켜도 무방한 건지에 대한 부분이 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Spring boot 3.1.3, Security 6.1.3 버전 업데이트
학습이 너무 예전거라 최신 스프링과 security 버전이 달라서 많이 바뀐것 같습니다. 강의 최신화좀 빨리 해주세요 진도가 안나갑니다 해결하느라
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
섹션14 Prometheus와 Grafana 설치 강의 내용중 문의 드립니다
강의 내용대로 진행하였는데http://localhost:8000/user-service/actuator/prometheushttp://localhost:8000/order-service/actuator/prometheus둘다 아래 이미지와같은 에러가 발생합니다 apigateway application.yml 설정- id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/actuator/** - Method=GET,POST filters: - RemoveRequestHeader=Cookie - RewritePath=/user-service/(?<segment>.*), /$\{segment} - id: order-service uri: lb://ORDER-SERVICE predicates: - Path=/order-service/actuator/** - Method=GET filters: - RemoveRequestHeader=Cookie - RewritePath=/order-service/(?<segment>.*), /$\{segment} 프로메테우스.yml 설정static_configs: - targets: ["localhost:9090"] - job_name: 'user-service' scrape_interval: 15s metrics_path: '/user-service/actuator/prometheus' static_configs: - targets: ['localhost:8000'] - job_name: 'order-service' scrape_interval: 15s metrics_path: '/order-service/actuator/prometheus' static_configs: - targets: ['localhost:8000'] - job_name: 'apigateway-service' scrape_interval: 15s metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8000'] apigateway 의 AuthorizationHeaderFilter.java// 절차 // login -> token반환받음 -> client에서 apigateway로 정보 요청 시 (토큰정보를 가지고 요청함) -> 서버에서는 토큰정보 검증 (header 안에 토큰이 포함됨) 38줄 @Override public GatewayFilter apply(Config config) { return ((exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); if(!request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) { return onError(exchange, "no authorization header", HttpStatus.UNAUTHORIZED); } String authorizationHeader = request.getHeaders().get(HttpHeaders.AUTHORIZATION).get(0); // 반환값은 list배열이기에 0 String jwt = authorizationHeader.replace("Bearer", ""); if(!isJwtValid(jwt)) { return onError(exchange, "JWT token is not valid", HttpStatus.UNAUTHORIZED); } return chain.filter(exchange); }); }여기서 지속적으로 아래 오류가 발생중입니다2023-09-10 01:15:35.241 INFO 31372 --- [tor-http-nio-10] c.e.a.filter.GlobalFilter : Global Filter baseMessage: Spring Cloud Gateway Global Filter2023-09-10 01:15:35.241 INFO 31372 --- [tor-http-nio-10] c.e.a.filter.GlobalFilter : Global Filter Start: request id -> a5f590c1-10982023-09-10 01:15:35.270 INFO 31372 --- [tor-http-nio-10] c.e.a.filter.GlobalFilter : Global Filter End: response code -> 404 NOT_FOUND2023-09-10 01:15:35.528 INFO 31372 --- [tor-http-nio-12] c.e.a.filter.GlobalFilter : Global Filter baseMessage: Spring Cloud Gateway Global Filter2023-09-10 01:15:35.528 INFO 31372 --- [tor-http-nio-12] c.e.a.filter.GlobalFilter : Global Filter Start: request id -> d5aec101-10992023-09-10 01:15:35.528 ERROR 31372 --- [tor-http-nio-12] c.e.a.filter.AuthorizationHeaderFilter : no authorization header2023-09-10 01:15:35.528 INFO 31372 --- [tor-http-nio-12] c.e.a.filter.GlobalFilter : Global Filter End: response code -> 401 UNAUTHORIZED 이 필터관련 수정한건 없는것으로 기억하는데 제가 놓친게있을까요답답하네요 ㅠ
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Dockerfile 질문
Dockerfile에서 FROM은 base 이미지를 지정할 수 있는데요, 보통 ubuntu와 같은 OS를 지정하는 것으로 알고 있습니다. 만약 FROM ubuntu로 지정했을 경우 ubuntu OS로 해당 컨테이너가 동작하며 그 안에서 jdk를 설치하고 앱을 실행하고 하는 작업이 가능할 것 같은데요FROM에 그냥 jdk를 지정하면 java는 jvm을 통해 OS에 종속되지 않고 앱이 실행 가능하니 정상 실행될 것이라는 것은 알지만 컨테이너의 OS는 어떻게 되는것인가요?
-
미해결실습으로 배우는 선착순 이벤트 시스템
안녕하세요 강사님 이전 재고 관리 강의와 차이에 대해 궁금합니다.
쿠폰 생성 발급 로직도컬럼에 쿠폰의 개수를 지정해놓으면이전 강의랑 똑같은 거 같은데왜 이번 강의는 쿠폰 엔티티를 새로 생성해서 그 개수를 체크하는 건지 궁금합니다.이전 컬럼에 개수를 두어 관리하는 거랑지금처럼 엔티티를 생성하는 방식의 차이점이 너무 궁금해요 항상 감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Resilience4JCircuitBreakerFactory id
return factory 객체에서 생성하는 Resilience4JConfigBuilder에게 전달되는 id 값은 직접 주입하는것이 아닌것 같은데요,circuitBreakerFactory create시에 지정하는 name 값이 컨테이너를 통해 주입되는건가요?만약 그렇다면 생성된 모든 circuitBreakerFactory을 조회해서 id를 주입하는 로직이 있는건가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
connect 사용시 kafka 서버
kafka connect 사용시 kafka서버와 zookeeper 구동도 필수인가요?connect는 다른 도메인으로 접근하는 것 같은데 필요한지 궁금합니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
쿠폰 카운트를 Redis에 의존하고 있는데요
만약 Redis에 장애가 발생한다면 2차 장치로 DB Count에 의존할 수 밖에 없는걸까요?실무에선 어떻게 대응하시는지 궁금합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka listener
Kafka Consumer Config에서 등록한 KafkaListenr bean은 Consumer 쪽 서비스 로직에서는 쓰지 않는것인가요?Producer에서는 등록한 template bean을 서비스 객체에서 주입받아 send에 사용하는데 listener는 어노테이션 지정후 내부 동작 하는것인지 궁금합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
kafka connect 실행 시 질문
kafka topic 생성시에는 localhost:9092의 브로커 정보를 입력해서 붙였는데 kafka connect 실행 시에는 브로커 정보없이 실행해도 조회시에 topic과 connect가 함께 출력됩니다.connect는 타겟 브로커를 어떻게 알고 적용되는 것인가요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
spring cloud 무중단 구성 방법
아래와 같은 spring cloud 환경에서 무중단 배포를 구현할려면 어떻게 진행해야하나요?맨 앞단에 L4 1대그 뒤에 spring cloud gateway 2대spring cloud eureka 2대api server 2대각 서버를 2대씩 구성한 이유는 HA구성을 위해서입니다.여기서 api server를 무중단 배포로 진행할려면 어떻게 해야되나요?api server를 down시키면 eureka의 registry에 반영된다 하더라도 gateway에서 반영되기까지는 시간걸려 down된 인스턴스로 라우팅 해주고, gateway에서 retry로직을 적용시켜도 배포순간에 많은 요청이오면 한 요청에 대해서 실패한 인스턴스로 모두 retry하여 결국 실패하는 경우도 생기더라고요 (ribbon의 avoid-previous-instance 적용시킬려고 하였으나 spring cloud gateway에서는 지원 안한다고합니다 ㅜㅜ) 현업에서는 보통 어떤 방식으로 무중단 배포를 구현하나요?