gomall项目中遇到的一些问题 | 豆包MarsCode AI刷题

236 阅读2分钟

gomall项目中遇到的一些问题

使用etcd实现服务发现

etcdRegistry, err := etcd.NewEtcdRegistry([]string{
    "localhost:2379", "localhost:2369", "localhost:2359"})
if err != nil {
    log.Fatal(err)
}

addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8888")

itemServiceImpl := new(ItemServiceImpl)

svr := item.NewServer(itemServiceImpl,
    server.WithServiceAddr(addr),
    server.WithRegistry(etcdRegistry),
    server.WithServerBasicInfo(
        &rpcinfo.EndpointBasicInfo{
                ServiceName: "example.item", //
        }),
)

server.WithServiceAddr(addr)注释或者将addr设置为0.0.0.0:8888后,etcd查询的结果的address从127.0.0.1:8888变成了169.254.64.52:8888,然后使用客户端获取服务时,报错:[happened in biz handler, method=ItemService.GetItem, please check the panic at the server side] service discovery error: no instance remains for exmaple.item。

网上搜到是,当计算机试图通过DHCP从网络服务器获取IP地址但失败时,操作系统会自动生成一个169.254.x.x范围内的IP地址。此措施保证即便没有获得网络管理员分配的IP地址,计算机在本地网络仍保持通信能力。

使用consul实现服务发现

服务的安全检查一直失败,且没有报错输出。

f59b8d19225ef0472b9897e2ea61795.png

在Docker Desktop发现是consul节点无法与宿主机的服务程序构建tcp通信,报错时cannot dia tcp ....., timeout

可以在docker-compose.yml中为consul添加network_mode: "host",将容器的网络模式改成host模式。

使用opentelemetry实现链路追踪

为数据库添加链路组件

// in app/cart/biz/dal/mysql/init.go
if err := DB.Use(tracing.NewPlugin(tracing.WithoutMetrics())); err != nil {
    panic(err)
}

随后运行对应服务,报错

# go.opentelemetry.io/otel/sdk/metric
C:\Users\YiD11\go\pkg\mod\go.opentelemetry.io\otel\sdk\metric@v1.25.0\meter.go:65:22: cannot use (*meter)(nil) (value of type *meter) as "go.opentelemetry.io/otel/metric".Meter value in variable declaration: *meter does not implement "go.opentelemetry.io/otel/metric".Meter (missing method Float64Gauge)
C:\Users\YiD11\go\pkg\mod\go.opentelemetry.io\otel\sdk\metric@v1.25.0\provider.go:90:9: cannot use mp.meters.Lookup(s, func() *meter {…}) (value of type *meter) as "go.opentelemetry.io/otel/metric".Meter value in return statement: *meter does not implement "go.opentelemetry.io/otel/metric".Meter (missing method Float64Gauge)

随后在Github的Collector with custom plugins compilation broken · Issue #11485 · open-telemetry/opentelemetry-collector中发现了是版本mismatch的问题

image.png

报错时,go.mod文件中内容为

go.opentelemetry.io/otel/sdk v1.32.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.25.0 // indirect

go依赖库版本版本选择逻辑为:首个不冲突的版本,而非最新的版本,因此mismatch时需手动将版本提高到最新。

将版本统一为v1.32.0后便可跑通。

Kubernestes拉取镜像

使用kind启动单机测集群后,在拉取远端仓库的镜像时被墙,即便宿主机挂梯子,容器端也无法访问。

可以先用宿主机的docker通过梯子拉去镜像,然后再将镜像加载到kind集群中:

kind load docker-image --name gomall-dev hashicorp/consul:latest

或者为每一个容器配置代理的环境变量

spec:
    containers:
    - env:
        - name: HTTP_PROXY
          value: "http://proxy.example.com:7890/"
        - name: HTTPS_PROXY
          value: "HTTPS_PROXY=https://proxy.example.com:7890/"
        - name: http_proxy
          value: "http://proxy.example.com:7890/"
        - name: https_proxy
          value: "HTTPS_PROXY=https://proxy.example.com:7890/"
        - name: no_proxy
          value: "localhost,127.0.0.1"

或者使用国内镜像源。