Go Kratos2.0 Http请求如何获取IP地址(Filter,Middleware)

Kratos2.0 支持Http请求模式,但对于Http请求的常见使用场景支撑的并不多,很多时候需要编程人员通过Filter和Middleware实现,以下是一种获取http请求来源IP的方式;

1.server/http.go NewHTTPServer 方法中添加Filter和Middleware

// NewHTTPServer new a HTTP server.
func NewHTTPServer(c *conf.Server, a *conf.Auth, user *service.UserService, logger log.Logger) *http.Server {
	var opts = []http.ServerOption{
		http.Middleware(
			recovery.Recovery(),
			validate.Validator(),
			LocalHttpRequestMiddleware(),
			selector.Server(authMiddleware(a)).Match(witheList()).Build(),
		),
		http.Filter(handlers.CORS(
			handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type", "Authorization"}),
			handlers.AllowedMethods([]string{"GET", "POST", "PUT", "HEAD", "OPTIONS"}),
			handlers.AllowedOrigins([]string{"*"}),
		), LocalHttpRequestFilter()),
	}
	
	if c.Http.Network != "" {
		opts = append(opts, http.Network(c.Http.Network))
	}
	if c.Http.Addr != "" {
		opts = append(opts, http.Address(c.Http.Addr))
	}
	if c.Http.Timeout != nil {
		opts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))
	}
	srv := http.NewServer(opts...)
	v1.RegisterUserHTTPServer(srv, user)
	return srv
}

2. Filter主要功能是获取http请求的真实IP并填充到Header中

func LocalHttpRequestFilter() http.FilterFunc {
	return func(next nhttp.Handler) nhttp.Handler {
		return nhttp.HandlerFunc(func(w nhttp.ResponseWriter, req *nhttp.Request) {
			req.Header.Add("X-RemoteAddr", strings.Split(req.RemoteAddr, ":")[0])

			next.ServeHTTP(w, req)
	})}
}

Filter 先于 Middleware 被执行,Filter执行后 Request 的相关信息会被存储到 ctx 中并传递下去,具体代码可以分析 kratos/v2/transport 模块的代码,此处不展开分析;

3.此处Middleware主要是解析ctx中的Header并取出真实IP

func LocalHttpRequestMiddleware() middleware.Middleware {
	return func(handler middleware.Handler) middleware.Handler {
		return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
			if tp, ok := transport.FromServerContext(ctx); ok {
				println(fmt.Sprintf("remote_addr: %v",tp.RequestHeader().Get("RemoteAddr")))
			}
			return handler(ctx, req)
		}
	}
}

此处的ctx即service实现接口中注入的ctx,也可以直接在service中处理获得真实IP(此处Middleware仅作为演示使用,具体实现时可以忽略);

备注:对于Kratos微服务架构,个人并不建议用太多http请求,如果确需大量http api请求,建议还是使用Gin或Beego框架;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两不务

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值