按照 Nex 的理解,“服务”仅仅是一个长期运行的进程。一个服务需要启动(例如,它有一个 main 函数/入口点),并且需要持续运行,直到宿主环境通知它停止运行。
创建一个 NATS 服务
在此示例中,我们将使用 Go 来创建一个简单的可执行文件。我们将使用 NATS 服务框架 来暴露一个端点,以实现服务发现。
打开您喜欢的编辑器,并编辑一个名为 main.go 的文件,内容如下:
packagemainimport("context""fmt""os""strings""github.com/nats-io/nats.go"services"github.com/nats-io/nats.go/micro")funcmain(){ctx:=context.Background()natsUrl:=os.Getenv("NATS_URL")iflen(strings.TrimSpace(natsUrl))==0{natsUrl=nats.DefaultURL}fmt.Printf("Echo service using NATS url '%s'\n",natsUrl)nc,err:=nats.Connect(natsUrl)iferr!=nil{panic(err)}// request handlerechoHandler:=func(reqservices.Request){req.Respond(req.Data())}fmt.Println("Starting echo service")_,err=services.AddService(nc,services.Config{Name:"EchoService",Version:"1.0.0",// base handlerEndpoint:&services.EndpointConfig{Subject:"svc.echo",Handler:services.HandlerFunc(echoHandler),},})iferr!=nil{panic(err)}<-ctx.Done()}
无论您选择如何解决依赖关系(例如,使用 go.mod 文件),您都需要安装 Go 的 NATS 客户端 SDK:
$ nats req svc.echo 'this is a test'
17:10:53 Sending request on "svc.echo"
17:10:53 Received with rtt 567.537µs
this is a test
$ nats service ls
╭──────────────────────────────────────────────────────────────╮
│ All Services │
├─────────────┬─────────┬────────────────────────┬─────────────┤
│ Name │ Version │ ID │ Description │
├─────────────┼─────────┼────────────────────────┼─────────────┤
│ EchoService │ 1.0.0 │ 8GGpcCv98xgoGb5VUDRAl8 │ │
╰─────────────┴─────────┴────────────────────────┴─────────────╯
$ CGO_ENABLED=0 go build -tags netgo -ldflags '-extldflags "-static"'
$ file echoservice
echoservice: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=XXFUNOXfjIEOepi2cW-o/gnDMAXpM9aha9OAEsvLi/XPLmCOsZsF3NATJ_-Zkt/71yl5VaZNDY-jsIhJkcc, with debug_info, not stripped