如何使用Go语言优雅解析Kafka连接URI以获取用户名密码及主机信息
实现方案
用Go标准库net/url就能直接解析符合RFC 3986规范的URI,不需要引入任何第三方依赖,代码简洁可靠。
示例代码
package main import ( "fmt" "net/url" ) // 解析kafka连接URI,返回用户名、密码、主机地址 func parseKafkaURI(uriStr string) (username, password, hostAddr string, err error) { // 1. 标准库解析URI uri, err := url.Parse(uriStr) if err != nil { return "", "", "", fmt.Errorf("parse uri failed: %w", err) } // 可选:校验scheme是否为kafka,避免传入其他类型的地址 if uri.Scheme != "kafka" { return "", "", "", fmt.Errorf("unsupported scheme: %s, expected kafka", uri.Scheme) } // 2. 提取用户名和密码 if uri.User != nil { username = uri.User.Username() password, _ = uri.User.Password() } // 3. 提取主机地址,直接返回ip:port格式的内容 hostAddr = uri.Host return } func main() { // 模拟从etcd读取到的配置 kafkaURI := "kafka://user:passwd@10.10.172.222:9092?mechanism=PLAIN&protocol=SASL_PLAINTEXT" user, pwd, addr, err := parseKafkaURI(kafkaURI) if err != nil { panic(err) } fmt.Printf("用户名:%s\n密码:%s\n主机地址:%s\n", user, pwd, addr) }
补充说明
- 如果你的配置存在多broker地址,比如
kafka://user:passwd@10.10.172.222:9092,10.10.172.223:9092?xxx格式,uri.Host也会完整返回逗号分隔的所有地址,需要拆分的话自行用strings.Split(addr, ",")处理即可 - 如果需要获取URI后的参数,直接调用
uri.Query().Get("mechanism")就能拿到对应参数值
内容的提问来源于stack exchange,提问作者CharmCcc
相关产品推荐
相关产品推荐

