더북(TheBook)

로그를 처리할 마이크로서비스가 준비되었습니다. 이제 모든 마이크로서비스의 부모 클래스를 수정해 로그 관리 마이크로서비스에 API 요청 로그를 남기도록 합니다.

코드 12-2 Server 클래스 로그 처리 기능 추가

예제 파일 : server.js

class tcpServer {
    constructor(name, port, urls) {
        this.logTcpClient = null; // ➊ 그 관리 마이크로서비스 연결 클라이언트

......

        socket.on('data', (data) => {
            var key = socket.remoteAddress + ":" + socket.remotePort;
            var sz = this.merge[key] ? this.merge[key] + data.toString() :
                data.toString();
            var arr = sz.split('¶');
            for (var n in arr) {
                if (sz.charAt(sz.length - 1) != '¶' && n == arr.length - 1) {
                    this.merge[key] = arr[n];
                    break;
                } else if (arr[n] == "") {
                    break;
                } else {
                    this.writeLog(arr[n]); // ➋ equest 로그
                    this.onRead(socket, JSON.parse(arr[n]));
                }
            }
        });
    });

......

    connectToDistributor(host, port, onNoti) {

......

        this.clientDistributor = new tcpClient(
            host
            , port
            , (options) => {
                isConnectedDistributor = true;
                this.clientDistributor.write(packet);
            }
            , (options, data) => {

           // ➌ 그 관리 마이크로서비스 연결
            if (this.logTcpClient == null && this.context.name != 'logs') {
                for (var n in data.params) {
                    const ms = data.params[n];
                    if (ms.name == 'logs') {
                        this.connectToLog(ms.host, ms.port);
                        break;
                    }
                }
            }
            onNoti(data);
            }               // Distributor 데이터 수신 이벤트
            // Distributor 접속 종료 이벤트
            , (options) => { isConnectedDistributor = false; }
            // Distributor 통신 에러 이벤트
            , (options) => { isConnectedDistributor = false; }
        );
        
        ......
    }
    
    connectToLog(host, port) { // ➍ 그 관리 마이크로서비스 연결
        this.logTcpClient = new tcpClient(
            host
            , port
            , (options) => {}
            , (options) => { this.logTcpClient = null; }
            , (options) => { this.logTcpClient = null; }
        );
        this.logTcpClient.connect();
    }
    
    writeLog(log) { // ➎ 그 패킷 전달
        if (this.logTcpClient) {
            const packet = {
                uri: "/logs",
                method: "POST",
                key: 0,
                params: log
            };
            this.logTcpClient.write(packet);
        } else {
            console.log(log);
        }
    }
}

module.exports = tcpServer;

로그 관리 마이크로서비스 연결용 tcpClient 변수를 선언합니다(). API가 호출되면 자식 프로세스에 전달하기 전에 먼저 로그 관리 마이크로서비스로 로그를 전달합니다. 이때 아직 로그 관리 마이크로서비스가 준비되지 않았으면 화면에 로그를 출력합니다(, ). Distributor에서 로그 관리 마이크로서비스가 접속했다는 정보를 받으면 접속 정보를 이용해 로그 관리 마이크로서비스로 접속을 시도합니다(, ).

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.