You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Golang连接Cosmos DB Gremlin(WSS)的可行示例与排障方案

Golang连接Azure Cosmos DB Gremlin服务的正确实现

问题分析

你遇到的websocket: bad handshake和内部服务器错误,核心原因是认证信息格式错误和手动干扰了库的自动认证流程。Cosmos DB Gremlin API对认证格式有严格要求,以下是修正后的实现方案。


方案1:主键认证(推荐)

使用账户主键+合法用户名格式实现认证,gremlingo库会自动生成符合要求的SAS Token,无需手动处理Authorization头。

package main

import (
	"fmt"
	gremlingo "github.com/apache/tinkerpop/gremlin-go/v3/driver"
	"time"
)

func createGremlinClientWithPrimaryKey() *gremlingo.DriverRemoteConnection {
	// 替换为你的Cosmos DB账户信息
	accountName := "<your-account-name>"
	databaseName := "<your-database-name>"
	containerName := "<your-container-name>"
	primaryKey := "<your-primary-key>"

	// 构建正确的Gremlin端点
	endpoint := fmt.Sprintf("wss://%s.cosmos.azure.com:443/gremlin", accountName)
	// 用户名必须严格遵循 /dbs/<数据库名>/colls/<容器名> 格式
	username := fmt.Sprintf("/dbs/%s/colls/%s", databaseName, containerName)

	client, err := gremlingo.NewDriverRemoteConnection(endpoint, func(settings *gremlingo.DriverRemoteConnectionSettings) {
		settings.TraversalSource = "g"
		settings.ConnectionTimeout = 45 * time.Second
		settings.AuthInfo = &gremlingo.AuthInfo{
			Username: username,
			Password: primaryKey,
			// 不需要手动设置Authorization头,库会自动生成SAS Token
		}
	})

	if err != nil {
		fmt.Printf("创建Gremlin客户端失败: %v\n", err)
		return nil
	}

	return client
}

func main() {
	client := createGremlinClientWithPrimaryKey()
	if client == nil {
		fmt.Println("客户端创建失败")
		return
	}
	defer client.Close()

	g := gremlingo.Traversal_().WithRemote(client)

	// 测试查询:统计顶点数量
	count, err := g.V().Count().Next()
	if err != nil {
		fmt.Printf("查询失败: %v\n", err)
		return
	}

	fmt.Printf("当前顶点数量: %d\n", *count)
}

方案2:连接字符串认证

直接使用Azure Portal获取的连接字符串,无需拆分账户信息,更简洁。

package main

import (
	"fmt"
	gremlingo "github.com/apache/tinkerpop/gremlin-go/v3/driver"
	"time"
)

func createGremlinClientWithConnectionString() *gremlingo.DriverRemoteConnection {
	// 替换为Azure Portal中复制的完整连接字符串
	connectionString := "Endpoint=wss://<your-account>.cosmos.azure.com:443/gremlin;Database=<your-db>;Collection=<your-container>;AuthKey=<your-primary-key>"

	client, err := gremlingo.NewDriverRemoteConnection(connectionString, func(settings *gremlingo.DriverRemoteConnectionSettings) {
		settings.TraversalSource = "g"
		settings.ConnectionTimeout = 45 * time.Second
	})

	if err != nil {
		fmt.Printf("创建Gremlin客户端失败: %v\n", err)
		return nil
	}

	return client
}

func main() {
	client := createGremlinClientWithConnectionString()
	if client == nil {
		fmt.Println("客户端创建失败")
		return
	}
	defer client.Close()

	g := gremlingo.Traversal_().WithRemote(client)

	// 测试添加顶点
	addErr := g.AddV("testVertex").Property("name", "sample").Iterate()
	if addErr != nil {
		fmt.Printf("添加顶点失败: %v\n", addErr)
		return
	}

	// 统计顶点数量
	count, err := g.V().Count().Next()
	if err != nil {
		fmt.Printf("查询失败: %v\n", err)
		return
	}

	fmt.Printf("当前顶点数量: %d\n", *count)
}

你之前代码的错误点

  1. 认证头错误:直接将主键放入Authorization头,Cosmos DB需要的是基于主键生成的SAS Token,而非原始主键。
  2. 用户名格式错误:必须是/dbs/<数据库名>/colls/<容器名>,不能仅写/dbs/g或空字符串。
  3. TLS配置冗余:无需设置InsecureSkipVerify: true,Azure的SSL证书是受信任的,跳过验证会引入安全风险。

额外注意事项

  • 确保Cosmos DB账户已启用Gremlin API,且目标数据库、容器已创建。
  • 检查网络防火墙是否允许出站访问443端口。
  • 使用最新版本的gremlingo库:go get github.com/apache/tinkerpop/gremlin-go/v3/driver@latest

内容的提问来源于stack exchange,提问作者user2006769

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:54:53