go 学习 之 HTTP微服务示例

1. 背景

学习ing

2. 创建文件:server.go

go 复制代码
```go
package main

import (
	"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端没什么差异,但是顶部多了一行代码:

go 复制代码
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. 创建文件:client.go

go 复制代码
package main

import (
	"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通过服务名称请求服务。

执行后

  • 客户端输出:

  • 服务端输出:

相关推荐
m4Rk_19 分钟前
【论文阅读】Agent 记忆机制(53):Experience-Following——为什么错误经验会在记忆中不断传播
论文阅读·人工智能·学习·开源·github
额,不知道写啥。1 小时前
从区间加一次函数到区间加多次函数最值-----区间数据结构与函数的一些东西(《浅谈函数最值的动态维护》的学习笔记)
数据结构·笔记·学习
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】Provider分析与实现
c++·人工智能·学习·面试·大模型·llm
浔溺9 小时前
al+大数据每日学习笔记26
笔记·学习
xx~t9 小时前
嵌入式——进程与线程1
linux·c语言·学习·嵌入式·进程与线程
西瓜很甜哟9 小时前
golang每日十题第2期
golang
老当益壮梁奶奶10 小时前
Linux软件编程学习笔记(七):线程分离与线程间通信详解
linux·c语言·c++·笔记·学习
我命由我1234511 小时前
UI 设计 7 种排列方式
xml·学习·ui·html·产品运营·产品经理·学习方法
常驻客栈12 小时前
B-深入理解计算机系统第3版之第8章:异常控制流
笔记·学习·常驻客栈·深入理解计算机系统·学习笔记‘’
lzhdim12 小时前
13、JavaScript事件循环机制 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript