IRIS优雅关闭服务

自定义通知关闭服务

目录结构

主目录customNotifier

  1. —— main.go

代码示例

main.go

  1. package main
  2. import (
  3. stdContext "context"
  4. "os"
  5. "os/signal"
  6. "syscall"
  7. "time"
  8. "github.com/kataras/iris"
  9. )
  10. func main() {
  11. app := iris.New()
  12. app.Get("/", func(ctx iris.Context) {
  13. ctx.HTML("<h1>hi, I just exist in order to see if the server is closed</h1>")
  14. })
  15. go func() {
  16. ch := make(chan os.Signal, 1)
  17. signal.Notify(ch,
  18. // kill -SIGINT XXXX 或 Ctrl+c
  19. os.Interrupt,
  20. syscall.SIGINT, // register that too, it should be ok
  21. // os.Kill等同于syscall.Kill
  22. os.Kill,
  23. syscall.SIGKILL, // register that too, it should be ok
  24. // kill -SIGTERM XXXX
  25. syscall.SIGTERM,
  26. )
  27. select {
  28. case <-ch:
  29. println("shutdown...")
  30. timeout := 5 * time.Second
  31. ctx, cancel := stdContext.WithTimeout(stdContext.Background(), timeout)
  32. defer cancel()
  33. app.Shutdown(ctx)
  34. }
  35. }()
  36. //启动服务器并禁用默认的中断处理程序
  37. //我们自己处理它清晰简单,没有任何问题。
  38. app.Run(iris.Addr(":8080"), iris.WithoutInterruptHandler)
  39. }

默认通知关闭服务

目录结构

主目录defaultNotifier

  1. —— main.go

代码示例

main.go

  1. package main
  2. import (
  3. stdContext "context"
  4. "time"
  5. "github.com/kataras/iris"
  6. )
  7. //继续之前:
  8. //正常关闭control+C/command+C或当发送的kill命令是ENABLED BY-DEFAULT。
  9. //为了手动管理应用程序中断时要执行的操作,
  10. //我们必须使用选项`WithoutInterruptHandler`禁用默认行为
  11. //并注册一个新的中断处理程序(全局,所有主机)。
  12. func main() {
  13. app := iris.New()
  14. iris.RegisterOnInterrupt(func() {
  15. timeout := 5 * time.Second
  16. ctx, cancel := stdContext.WithTimeout(stdContext.Background(), timeout)
  17. defer cancel()
  18. //关闭所有主机
  19. app.Shutdown(ctx)
  20. })
  21. app.Get("/", func(ctx iris.Context) {
  22. ctx.HTML(" <h1>hi, I just exist in order to see if the server is closed</h1>")
  23. })
  24. // http://localhost:8080
  25. app.Run(iris.Addr(":8080"), iris.WithoutInterruptHandler)
  26. }