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架构
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()