Development(12)
-
Spring cloud gateway에서 허가되지 않은 url character 사용하기
레거시 시스템에 Spring cloud gateway를 도입하면서 하나의 장벽에 부딪히게 되었습니다. 오랫동안 유지되어온 시스템에서 client들에게 완벽한 하위호환을 보장해주어야하는 상황에서 일부 client들이 url에 포함해서는 안되는 특수문자들을 인코딩을 하지 않고, 날 것으로 그대로 보내오고 있었습니다. http://localhost:8080/test/case/key/var1|var2 [2dd57409, L:/127.0.0.1:8080 - R:/127.0.0.1:59831] Decoding failed: REQUEST(decodeResult: failure(java.net.URISyntaxException: Illegal character in path at index 40: http://loc..
2024.02.07 -
개인용 Maven library github으로 셋업하기
Maven repo Maven repo는 library를 집합소이며, gradle, maven 빌드 타임에 해당 필요한 의존성을 Download해서 프로젝트 빌드할 때 사용됩니다. 실제 빌드시 다운받은 library들은 해당 위치(linux, mac)에 cache의 형태로 저장 되어있습니다. ~/.m2/repository 간혹 팀내에서 자체 라이브러리를 만들어서 공유하며 사용해야할 일이 있습니다. 오픈소스 라이브러리로 특별히 오픈할 의도는 아니었기에 계정을 등록하고해야하는 maven repo(https://mvnrepository.com) 에 직접 올리기는 뭔가 애매했습니다. 찾다보니 개인용 github계정에 public repo를 maven repo로 활용할 수 있는 방안이 있어 이를 적용하여 보았습니..
2023.01.24 -
bytebuddy로 Java class 일부 method 교체하기 (해킹)
java.net.URI$match Uri 에 특수문자가 들어가게되면 http protocal을 오갈때 보통 encoding을 통해서 parsing에 문제가 없도록 해주게 됩니다. 하지만 이게 언제부터 생긴 국룰인지 모르겠지만 과거에는 그렇지 않았음을 알게 되었습니다. Legacy client들이 encoding을 하지 않고, 심지어 해킹이 가능할 수 있는 특수문자 '파이프'와 같은 char를 날 것으로 보내오고 있었습니다. 현재 Spring cloud gateway(이하 SCG)를 apigateway로 준비하고 있는 중입니다. 그 과정에서 TC를 통해 해당 이슈가 드러나게 되었는 데, 내용인 즉슨 Netty에서 URI를 검수하면서 특정 특수 문자에 대해서는 그냥 400 Bad gateway를 내려버리는 ..
2023.01.24 -
Spring cloud gateway response body cache
Reponse body cache Request body에 이어 Response body도 리턴하기 전에 읽어야 하는 요구사항이 나타났습니다. 최우선으로는 구현된 library나 내부 필터가 존재하면 이용하는 방향으로 가려고 했지만 신기하게도 사용빈도가 떨어지는 이유인지 Response body의 경우 만들어진 캐싱 코드가 없는 것 같아보여 직접 구현을 해야했습니다. @Component public class ResponseBodyCheckFilter implements GlobalFilter, Ordered { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter( ex..
2023.01.24 -
Spring cloud gateway request body cache
Request body cache Spring cloud gateway를 도입하는 과정에서 backend 로의 routing 전에 request body를 열어보아야하는 요구사항이 있었습니다. 특별히 손을 대지 않는 다면, filter들을 통해서 라우팅을 하는 과정에서 body가 읽혀지게 됩니다. 하지만 rest call에서 body는 상대편에서 보내오는 data stream을 직접 읽어오는 식이다보니 버퍼에 있는 내용을 꺼내게 되면 비게 됩니다. 버퍼에서 두번 읽을 수 없기 때문에 두 곳에서 사용을 하려면 처음 읽은 데이터를 어떤 식으로든 보존해 두었다가 재사용을 해야합니다. Spring cloud gateway에는 이를 cache를 통해서 해결하게끔 filter가 만들어져있고, 실제 사용하는 방법을 ..
2023.01.24 -
Server test용 General Mock server 만들기
Mock server Micro service architecture 에서는 내부 타 Service와 Interaction을 하는 경우가 많이있고, 새로운 Micro service를 개발할 때 외부 호출을 통해 동작을 테스트 해야하는 경우가 종종있어왔습니다. 이때 mock server를 이용했으면 하는 케이스가 많이 있어서, 좀 더 쉽게 셋업을 할 수 있는 Mock server에 대한 고민을 하다가 이번에 토이 프로젝트 삼아 서비스를 만들게 되었습니다. Github repo Repo : https://github.com/wen-ys/GeneralMock.git Config routingPolicies: - path: "/books/1" filters: - type: "DelayFilter" args: |..
2023.01.24