gRPC를 웹브라우저에 호출해보자(a.k.a Typescript)
Server streaming RPC를 웹브라우저에 호출해보자
목표
브라우저에서 rpc를 호출하고 싶습니다. 하지만 2020년 7월 기준으로 브라우저에서 gRPC의 rpc를 직접 호출하는 건 불가능합니다. 그치만 envoy Proxy와 함께라면 가능합니다. 이 문서에서는 grpc-web을 이용해 생성된 Typescript 파일을 이용해 server streaming rpc를 호출하는 방법을 설명합니다. 서버는 Go, 클라이언트는 Typescript 언어를 사용합니다.
proto 파일 작성
특정 채팅방에 접속해서 server stream을 얻는 rpc를 작성해봅시다. 양방향 스트림이 아니라 서버사이드 스트림으로 한 이유는 현재 grpc-web에서는 양방향 스트림을 지원하지 않기 때문입니다(클라이언트 스트림도 지원하지 않습니다). 만약 채팅방에 메세지를 전송하고 싶다면 해당 기능을 가진 rpc를 별도로 작성하여야 합니다.
|
|
generate source code
이제 위에서 작성한 proto파일을 기반으로 각 언어별 맞춤 파일을 생성해야 합니다. proto 파일이 있는 위치에서 gen/go
, gen/typescript
폴더를 각각 생성 후 터미널 창을 열어서 아래의 명령어를 입력하세요.
generate source code for Go
|
|
generate source code for Typescript
|
|
envoy 설치
위에서 말했다시피 브라우저에서 RPC를 직접 호출할 순 없습니다. envoy Proxy를 통해서 간접적으로 호출해야 합니다. 이 예제에서는 envoy를 도커를 이용해서 실행하는 방법을 설명합니다.
envoy.yaml 작성
|
|
envoy Dockerfile 설정
위에서 작성한 설정파일을 사용한 DockerFile을 작성합니다.
|
|
docker 실행
이제 작성된 Dockerfile
을 이용해서 실제로 컨테이너를 빌드하고 실행시켜 봅시다.
|
|
실행 후 http://localhost:9901 에 접근해서 제대로 envoy가 실행되었는지 확인해봅니다. 제대로 실행되었다면 아래와 같은 화면이 뜹니다.
server 작성
이제 서버 코드를 작성해봅시다. 이번 예제에선 채팅 메세지 전송 기능은 없으니 stream에 초당 한 번씩 메세지를 보내는 서버를 작성하겠습니다.
go mod init
명령어를 이용해 Go 프로젝트를 하나 생성 후, 위에서 proto 파일을 이용해 생성한 gen/go
폴더를 Go 프로젝트 안으로 복사한 후 해당 폴더명을 pb로 바꿔줍니다(protobuf의 약자입니다). 이 과정을 모두 마무리 하면 Go 프로젝트의 파일 트리는 아래와 비슷해집니다.
|
|
이제 Go 프로젝트의 root 폴더에 ~main.go~를 작성합니다.
|
|
이제 go build
명령어를 이용해 바이너리 파일을 생성하고, 생성된 파일을 실행해보세요.
client 작성
서버가 준비되었으니 이제 클라이언트(웹 페이지)를 작성해봅시다.
서버를 작성할때와 마찬가지로 위에서 proto 파일을 이용해 생성한 gen/typescript
폴더를 본인의 웹 프로젝트 안으로 복사한 후 해당 폴더명을 pb로 바꿔줍니다.
특정 프론트 프레임워크에 종속되지 않도록 pure Typescript로 아주 간단한 클래스만 작성해보겠습니다. 본인이 선호하는 환경(angular, react ,vue, etc..)에서 아래의 코드를 이용해 서버에 접속해보세요.
|
|