Go

mac2022-06-30  19


title: go-go-micro服务发现etcd categories: Go tags: [go, 微服务, etcd, 服务发现, 分布式] date: 2019-10-02 15:42:57 comments: false

go-go-micro服务发现etcd


前篇

官方 GitHub - https://github.com/etcd-io/etcd下载 - https://github.com/etcd-io/etcd/releases

etcd

ETCD应用场景 - https://tonydeng.github.io/2015/10/19/etcd-application-scenarios/

etcd简介与应用场景

etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点:

简单: 基于HTTP+JSON的API让你可以用CURL命令就可以轻松使用。安全: 可以选择SSL客户认证机制。快速: 每个实例每秒支持一千次写操作。可信: 使用 Ralf 算法充分实现了分布式。

服务注册与发现

服务启动后向etcd注册,并上报自己的监听的端口以及当前的权重因子等信息,且对该信息设置ttl值。服务在ttl的时间内周期性上报权重因子等信息。client端调用服务时向etcd获取信息,进行调用,同时监听该服务是否变化(通过watch方法实现)。当新增服务时watch方法监听到变化,将服务加入代用列表,当服务挂掉时ttl失效,client端检测到变化,将服务踢出调用列表,从而实现服务的动态扩展。另一方面,client端通过每次变化获取到的权重因子来进行client端的加权调用策略,从而保证后端服务的负载均衡。

共享配置

一般服务启动时需要加载一些配置信息,如数据库访问地址,连接配置,这些配置信息每个服务都差不多,如果通过读取配置文件进行配置会存在要写多份配置文件,且每次更改时这些配置文件都要更改,且更改配置后,需要重启服务后才能生效,这些无疑让配置极不灵活,如果将配置信息放入到 etcd 中,程序启动时进行加载并运行,同时监听配置文件的更改,当配置文件发生更改时,自动将旧值替换新值,这样无疑简化程序配置,更方便于服务部署。


windows 安装 etcd

安装etcd+golang操作etcd - https://blog.csdn.net/c_circle/article/details/98473421官网下载 - https://github.com/etcd-io/etcd/releases

双击 etcd.exe 运行

测试一下

D:\etcd-v3.4.1-windows-amd64 λ etcdctl put aaa 123 OK D:\etcd-v3.4.1-windows-amd64 λ etcdctl get aaa aaa 123

命令行工具 etcdctl

etcd 命令

etcdctl的使用[v3版本] - https://blog.csdn.net/huwh_/article/details/80225902etcd 命令行 - https://www.cnblogs.com/breg/p/5756558.html

默认是使用v2的api,如果想使用v3 api每次打开窗口都需要敲一行命令

查看所有key
$ etcdctl get "" --prefix=true // 或者 etcdctl get "" --from-key /micro-registry/go.micro.api.greeter/go.micro.api.greeter-6100cc35-6aa8-41ef-b3f1-58be8e5a88fe /micro-registry/go.micro.api.greeter/go.micro.api.greeter-a06d7576-8649-4fd1-8222-8c22d39cf49c /micro-registry/go.micro.api/go.micro.api-b3bec087-8121-4c31-8404-0e6325f51cf3 /micro-registry/go.micro.srv.greeter/go.micro.srv.greeter-716e56df-9f64-4b8a-be2e-d94e448fcc3b /micro-registry/go.micro.srv.greeter/go.micro.srv.greeter-a051b690-fbf2-4190-8a90-aebc2038e494

启动参数说明

参数说明–nameetcd 集群中的节点名,这里可以随意,可区分且不重复就行–listen-peer-urls监听的用于 etcd 节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)–initial-advertise-peer-urls建议用于节点之间通信的url,节点间将以该值进行通信。–listen-client-urls监听的用于 go等 客户端通信的url,同样可以监听多个。–advertise-client-urls建议使用的客户端通信url, 该值用于 etcd 代理或 etcd 成员与 etcd 节点通信。–initial-cluster-token etcd-cluster-1节点的 token 值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相同配置文件再启动一个集群时,只要该 token 值不一样,etcd集群就不会相互影响。–initial-cluster也就是集群中所有的initial-advertise-peer-urls 的合集–initial-cluster-state new新建集群的标志

集群

etcd 集群搭建及常用场景分析 - https://blog.csdn.net/u010511236/article/details/52386229etcd集群搭建 - http://ju.outofmemory.cn/entry/317179ETCD单机部署与ETCD集群部署 - https://blog.csdn.net/weixin_34293141/article/details/91839896ETCD集群部署流程 (含证书) - https://blog.csdn.net/WangYouJin321/article/details/80417622etcd v3 服务注册与发现 Go代码 - https://www.cnblogs.com/sevenPP/p/8149890.html 对应仓库 - https://github.com/moonlong/etcd-discovery
本机模拟集群 (静态配置)
etcd 的 go sdk 的使用方法:etcd/clientv3,选举 leader 的方法 (可以跑) - https://www.lijiaocn.com/编程/2019/06/19/etcd-go-sdk-clientv3-usage.html

三个 etcd 的服务地址分别是:

127.0.0.1:2379 127.0.0.1:12380 // infra1 127.0.0.1:22379 127.0.0.1:22380 // infra2 127.0.0.3:32379 127.0.0.2:32380 // infra2

启动三个 etcd 服务. go 客户端连端口是 client, etcd 服务之间的通信的端口是 peer

// infra1 $ etcd --name infra1 \ --listen-client-urls http://127.0.0.1:2379 \ --advertise-client-urls http://127.0.0.1:2379 \ --listen-peer-urls http://127.0.0.1:12380 \ --initial-advertise-peer-urls http://127.0.0.1:12380 \ --initial-cluster-token etcd-cluster-1 --initial-cluster \infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380 \ --initial-cluster-state new \ --enable-pprof // infra2 $ etcd --name infra2 \ --listen-client-urls http://127.0.0.1:22379 \ --advertise-client-urls http://127.0.0.1:22379 \ --listen-peer-urls http://127.0.0.1:22380 \ --initial-advertise-peer-urls http://127.0.0.1:22380 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster \infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380 \ --initial-cluster-state new \ --enable-pprof // infra3 $ etcd --name infra3 \ --listen-client-urls http://127.0.0.1:32379 \ --advertise-client-urls http://127.0.0.1:32379 \ --listen-peer-urls http://127.0.0.1:32380 \ --initial-advertise-peer-urls http://127.0.0.1:32380 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster \infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380 \ --initial-cluster-state new \ --enable-pprof

查看集群

$ etcdctl member list 8211f1d0f64f3269, started, infra1, http://127.0.0.1:12380, http://127.0.0.1:2379, false 91bc3c398fb3c146, started, infra2, http://127.0.0.1:22380, http://127.0.0.1:22379, false fd422379fda50e48, started, infra3, http://127.0.0.1:32380, http://127.0.0.1:32379, false

go 客户端测试.

运行 监听. test_etcdv3_03_watch.go.

运行 put get. test_etcdv3_03_put-get.go.


不同机子集群 (静态配置)

不同ip机子的启动示例. 参考: 浅入深出ETCD之【集群部署与golang客户端使用】 - https://www.jianshu.com/p/600f14e9e443

// 192.168.4.224 $ ./etcd --name infra0 \ --initial-advertise-peer-urls http://192.168.4.224:2380 \ --listen-peer-urls http://192.168.4.224:2380 \ --listen-client-urls http://192.168.4.224:2379,http://127.0.0.1:2379 \ --advertise-client-urls http://192.168.4.224:2379 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster infra0=http://192.168.4.224:2380,infra1=http://192.168.4.225:2380,infra2=http://192.168.4.226:2380 \

–initial-cluster-state new

// 192.168.4.225 $ ./etcd --name infra1 \ --initial-advertise-peer-urls http://192.168.4.225:2380 \ --listen-peer-urls http://192.168.4.225:2380 \ --listen-client-urls http://192.168.4.225:2379,http://127.0.0.1:2379 \ --advertise-client-urls http://192.168.4.225:2379 \ --initial-cluster-token etcd-cluster-1 \

–initial-cluster infra0=http://192.168.4.224:2380,infra1=http://192.168.4.225:2380,infra2=http://192.168.4.226:2380 –initial-cluster-state new

// 192.168.4.226 $ ./etcd --name infra2 \ --initial-advertise-peer-urls http://192.168.4.226:2380 \ --listen-peer-urls http://192.168.4.226:2380 \ --listen-client-urls http://192.168.4.226:2379,http://127.0.0.1:2379 \ --advertise-client-urls http://192.168.4.226:2379 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster infra0=http://192.168.4.224:2380,infra1=http://192.168.4.225:2380,infra2=http://192.168.4.226:2380 \ --initial-cluster-state new ```
动态配置
etcd集群搭建 - http://ju.outofmemory.cn/entry/317179 - 五、动态配置

go-micro 使用 etcd

一个go-micro的demo - https://studygolang.com/articles/21340

测试代码 test_etcdv3.go

package main import ( "github.com/micro/go-micro" "github.com/micro/go-plugins/registry/etcdv3" "log" "time" ) func main() { registre := etcdv3.NewRegistry() service := micro.NewService( micro.Registry(registre), micro.Name("greeter"), micro.RegisterTTL(time.Second*30), micro.RegisterInterval(time.Second*15), ) service.Init() if err := service.Run(); err != nil { log.Fatal(err) } }

修改 etcdv3 仓库引用. 参考: https://zhuanlan.zhihu.com/p/79897640. 不然会报错: etcd auth.go too many errors

需要修改 GoWinEnv\src\github.com\micro\go-plugins\registry\etcdv3 下的几个文件. 修改仓库引用 github.com/coreos/etcd/clientv3 为 go.etcd.io/etcd/clientv3

watcher.go

// "github.com/coreos/etcd/clientv3" // 去掉 "go.etcd.io/etcd/clientv3" // 新加

etcdv3.go

// "github.com/coreos/etcd/clientv3" // 去掉 "go.etcd.io/etcd/clientv3" // 新加 // "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" // 去掉 "go.etcd.io/etcd/etcdserver/api/v3rpc/rpctypes" // 新加

删掉 GoWinEnv\src\go.etcd.io\etcd\vendor 路径下的 golang.org 目录. 不然运行时会报错: You may have two independent copies of golang.org/x/net/trace in your binary

运行测试. go run

> go run e:\ws_go\GoWinEnv\src\GoMicro\test_etcdv3\test_etcdv3.go < 2019-10-02 20:11:26.000556 I | Transport [http] Listening on [::]:4759 2019-10-02 20:11:26.001528 I | Broker [http] Connected to [::]:4760 2019-10-02 20:11:26.018482 I | Registry [etcdv3] Registering node: greeter-e4715ce2-9522-499e-9b12-07f100e56786

micro 工具包集成 etcd

https://github.com/micro-in-cn/tutorials/tree/master/examples/basic-practices/micro-registry/etcdv3

踩坑

etcd auth.go too many errors

参考: https://zhuanlan.zhihu.com/p/79897640

修改 etcdv3 仓库引用

报错: You may have two independent copies of golang.org/x/net/trace in your binary

参考:

https://blog.csdn.net/wo252618378/article/details/93677059https://segmentfault.com/a/1190000014501241

启动 etcd 报错: Only one usage of each socket address (protocol/network address/port) is normally permitted

可能使用的本机地址是 localhost, 换成 127.0.0.1 试试

最新回复(0)