대머리개발자

아르메리아를 쓰자. 본문

개발이야기/코틀린

아르메리아를 쓰자.

대머리개발자 2024. 3. 15. 12:25
728x90

아르메리아의 호의권리인 줄 알았다. 스미마센!

 

뭐 굳이 grpc를 사용하지 않는 환경에서 써야하는가?에 대한 물음으로 엄청 회의적으로 작성했다.

 

나의 무지를 반성합니다. 써야합니다.

 

아르메리아를 Webflux로 변경하고자 봤는데 쉽게 작성했던 코드들이 쉽게 마이그레이션이 안 되는 부분들이 있다.

아마도 반대로는 webflux -> 아르메리아는 엄청 easy 할 듯.

 

일일히 나열할 수는 없지만 찐으로 개발자가

코어 기능에만 집중할 수 있도록!

쉽게 작성할 수 있도록.

무한한 도움을 준다.

 

그래 왜 아르메리아를 제쳐두려고 했니.. X잡고 반성한다.

 

인증서버를 gRpc 서버로 만들었지만, 어느 누구도 gRpc로 통신하는 곳이 없다.

해서 모듈로 만들어 보려고 한다.

 

사용자 정보를 얻기 위해서 OkHttpClient로 호출해서 쓰고 있지만 GrpcClient를 만들어 보고자 하는 부분이다.

fun getUserInfo(): Map<*,*> {
            val mutableMap = mutableMapOf(
                "executeEvent" to "GET"
            )
            val request =  requestPost("http://oauth-service/user", mutableMap)
            val response = OkHttpClient().newCall(request).execute()

            if (response.isSuccessful) {
                val body = response.body?.string()
                val json = Gson().fromJson<Map<String, Any?>>(body, object : TypeToken<Map<String, Any?>>() {}.type)
                return (json["data"] as Map<*, *>)
            }
            return mapOf("data" to "userInfo is null") 
}

 

 

중요한 것은 아르메리아에서 이미 만들어져 있다.ㅋ

 

사용을 위한 모듈 프로젝트 환경에서 일일이 설정하기 보단 jar 파일로 퉁 던져 주려고 한다.

 

일단 gRpc 클라이언트 리소스이다. "GrpcClients" 해당 녀석을 이용하면 된다.

class GrpcUser {
    fun getUserInfo(url:String, token:String): UserGrpc.User{
        val client = GrpcClients
            .newClient( url, UserServiceGrpc.UserServiceBlockingStub::class.java)
            .withCallCredentials(BearerTokenCredential(token))
        return client.unary(UserGrpc.User.newBuilder()
            .setExecuteEvent(CommonGrpc.ExecuteEventType.GET).build()).data
    }
}

 

 

단순 테스트 코드이다.

 

 

Jar 파일로 빌드해보자!

 

개발환경에서 너무나도 매끄럽게 OK

Jar 파일로 만들어서 모듈로 했더니.... 쉬운 길이 없구나..

 

정상적으로 Jar 파일이 만들진 것이 아니라고 판단해서 찾아봤더니 shadowJar 플러그인이 있었다.

id "com.github.johnrengelman.shadow" version "8.0.0"

shadowJar {
  mergeServiceFiles()
}

 

단 하나의 단점이라면 추가된 Jar파일이 좀 무겁다. -->.. 고민좀.

 //user = HttpRequest.getUserInfo(jwtToken, user.loginId)
user = GrpcUser().getUserInfo(jwtToken)

 

 

아르메리아grpc 클라이언트 말고.. 순수하게  POJO(?)

class GrpcUser(private val url:String){
    fun getUserInfo(token:String): UserGrpc.User{
        val managedChannel = ManagedChannelBuilder.forAddress(url, 80) 
            //.keepAliveTime(5, TimeUnit.MINUTES)
            //.keepAliveTimeout(30, TimeUnit.SECONDS)
            .maxInboundMessageSize(33554432)
            .usePlaintext()
            .build();
        try{           
            val user =
                UserGrpc.User.newBuilder()
                    .setExecuteEvent(CommonGrpc.ExecuteEventType.GET)
                    .build()

            return  UserServiceGrpc.newBlockingStub(managedChannel)
                .withCallCredentials(BearerTokenCredential(token))
                .unary(user).data
        }finally {
            managedChannel.shutdown()
        }
    }
}

 

디펜더시 덜 걸려 Jar파일 50%를 절약할 수 있다. ㅎ 40MB -> 19MB

grpc 클라이언트는 순수하게 쓰자!ㅎ

 

 

 

..K8S 내부 호출은 gRpc 가즈아!!

 

728x90