Golang实现Resgate - 简单创建实时资源推送API

Golang实现Resgate - 简单创建实时资源推送API

Resgate

一个使用 Go 语言实现 RES 协议 的项目,采用 NATS 服务器 作为消息系统。
用于构建基于简单、无状态微服务的可扩展、弹性、可扩展且安全的客户端 API,为 Web 应用程序提供实时资源。

Resgate 是一个无关技术的 API 网关,通过处理订阅、资源缓存和访问控制等功能,使这一切成为可能。

像 REST 一样简单、无状态且可扩展,但具有实时资源。

快速开始

假设您已将 $GOPATH/bin 添加到 PATH 环境变量中。

安装并运行 NATS 服务器

go get github.com/nats-io/gnatsd
gnatsd

安装并运行 Resgate

go get github.com/jirenius/resgate
resgate

下载并运行您选择的语言的 Hello World 示例微服务:

运行示例客户端:

  • 使用 Chrome - 访问此 CodePen
  • 使用其他浏览器
    某些浏览器不允许从加密页面访问非加密的 WebSocket。
    使用 webpack 服务器或其他类似工具在本地运行 客户端 JavaScript

Web 资源

对于基于传统 REST 的客户端,可以使用普通的 HTTP GET 请求获取资源:

GET
http://localhost:8080/api/exampleService/myModel

可以使用 HTTP POST 请求调用方法:

POST
http://localhost:8080/api/exampleService/myModel/set

正文

{ "message": "通过 HTTP 更新" }

项目页面

更多信息和示例请访问:
GitHub GitHub

当前状态

我们已经在几个项目中愉快地成功使用了 resgate。我真心相信这个项目有很大的潜力!

现在是时候对其进行严格审查,看看它是否也能为其他人解决或简化 Push API 的创建。

任何反馈都将非常感激!


更多关于Golang实现Resgate - 简单创建实时资源推送API的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang实现Resgate - 简单创建实时资源推送API的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是基于Resgate框架使用Go语言实现实时资源推送API的详细示例,展示如何创建微服务来处理资源请求和实时更新。

1. 安装依赖和设置环境

首先,确保已安装Go和NATS服务器。按照提问内容中的步骤安装并运行NATS服务器和Resgate网关。

2. 创建Go微服务示例

以下是一个简单的Go微服务,它使用RES协议通过NATS与Resgate通信,提供实时资源更新。微服务将处理一个模型资源的获取和设置操作。

package main

import (
	"encoding/json"
	"log"
	"time"

	"github.com/nats-io/nats.go"
)

// 定义资源模型结构
type MyModel struct {
	Message string `json:"message"`
}

func main() {
	// 连接到NATS服务器
	nc, err := nats.Connect(nats.DefaultURL)
	if err != nil {
		log.Fatal("无法连接到NATS:", err)
	}
	defer nc.Close()

	// 订阅资源获取请求(例如:exampleService.myModel)
	sub, err := nc.Subscribe("get.exampleService.myModel", func(msg *nats.Msg) {
		log.Printf("收到资源获取请求: %s", msg.Subject)

		// 创建资源响应
		model := MyModel{Message: "Hello from Go微服务!"}
		data, err := json.Marshal(model)
		if err != nil {
			log.Printf("JSON序列化错误: %v", err)
			return
		}

		// 发送资源数据到Resgate
		resp := map[string]interface{}{
			"result": json.RawMessage(data),
		}
		respData, _ := json.Marshal(resp)
		msg.Respond(respData)
		log.Printf("资源响应已发送: %s", string(respData))
	})
	if err != nil {
		log.Fatal("订阅失败:", err)
	}
	defer sub.Unsubscribe()

	// 订阅资源设置请求(例如:exampleService.myModel.set)
	subSet, err := nc.Subscribe("call.exampleService.myModel.set", func(msg *nats.Msg) {
		log.Printf("收到方法调用请求: %s", msg.Subject)

		// 解析请求参数
		var req struct {
			Params map[string]interface{} `json:"params"`
		}
		if err := json.Unmarshal(msg.Data, &req); err != nil {
			log.Printf("请求解析错误: %v", err)
			return
		}

		// 更新资源数据
		newMessage, ok := req.Params["message"].(string)
		if !ok {
			log.Printf("无效的参数")
			return
		}
		model := MyModel{Message: newMessage}
		data, err := json.Marshal(model)
		if err != nil {
			log.Printf("JSON序列化错误: %v", err)
			return
		}

		// 发送更新事件到Resgate,通知资源变更
		eventData, _ := json.Marshal(map[string]interface{}{
			"values": map[string]interface{}{
				"message": newMessage,
			},
		})
		nc.Publish("event.exampleService.myModel.change", eventData)
		log.Printf("资源更新事件已发布: %s", string(eventData))

		// 响应方法调用成功
		resp := map[string]interface{}{
			"result": nil,
		}
		respData, _ := json.Marshal(resp)
		msg.Respond(respData)
		log.Printf("方法调用响应已发送")
	})
	if err != nil {
		log.Fatal("订阅设置方法失败:", err)
	}
	defer subSet.Unsubscribe()

	// 保持微服务运行
	log.Println("Go微服务已启动,等待请求...")
	select {} // 阻塞主线程
}

3. 运行和测试

  1. 保存上述代码为 main.go
  2. 在终端中运行微服务:
    go run main.go
    
  3. 确保NATS服务器和Resgate正在运行(如提问内容所述)。
  4. 使用HTTP客户端测试资源获取:
    • 执行GET请求:http://localhost:8080/api/exampleService/myModel
    • 预期响应:{"message":"Hello from Go微服务!"}
  5. 使用HTTP客户端测试方法调用:
    • 执行POST请求:http://localhost:8080/api/exampleService/myModel/set,正文为 {"message":"通过HTTP更新"}
    • 这将触发微服务更新资源,并通过Resgate推送实时事件到订阅的客户端。

4. 实时功能说明

  • 当资源更新时,微服务通过NATS发布事件(如 event.exampleService.myModel.change),Resgate会自动将变更推送给所有订阅的Web客户端。
  • 客户端可以使用WebSocket连接Resgate来接收实时更新,无需轮询。

此示例展示了Resgate如何简化实时API的构建,通过Go微服务处理资源状态和事件,实现高效的实时通信。

回到顶部