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 NacosRegistry <: 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 b = ByteArrayStream()
        b.write("".toArray())

        var req = HttpRequestBuilder().method("POST")
        .url(cfg.url+"/nacos/v1/ns/instance?serviceName="+serviceName+"&ip="+localIp+"&port={port}")
        .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("DELETE")
        .url(cfg.url+"/nacos/v1/ns/instance?serviceName="+serviceName+"&ip="+localIp+"&port={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 req = HttpRequestBuilder().method("GET")
        .url("/nacos/v1/ns/health/instance?serviceName="+serviceName)
        .header("Content-Type","application/json")
        .header("Accept","application/json")
        .build()

        let v = client.send(req)
        return true
    }
  
    public func discovery(serviceName: String): String{
        var req = HttpRequestBuilder().method("GET")
        .url("/nacos/v1/ns/instance/list?serviceName="+serviceName)
        .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()
    }
}