详解golang consul-grpc 服务注册与发现

在微服务架构里面,每个小服务都是由很多节点组成,节点的添加删除故障希望能对下游透明,因此有必要引入一种服务的自动注册和发现机制,而 consul 提供了完整的解决方案,并且内置了对 GRPC 以及 HTTP 服务的支持

总体架构

  1. 服务调用: client 直连 server 调用服务
  2. 服务注册: 服务端将服务的信息注册到 consul 里
  3. 服务发现: 客户端从 consul 里发现服务信息,主要是服务的地址
  4. 健康检查: consul 检查服务器的健康状态

服务注册

服务端将服务信息注册到 consul 里,这个注册可以在服务启动可以提供服务的时候完成

完整代码参考: https://github.com/hatlonely/hellogolang/blob/master/sample/addservice/internal/grpcsr/consul_register.go

config := api.DefaultConfig()
config.Address = r.Address
client, err := api.NewClient(config)
if err != nil {
 panic(err)
}
agent := client.Agent()

IP := localIP()
reg := &api.AgentServiceRegistration{
  ID:  fmt.Sprintf("%v-%v-%v", r.Service, IP, r.Port), // 服务节点的名称
  Name: fmt.Sprintf("grpc.health.v1.%v", r.Service), // 服务名称
  Tags: r.Tag,           // tag,可以为空
  Port: r.Port,           // 服务端口
  Address: IP,            // 服务 IP
  Check: &api.AgentServiceCheck{  // 健康检查
   Interval: r.Interval.String(), // 健康检查间隔
   // grpc 支持,执行健康检查的地址,service 会传到 Health.Check 函数中
   GRPC:  fmt.Sprintf("%v:%v/%v", IP, r.Port, r.Service),
   DeregisterCriticalServiceAfter: r.DeregisterCriticalServiceAfter.String(), // 注销时间,相当于过期时间
  },
 }

if err := agent.ServiceRegister(reg); err != nil {
 panic(err)
}

服务发现

客户端从 consul 里发现服务信息,主要是服务的地址

完整代码参考: https://github.com/hatlonely/hellogolang/blob/master/sample/addservice/internal/grpclb/consul_resolver.go

services, metainfo, err := w.client.Health().Service(w.service, "", true, &api.QueryOptions{
 WaitIndex: w.lastIndex, // 同步点,这个调用将一直阻塞,直到有新的更新
})
if err != nil {
 logrus.Warn("error retrieving instances from Consul: %v", err)
}
w.lastIndex = metainfo.LastIndex

addrs := map[string]struct{}{}
for _, service := range services {
 addrs[net.JoinHostPort(service.Service.Address, strconv.Itoa(service.Service.Port))] = struct{}{}
}

健康检查

consul 检查服务器的健康状态,consul 用 google.golang.org/grpc/health/grpc_health_v1.HealthServer 接口,实现了对 grpc健康检查的支持,所以我们只需要实现先这个接口,consul 就能利用这个接口作健康检查了

完整代码参考: https://github.com/hatlonely/hellogolang/blob/master/sample/addservice/cmd/server/main.go

// HealthImpl 健康检查实现
type HealthImpl struct{}

// Check 实现健康检查接口,这里直接返回健康状态,这里也可以有更复杂的健康检查策略,比如根据服务器负载来返回
func (h *HealthImpl) Check(ctx context.Context, req *grpc_health_v1.HealthCheckRequest) (*grpc_health_v1.HealthCheckResponse, error) {
 return &grpc_health_v1.HealthCheckResponse{
  Status: grpc_health_v1.HealthCheckResponse_SERVING,
 }, nil
}

grpc_health_v1.RegisterHealthServer(server, &HealthImpl{})

参考链接

完整工程代码: https://github.com/hatlonely/hellogolang/tree/master/sample/addservice
consul 健康检查 api: https://www.consul.io/api/agent/check.html
consul 服务注册 api: https://www.consul.io/api/agent/service.html
grpc 健康检查: https://github.com/grpc/grpc/blob/master/doc/health-checking.md

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Golang开启http服务的三种方式

    前言 都说go标准库实用,Api设计简洁.这次就用go 标准库中的net/http包实现一个简洁的http web服务器,包括三种版本. v1最简单版 直接使用http.HandleFunc(partern,function(http.ResponseWriter,*http.Request){}) HandleFunc接受两个参数,第一个为路由地址,第二个为处理方法. //v1 func main() { http.HandleFunc("/", func(w http.Respon

  • Spring Cloud Consul的服务注册与发现

    运行Consul 以Windows为例,下载解压后,以开发模式运行: consul agent --dev 启动成功后,可以访问Consul提供的管理页面,默认端口为8500,页面上显示了已注册服务的列表,包括它们的运行状况等信息. 服务注册 1.添加Spring Cloud Consul依赖: <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artif

  • Asp.Net Core使用Ocelot结合Consul实现服务注册和发现

    目录 1.服务注册与发现(Service Discovery) 2.Consul 3.Asp.Net Core向Consul注册服务实例 4.项目演示 4.1APIGateway项目 4.2Common项目 4.3APIServiceA项目 4.4APIServiceB项目 4.5项目运行 1.服务注册与发现(Service Discovery) 服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka)注册一下,

  • 详解Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式.通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. Spring Cloud 包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Sprin

  • C#使用Consul集群进行服务注册与发现

    前言 我个人觉得,中间件的部署与使用是非常难记忆的:也就是说,如果两次使用中间件的时间间隔比较长,那基本上等于要重新学习使用. 所以,我觉得学习中间件的文章,越详细越好:因为,这对作者而言也是一份珍贵的备忘资料. Consul简介 Consul一个什么,我想大家通过搜索引擎一定可以搜索到:所以,我就不在重复他的官方描述了. 这里,我为大家提供一个更加好理解的描述. Consul是什么? Consul本质上是一个Socket通信中间件. 它主要实现了两个功能,服务注册与发现与自身的负载均衡的集群.

  • 微服务架构之服务注册与发现功能详解

    目录 微服务的注册与发现 1.服务注册 2.服务发现 3.注册中心 4.现下的主流注册中心 4.1 Eureka 4.1.1 介绍 4.1.2 整体架构 4.1.3 接入Spring Cloud 4.2 ZooKeeper 4.2.1 介绍 4.2.2 整体架构 4.2.3 接入Dubbo生态 4.3 Consul 4.3.1 介绍 4.3.2 整体架构 4.3.3 生态对接 4.4 总结对比 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务的注册与发现 我们前面

  • 微服务架构之服务注册与发现实践示例详解

    目录 1 服务注册中心 4种注册中心技术对比 2 Spring Cloud 框架下实现 2.1 Spring Cloud Eureka 2.1.1 创建注册中心 2.1.2 创建客户端 2.2 Spring Cloud Consul 2.2.1 Consul 的优势 2.2.2 Consul的特性 2.2.3 安装Consul注册中心 2.2.4 创建服务提供者 3 总结 微服务系列前篇 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务架构之服务注册与发现功能详解

  • 一文详解Golang中consul的基本使用

    目录 consul consul的安装和部署 docker安装 consul镜像的启动 启动一个tcp_health_check的服务注册 http版 服务发现 consul consul是一个开源服务注册和服务发现的中心,可以用于微服务的注册和服务之间的调用的发现,帮助上游服务找到下游服务的具体ip:port或者是domain,也可以使用dns的方式让consul帮你去做转发,具体介绍请看consul的官网,consul区分server-agent和client-agent,client-ag

  • 详解springcloud之服务注册与发现

    本次分享的是关于springcloud服务注册与发现的内容,将通过分别搭建服务中心,服务注册,服务发现来说明:现在北京这边很多创业公司都开始往springcloud靠了,可能是由于文档和组件比较丰富的原因吧,毕竟是一款目前来说比较完善的微服务架构:本次分享希望能给大家带来好的帮助: Eureka服务中心 Provider注册服务 Consumer发现服务 Eureka服务中心高可用 Eureka服务中心 就我现在了解到并且用的比较多的注册中心有zookeeper和Eureka,我的上上篇文章分享

  • 详解Golang Iris框架的基本使用

    Iris介绍 编写一次并在任何地方以最小的机器功率运行,如Android.ios.Linux和Windows等.它支持Google Go,只需一个可执行的服务即可在所有平台. Iris以简单而强大的api而闻名. 除了Iris为您提供的低级访问权限. Iris同样擅长MVC. 它是唯一一个拥有MVC架构模式丰富支持的Go Web框架,性能成本接近于零. Iris为您提供构建面向服务的应用程序的结构. 用Iris构建微服务很容易. 1. Iris框架 1.1 Golang框架   Golang常用

随机推荐