微服务网关(二)通用中间件模块

微服务网关(二)通用中间件模块

RecoveryMiddleware

有的情况下不能使用log.Fatal(),因为这个方法os.Exit(1)会将整个进程退出

// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
   std.Output(2, fmt.Sprint(v...))
   os.Exit(1)
}

所以我们在路由层面使用这个中间件,这个中间件使用recover这个方法

if err := recover(); err != nil 

这样我们在调用panic方法时,就可以通过recover()这个方法可以去拦截我们协程中的那些错误提示

RecoveryMiddleware 捕获所有panic,进行日志记录,并且返回错误信息

response.go

同一封装返回类

SessionAuthMiddleware

根据session判断用户是否登录

TranslationMiddleware(校验输入是否合法的中间件)

设置翻译器

func TranslationMiddleware() gin.HandlerFunc {
   return func(c *gin.Context) {
      //参照:https://github.com/go-playground/validator/blob/v9/_examples/translations/main.go

      //设置支持语言
      en := en.New()
      zh := zh.New()

      //设置国际化翻译器
      uni := ut.New(zh, zh, en)
      val := validator.New()

      //根据参数取翻译器实例
      locale := c.DefaultQuery("locale", "zh")
      trans, _ := uni.GetTranslator(locale)

      //翻译器注册到validator
      switch locale {
      case "en":
         en_translations.RegisterDefaultTranslations(val, trans)
         val.RegisterTagNameFunc(func(fld reflect.StructField) string {
            return fld.Tag.Get("en_comment")
         })
         break
      default:
         zh_translations.RegisterDefaultTranslations(val, trans)
         val.RegisterTagNameFunc(func(fld reflect.StructField) string {
            return fld.Tag.Get("comment")
         })

         //自定义验证方法
         //https://github.com/go-playground/validator/blob/v9/_examples/custom-validation/main.go
         val.RegisterValidation("is_valid_username", func(fl validator.FieldLevel) bool {
            return fl.Field().String() == "admin"
         })

         val.RegisterValidation("valid_service_name", func(fl validator.FieldLevel) bool {
            matched, _ := regexp.Match(`^[a-zA-Z0-9_]{6,128}$`, []byte(fl.Field().String()))
            return matched
         })
         val.RegisterValidation("valid_rule", func(fl validator.FieldLevel) bool {
            matched, _ := regexp.Match(`^\S+$`, []byte(fl.Field().String()))
            return matched
         })
         val.RegisterValidation("valid_url_rewrite", func(fl validator.FieldLevel) bool {
            if fl.Field().String() == "" {
               return true
            }
            for _, ms := range strings.Split(fl.Field().String(), ",") {
               if len(strings.Split(ms, " ")) != 2 {
                  return false
               }
            }
            return true
         })
         val.RegisterValidation("valid_header_transfor", func(fl validator.FieldLevel) bool {
            if fl.Field().String() == "" {
               return true
            }
            for _, ms := range strings.Split(fl.Field().String(), ",") {
               if len(strings.Split(ms, " ")) != 3 {
                  return false
               }
            }
            return true
         })
         val.RegisterValidation("valid_ipportlist", func(fl validator.FieldLevel) bool {
            for _, ms := range strings.Split(fl.Field().String(), ",") {
               if matched, _ := regexp.Match(`^\S+\:\d+$`, []byte(ms)); !matched {
                  return false
               }
            }
            return true
         })
         val.RegisterValidation("valid_iplist", func(fl validator.FieldLevel) bool {
            if fl.Field().String() == "" {
               return true
            }
            for _, item := range strings.Split(fl.Field().String(), ",") {
               matched, _ := regexp.Match(`\S+`, []byte(item)) //ip_addr
               if !matched {
                  return false
               }
            }
            return true
         })
         val.RegisterValidation("valid_weightlist", func(fl validator.FieldLevel) bool {
            fmt.Println(fl.Field().String())
            for _, ms := range strings.Split(fl.Field().String(), ",") {
               if matched, _ := regexp.Match(`^\d+$`, []byte(ms)); !matched {
                  return false
               }
            }
            return true
         })

         //自定义验证器
         //https://github.com/go-playground/validator/blob/v9/_examples/translations/main.go
         val.RegisterTranslation("is_valid_username", trans, func(ut ut.Translator) error {
            return ut.Add("is_valid_username", "{0} 填写不正确哦", true)
         }, func(ut ut.Translator, fe validator.FieldError) string {
            t, _ := ut.T("is_valid_username", fe.Field())
            return t
         })
         val.RegisterTranslation("valid_service_name", trans, func(ut ut.Translator) error {
            return ut.Add("valid_service_name", "{0} 不符合输入格式", true)
         }, func(ut ut.Translator, fe validator.FieldError) string {
            t, _ := ut.T("valid_service_name", fe.Field())
            return t
         })
         val.RegisterTranslation("valid_rule", trans, func(ut ut.Translator) error {
            return ut.Add("valid_rule", "{0} 必须是非空字符", true)
         }, func(ut ut.Translator, fe validator.FieldError) string {
            t, _ := ut.T("valid_rule", fe.Field())
            return t
         })
         val.RegisterTranslation("valid_url_rewrite", trans, func(ut ut.Translator) error {
            return ut.Add("valid_url_rewrite", "{0} 不符合输入格式", true)
         }, func(ut ut.Translator, fe validator.FieldError) string {
            t, _ := ut.T("valid_url_rewrite", fe.Field())
            return t
         })
         val.RegisterTranslation("valid_header_transfor", trans, func(ut ut.Translator) error {
            return ut.Add("valid_header_transfor", "{0} 不符合输入格式", true)
         }, func(ut ut.Translator, fe validator.FieldError) string {
            t, _ := ut.T("valid_header_transfor", fe.Field())
            return t
         })
         val.RegisterTranslation("valid_ipportlist", trans, func(ut ut.Translator) error {
            return ut.Add("valid_ipportlist", "{0} 不符合输入格式", true)
         }, func(ut ut.Translator, fe validator.FieldError) string {
            t, _ := ut.T("valid_ipportlist", fe.Field())
            return t
         })
         val.RegisterTranslation("valid_iplist", trans, func(ut ut.Translator) error {
            return ut.Add("valid_iplist", "{0} 不符合输入格式", true)
         }, func(ut ut.Translator, fe validator.FieldError) string {
            t, _ := ut.T("valid_iplist", fe.Field())
            return t
         })
         val.RegisterTranslation("valid_weightlist", trans, func(ut ut.Translator) error {
            return ut.Add("valid_weightlist", "{0} 不符合输入格式", true)
         }, func(ut ut.Translator, fe validator.FieldError) string {
            t, _ := ut.T("valid_weightlist", fe.Field())
            return t
         })
         break
      }
      c.Set(public.TranslatorKey, trans)
      c.Set(public.ValidatorKey, val)
      c.Next()
   }
}

你可能感兴趣的:(项目实践,微服务,中间件,架构)