宣传手册设计模板,外贸网站谷歌优化,有哪些做设计交易网站有哪些内容,ui设计通常是指服务注册与发现#xff1a;ETCD
1直接调包
kitex-contrib#xff1a; 上面有实现的案例#xff0c;直接cv。下面是具体的理解
2 相关概念 EtcdResolver: etcd resolver是一种DNS解析器#xff0c;用于将域名转换为etcd集群中的具体地址#xff0c;以便应用程序可以与et…服务注册与发现ETCD
1直接调包
kitex-contrib 上面有实现的案例直接cv。下面是具体的理解
2 相关概念 EtcdResolver: etcd resolver是一种DNS解析器用于将域名转换为etcd集群中的具体地址以便应用程序可以与etcd集群进行通信。etcd是一个分布式键值存储系统常用于服务发现、配置共享和分布式锁等应用场景。通过使用etcd resolver应用程序可以更方便地与etcd集群交互 endpoints 用于指定集群的地址列表.例如etcd1.example.com:2379, etcd2.example.com:2379。应用程序将通过这些地址与etcd集群的各个节点进行通信以读取和更新数据。
3 案例
直接看例子就能大致明白 client
func main() {r, err : etcd.NewEtcdResolver([]string{127.0.0.1:2379})if err ! nil {log.Fatal(err)}client : hello.MustNewClient(Hello, client.WithResolver(r))for {ctx, cancel : context.WithTimeout(context.Background(), time.Second*3)resp, err : client.Echo(ctx, api.Request{Message: Hello})cancel()if err ! nil {log.Fatal(err)}log.Println(resp)time.Sleep(time.Second)}
}server
type HelloImpl struct{}func (h *HelloImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {resp api.Response{Message: req.Message,}return
}func main() {r, err : etcd.NewEtcdRegistry([]string{127.0.0.1:2379})if err ! nil {log.Fatal(err)}server : hello.NewServer(new(HelloImpl), server.WithRegistry(r), server.WithServerBasicInfo(rpcinfo.EndpointBasicInfo{ServiceName: Hello,}))err server.Run()if err ! nil {log.Fatal(err)}
}4 实际项目实现
4.1 client
handler层接受到app发来的参数如token、latest_time根据文档规范封装为一个向后端发起的请求FeedRequest.rpc远程调用server的Feed接口返回目标结果 rpc调用的Feed实际上先调用了kitex自动生成的client通过client与server通信实现调用server的接口。kitex自动生成的client需要在使用前初始化比如进行服务与发现 具体来说client又需要注册中心的resolver拿到resolver的办法就 etcd.NewEtcdResolver([]string{etcdAddr})传入endpoint就可以直接拿到reslover 下面是初始化client的例子
// InitVideo
// 在构建client和server通信之前先关注连通性
func InitVideo(viperConfig *viper.ConfigViper) {etcdAddr : fmt.Sprintf(%s:%d, viperConfig.Viper.GetString(etcd.host), viperConfig.Viper.GetString(etcd.port))resolver, err2 : etcd.NewEtcdResolver([]string{etcdAddr})if err2 ! nil {log.Fatal(err2)}serverName : viperConfig.Viper.GetString(server.name) //指定客户端所连接的服务的名称newClient, err : videoservice.NewClient(serverName,//client.WithMiddleware(middleware.CommonMiddleware),//client.WithInstanceMW(middleware.ClientMiddleware), //实例级别的中间件。这个中间件可能会对客户端的每个请求进行预处理或后处理client.WithMuxConnection(1), // muxclient.WithRPCTimeout(300*time.Second), // rpc timeoutclient.WithConnectTimeout(300000*time.Millisecond), // conn timeoutclient.WithFailureRetry(retry.NewFailurePolicy()), // retryclient.WithSuite(tracing.NewClientSuite()), // tracer 添加了一个追踪器用于跟踪客户端的请求和响应client.WithResolver(resolver), // resolver// Please keep the same as provider.WithServiceNameclient.WithClientBasicInfo(rpcinfo.EndpointBasicInfo{ServiceName: serverName}),)if err ! nil {// TODO 思考应该直接panic吗log.Fatal(err)}videoClient newClient
}4.2 server
在一个server运行的时候main是入口所以需要在main中将自己的服务注册到etcd中 先通过viper的init方法搜索到对于的配置文件加载到对象config中
var (config viper.Init(video)serviceName config.Viper.GetString(server.name)serviceAddr fmt.Sprintf(%s:%d, config.Viper.GetString(server.host), config.Viper.GetInt(server.port))etcdAddr fmt.Sprintf(%s:%d, config.Viper.GetString(etcd.host), config.Viper.GetInt(etcd.port))signingKey config.Viper.GetString(JWT.signingKey)logger zap.InitLogger()
)服务注册 之前服务发现是NewEtcdResolver现在注册是r, err : etcd.NewEtcdRegistry([]string{etcdAddr})将得到一个Registry类型的对象 调kitex自动生成的service的NewServer方法,注意使用上面拿到的Registry对象上面的启动main方法已经将VideoServiceImpl注册好了现在可以在脚手架中写具体的各个Impl的接口实现。