如果使用 Kubernetes Service 进行服务发现,Endpoint 上的更新是有延迟,仍会有流量进入到被终结的服务上
这个时候我们可以采取一下措施
等待 Endpoint 更新再关闭服务请求
客户端请求添加重试,服务 IP 不可用将继续访问下一个 IP
我知道你很急,你等一等
在服务捕获终止信号后可以多等待几秒,再关闭服务请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT) for { s := <-c fmt.Println("Get a signal", s.String()) switch s { case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT: fmt.Println("Waiting for terminating") // Waiting k8s deal with terminating time.Sleep(time.Second * 10) // Close all service // Close somethings... fmt.Println(name, "exit") return case syscall.SIGHUP: default: return } }
要不你再试一试?
这个是 正确处理更新时请求流量 要讲的,请看下面
3. 正确处理更新时请求流量
服务开始更新,如何让流量快速正确切换到新服务上是关键,也是提供丝滑的重要因素
一些架构会在入口新增 入口网关 用于流量入口控制
这时在入口网关和应用的请求客户端都需要我们添加正确的配置,减少请求失败率
如果使用其他配套 Service Mesh 治理,应用本身可能不需要关心这个问题,因为流量会被劫持由治理网关处理,需要正确配置其网关