4267a229创建于 2024年8月2日历史提交
/*
    Copyright (c) [2023] [squallzhao]
    fountain is licensed under APACHE LICENSE, VERSION 2.0.
    You can use this software according to the terms and conditions of the APACHE LICENSE, VERSION 2.0.
    You may obtain a copy of APACHE LICENSE, VERSION 2.0 at: https://www.apache.org/licenses/LICENSE-2.0
*/
package microservice.registry;
import std.io.*
import encoding.json.*
import net.http.*
import microservice.trace.*

public class ConsulRegistry <: IRegistry{
    var cfg: Config = Config()
    let client = ClientBuilder().build()
    let localIp = getLocalIp()
    
    public func config(cfg: Config): IRegistry{
       this.cfg = cfg
       return this;
    }

    public func register(serviceName: String, port: Int64): Bool{
        var body = formatRegisterPost(serviceName,localIp,port)
        var b = ByteArrayStream()
        b.write(body.toArray())
        var req = HttpRequestBuilder().method("PUT")
            .url(cfg.url+"/v1/agent/service/register")
            .header("Content-Type","application/json")
            .body(b)
            .build()

        let v = client.send(req)
        return true
    }

    public func deregister(serviceName: String, port: Int64): Bool{
        var b = ByteArrayStream()
        b.write("".toArray())
        var req = HttpRequestBuilder().method("PUT")
            .url(cfg.url+"/v1/agent/service/deregister/"+localIp+":"+"${port}")
            .header("Content-Type","application/json")
            .body(b)
            .build()

        let v = client.send(req)
        return true
    }

    public func heartBeat(serviceName: String, port: Int64): Bool{
        var b = ByteArrayStream()
        b.write("".toArray())
        var req = HttpRequestBuilder().method("PUT")
            .url(cfg.url+"/v1/agent/check/pass/service:"+localIp+":"+"${port}")
            .header("Content-Type","application/json")
            .body(b)
            .build()

        let v = client.send(req)
        return true
    }

    public func discovery(serviceName: String): String{
        var req = HttpRequestBuilder().method("GET")
            .url(cfg.url+"/v1/health/service/"+serviceName+"?passing")
            .header("Content-Type","application/json")
            .header("Accept","application/json")
            .build()

        let v = client.send(req)
        //return String.fromUtf8(v.readToEnd())
        return StringReader(v.body).readToEnd()
    }

    func formatRegisterPost(serviceName:String, ipAddr:String, port:Int64):String{
        var instMap = JsonObject()
        instMap.put("ID", JsonString(ipAddr+":"+"${port}"))
        instMap.put("Name", JsonString(serviceName))
        instMap.put("Address",JsonString(ipAddr))
        instMap.put("Port",JsonString("${port}"))
        var checkMap = JsonObject()
        checkMap.put("Name",JsonString("check_"+serviceName))
        checkMap.put("Status",JsonString("passing"))
        checkMap.put("DeregisterCriticalServiceAfter",JsonString("3m"))
        checkMap.put("TTL",JsonString("150s"))

        instMap.put("Check",checkMap)
        return instMap.toJsonString()
   }
}