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实现服务发现
服务的安全检查一直失败,且没有报错输出。
在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的问题
报错时,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"
或者使用国内镜像源。