1. 背景
学习ing
2. 创建文件:server.go
```go
package mainimport ("github.com/gogf/gf/contrib/registry/file/v2""github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/net/ghttp""github.com/gogf/gf/v2/net/gsvc""github.com/gogf/gf/v2/os/gfile"
)func main() {gsvc.SetRegistry(file.New(gfile.Temp("gsvc")))s := g.Server(`hello.svc`)s.BindHandler("/", func(r *ghttp.Request) {g.Log().Info(r.Context(), `request received`)r.Response.Write(`Hello world`)})s.Run()
}
由此可见,一个HTTP的微服务端和一个普通的Web Server端没什么差异,但是顶部多了一行代码:
gsvc.SetRegistry(file.New(gfile.Temp("gsvc")))
-
gsvc 是 GF (Go Frame) 框架中的微服务治理模块,用于处理服务注册、发现、负载均衡等功能。
-
SetRegistry 是一个全局函数,用于设置微服务的注册中心。这意味着所有后续创建的服务实例将使用这个注册中心来注册自己,以便于服务发现和治理。
-
file.New(gfile.Temp(“gsvc”))是基于本地系统文件的服务注册发现组件,其中的gfile.Temp(“gsvc”)指定的是存放服务文件的路径,例如在Linux/MacOS系统下,指向的是/tmp/gsvc目录。基于文件系统的注册发现仅用于本地微服务示例,不能用于跨节点通信。
在该示例中,给Server设置了一个名字hello.svc,该名字表示该Server绑定的微服务的名称,服务名称作为微服务的唯一标识,用于服务间的识别通信。当服务注册组件注册启用时,HTTP Server在运行时将会把自己的访问地址注册到服务注册组件中,方便其他服务通过相同组件按照服务名称进行访问。
3. 创建文件:server.go
package mainimport ("time""github.com/gogf/gf/contrib/registry/file/v2""github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/net/gsvc""github.com/gogf/gf/v2/os/gctx""github.com/gogf/gf/v2/os/gfile"
)func main() {gsvc.SetRegistry(file.New(gfile.Temp("gsvc")))client := g.Client()for i := 0; i < 10; i++ {ctx := gctx.New()res, err := client.Get(ctx, `http://hello.svc/`)if err != nil {panic(err)}g.Log().Debug(ctx, res.ReadAllString())res.Close()time.Sleep(time.Second)}
}
客户端通过g.Client()创建一个HTTP Client,并通过http://hello.svc/地址访问服务端,其中的hello.svc即先前的Server端绑定的微服务名称。当客户端通过微服务名称访问的时候,服务注册发现组件将会在底层进行检索,并找到对应的服务端地址进行通信。
4. 执行结果
- 先执行server.go服务端运行一个简单的服务,随后再执行client.go通过服务名称请求服务。
执行后
-
客户端输出:
-
服务端输出: