golang云原生项目之:etcd服务注册与发现

这篇具有很好参考价值的文章主要介绍了golang云原生项目之:etcd服务注册与发现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

服务注册与发现: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 IP设置为 0.0.0.0

  1. 为什么Etcd的endpoints中的ip需要设置为:0.0.0.0而不是本机ip?

    • 原因:当你的服务器将 IP 地址设置为 0.0.0.0,并使用一个特定的端口号时,它可以通过监听所有网络接口包括本地计算机上的所有网络接口和外部计算机的公共 IP 地址来接受连接。这意味着来自互联网上其他计算机的请求可以通过公共 IP 地址和指定的端口号访问你的服务器
    • 而当你的服务器将 IP 地址设置为 127.0.0.1 或 localhost 时,它只会接受来自本地计算机的连接请求,不会监听其他计算机发起的连接请求。这意味着其他计算机或设备无法通过公共 IP 地址或局域网中的内部 IP 地址来访问你的服务器。
  2. 举例
    假设你的服务器在一个局域网中,拥有一个内部 IP 地址(例如 192.168.1.100),同时连接到了互联网并获得了一个公共 IP 地址(例如 203.0.113.10)。当你将服务器的 IP 地址设置为 0.0.0.0,并指定端口号为9000 时,其他计算机可以通过访问 “http://203.0.113.10:9000” 来连接到你的服务器。
    这时候自己服务器上的9000端口上的程序(如minio),就能被任何外网设备访问到了。而如果IP设置为192.168.1.100,外网访问"http://192.168.1.100:9000" 肯定是访问不到的。
    还有一个解决方案就是设置为公网的ip,如:#MinioEndpoint = "h2eonr2x.shenzhuo.vip:38854" 这里直接设置了当前主机当前端口的ip+port,外网设备能够直接访问自己服务器上minio的9000端口的minio服务。

  3. 外网能访问的解决方案
    除了将 IP 地址设置为 0.0.0.0,也可以将服务器的 IP 地址设置为本机对应的公共 IP 地址,以便外部网络也能够访问你的服务器。都是0.0.0.0方便,设置为公网的唯一IP还会依赖于服务商,可能还会发生变动。

4 案例

直接看例子就能大致明白;参考github网页:
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:文章来源地址https://www.toymoban.com/news/detail-665402.html

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)
	}
}

5 实际项目实现

5.1 client
  1. handler层接受到app发来的参数如:token、latest_time,根据文档规范封装为一个向后端发起的请求:FeedRequest.
  2. rpc远程调用server的Feed接口,返回目标结果
    golang云原生项目之:etcd服务注册与发现,golang,云原生,etcd
    • 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),                        // mux
		client.WithRPCTimeout(300*time.Second),             // rpc timeout
		client.WithConnectTimeout(300000*time.Millisecond), // conn timeout
		client.WithFailureRetry(retry.NewFailurePolicy()),  // retry
		client.WithSuite(tracing.NewClientSuite()),         // tracer 添加了一个追踪器,用于跟踪客户端的请求和响应
		client.WithResolver(resolver),                      // resolver
		// Please keep the same as provider.WithServiceName
		client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serverName}),
	)
	if err != nil {
		// TODO 思考应该直接panic吗
		log.Fatal(err)
	}
	videoClient = newClient
}
5.2 server
  1. 在一个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()
)
  1. 服务注册
    之前服务发现是NewEtcdResolver,现在注册是:r, err := etcd.NewEtcdRegistry([]string{etcdAddr}),将得到一个Registry类型的对象
    golang云原生项目之:etcd服务注册与发现,golang,云原生,etcd
  2. 调kitex自动生成的service的NewServer方法,注意使用上面拿到的Registry对象golang云原生项目之:etcd服务注册与发现,golang,云原生,etcd
  3. 上面的启动main方法已经将VideoServiceImpl注册好了,现在可以在脚手架中写具体的各个Impl的接口实现。
    golang云原生项目之:etcd服务注册与发现,golang,云原生,etcd

到了这里,关于golang云原生项目之:etcd服务注册与发现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Cloud Kubernetes】使用k8s原生service实现服务注册和发现

    @TOC 现在微服务开发模式应用的越来越广泛,注册中心 Eureka 也逐渐被其它注册中心产品替代,比如阿里出品的 Nacos 。随着云原生相关技术的普及, k8s 迅猛发展,我们把 K8s 中的 Pod 暴露给外部访问,通过少了 Service ,这也是今天的主角。 有没有发现,其实 Service 已经解决了

    2024年02月12日
    浏览(85)
  • golang/云原生/Docker/DevOps/K8S/持续 集成/分布式/etcd 教程

    3-6个月帮助学员掌握golang后端开发岗位必备技术点 教程时长: 150+小时 五大核心专栏,原理+源码+案例分析+项目实战直击工作岗位 golang:解决go语言编程问题 工程组件:解决golang工程化问题 分布式中间件:解决技术栈单一及分布式开发问题 云原生:解决云原生分布式部署及监

    2024年02月07日
    浏览(77)
  • 用coredns加etcd,搭建跨平台动态服务发现

    coredns ddns 服务发现 动态 service discovery 2023-0625 第一版 coredns被我喜爱的原因:跨平台,支持win,linux版同时使用。同时支持配置文件和etcd。 我用它来搭建动态服务发现。 coredns下载:内含win,linux版 https://github.com/coredns/coredns/releases 相关下载: https://gitee.com/chuanjiao10/powershe

    2024年02月10日
    浏览(47)
  • CoreDNS实战(二)-CoreDNS+ETCD实现DNS服务发现

    在前面的文章中讲了如何搭建一个内网的DNS服务,但是这里有个问题,mxsm-register.local表示局域网的注册中心域名,如果需要将每台部署了注册中心的IP地址写到CoreDNS的配置文件中。这样就需要每次都去修改 Corefile 配置文件。那有没有一种方式在服务启动后自动将注册中心所

    2024年02月04日
    浏览(40)
  • 服务注册与服务发现

    Eureka客户端:使用了@EnableEurekaClient注解的应用服务,如订单服务等,甚至Eureka本身也是一个客户端 Eureka服务端:使用了@EnableEurekaServer注解的应用服务,该服务提供了注册表以及对服务节点的操作 服务提供者:服务启动后,可以向注册中心发起register请求,将服务信息注册进

    2024年02月09日
    浏览(39)
  • eureka服务注册和服务发现

    我们要在orderservice中根据查询到的userId来查询user,将user信息封装到查询到的order中。 一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端

    2024年02月10日
    浏览(37)
  • 服务注册发现_搭建单机Eureka注册中心

    创建cloud-eureka-server7001模块 pom添加依赖 写yml文件 主启动类 测试 访问浏览器localhostL:7001 参数: Environment: 环境,默认为test,该参数在实际使用过程中,可以不用更改 Data center: 数据中心,使用的是默认的是 “MyOwn” Current time:当前的系统时间 Uptime:已经运行了多少时间

    2024年02月07日
    浏览(47)
  • Nacos:服务的注册、发现和配置中心(注册篇)

    Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 N

    2024年02月15日
    浏览(39)
  • 微服务之SpringCloud服务注册与发现

    目录 一,前言 二,Eureka实现服务注册与发现 单机Eureka服务注册流程 集群模式搭建模拟 Eureka自我保护机制 三,Zookeeper实现服务注册与发现 四,Consul是实现服务注册与发现 基本简介 安装 服务注册测试 ​五,三个注册中心的异同点 什么是服务治理 Spring Cloud 封装了Netflix公司

    2024年02月02日
    浏览(46)
  • 基于 Zookeeper 实现服务注册和服务发现

    无论是采用SOA还是微服务架构,都需要使用服务注册和服务发现组件。我刚开始接触 Dubbo 时一直对服务注册/发现以及 Zookeeper 的作用感到困惑,现在看来是因为对分布式系统的理解不够深入,对 Dubbo 和 Zookeeper 的工作原理不够清楚。 本文将基于 Zookeeper 实现服务注册和服务发

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包