Consul与Kong联合配置理解

Consul与Kong联合配置理解

Consul与Kong联合配置理解

Consul介绍(实习-百度-Go后端开发-2023.02.09)

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较 为简单。Consul使用Go语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合 。

consul主要由server和client两种组件组成。

server负责核心数据的存储和处理请求,server可以部署多个实例(通常推荐3-5个),server只有一个leader实例,就是主节点,主节点是通过选举产生的,主节点负责数据的写入处理,同时将数据同步至其他server节点

client负责跟server通信,处理转发服务注册、服务发现请求到server节点,client还负责服务的健康检查,client节点可以部署多个实例,甚至每个微服务节点都部署一个client实例。

以开发模式启动consul,同时具备server和client的功能,不需要单独部署server和client

consul健康检查机制制运行在consul client中,会定期的根据服务健康检查配置,去检测服务是否正常,如果服务异常,就将服务的实例标记为不用, 如果恢复了,就标记为可用。

  • 基于http请求:定时以GET请求方式,请求指定url,http请求返回状态码200表示正常,其他状态代表异常。
  • 基于tcp请求:基于tcp请求方式,就是定时向指定的地址,建立tcp链接,连接成功就代表服务正常,否则就代表异常。
  • 基于grpc请求:如果微服务是基于grpc协议,可以使用grpc协议监测服务是否正常。
  • 基于命令:consul支持定期执行一个命令或脚本,来检测服务是否正常,consul通过监测命令退出状态判断服务是否正常,命令退出状态0代表正常,其他代表异常。
  • 基于TTL(服务主动向consul报告自己的健康状况):一个健康的APP可以周期性的将状态put到HTTP端

Kong介绍

Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

Konga是可以管理Kong的图形界面,带来的一个最大的便利就是可以很好地通过UI观察到现在kong的所有的配置,并且可以对于管理kong节点情况进行查看、监控和预警。

传统架构

微服务架构是由多个服务端和多个api端组成,客户端发起请求,需要单独的api进行接收和路由转发,然后通过与不同的服务端建立连接从而获得服务。

这个过程中需要在程序中记忆大量的端口,且一旦有节点失效,整个服务都将不可用。

Consul+Kong架构

pSsIlXF.png

Kong

  • 将不同api的ip和端口配置到Kong中(如果与Consul结合,直接配置consul_api服务名称.service.consul即可)
  • 在Kong中设置路由匹配规则
  • 客户端的请求首先发送给Kong,由Kong进行路由规则的匹配,随后转发到不同的api上
  • 客户端在请求的时候的ip地址和端口号使用任意一台api的ip地址和端口号即可,所有日志都会发送到该台服务器上,实际请求的日志会转发到其他的api上

Consul

  • 一个服务下面可以启动多个实例,收到请求会平均发送给每一个实例
  • 服务发现:请求服务时只需得知服务名称、consul的ip与端口号即可,无需知道服务具体细节
  • 健康检查:服务注册后consul每间隔一段时间发送响应给服务的实例,确认在线情况
  • 服务注册:服务向consul报告自己的ip和端口号

Consul代码示例

api端

服务注册:

registerClient := consul.NewRegistryClient(global.GlobalConfig.Consul.Address, global.GlobalConfig.Consul.Port)
err = registerClient.Register(global.GlobalConfig.MainServer.Address, global.GlobalConfig.MainServer.Port, "video-api", []string{"api", "video"})

健康检查(注意是HTTP类型的):

check := &api.AgentServiceCheck{
	HTTP:                           "http://" + address + ":" + port + "/health",
	Timeout:                        "5s",
	Interval:                       "5s",
	DeregisterCriticalServiceAfter: "10s",
}

连接服务端:

conn, err = grpc.Dial(
	"consul://"+global.GlobalConfig.Consul.Address+":"+global.GlobalConfig.Consul.Port+"/"+name+"?wait=14s",
	grpc.WithTransportCredentials(
		insecure.NewCredentials(),
	),
	grpc.WithDefaultCallOptions(
		grpc.MaxCallRecvMsgSize(1024*1024*size),
		grpc.MaxCallSendMsgSize(1024*1024*size),
	),
	grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),
)

服务端

注意监听的时候要监听内网地址

lis, err := net.Listen("tcp", global.GlobalConfig.Address.In+":"+port)

服务注册:

register_client := consul.NewRegistryClient(global.GlobalConfig.Consul.Address, global.GlobalConfig.Consul.Port)
register_client.Register(global.GlobalConfig.Address.Out, port, name, []string{"srv", "video"})

健康检查(注意是GRPC类型的):

grpc_health_v1.RegisterHealthServer(s, health.NewServer())
check := &api.AgentServiceCheck{
	GRPC:                           address + ":" + port,
	Timeout:                        "5s",
	Interval:                       "5s",
	DeregisterCriticalServiceAfter: "10s",
}

连接api端:

s := grpc.NewServer()

Consul与Kong联合配置理解
https://zhangzhao219.github.io/2023/02/03/Backend/Consul_kong/
作者
Zhang Zhao
发布于
2023年2月3日
许可协议