聊聊dubbo-go-proxy的apiFilter

本文主要研究一下dubbo-go-proxy的apiFilter

apiFilter

dubbo-go-proxy/pkg/filter/api/api.go

func Init() {
	extension.SetFilterFunc(constant.HTTPApiFilter, apiFilterFunc())
}

Init方法往extension設置了名爲dgp.filters.http.api的apiFilterFunc

apiFilterFunc

dubbo-go-proxy/pkg/filter/api/api.go

// apiFilterFunc url match api
func apiFilterFunc() context.FilterFunc {
	return func(c context.Context) {
		url := c.GetUrl()
		method := c.GetMethod()
		// [williamfeng323]TO-DO: get the API details from router which saved in constant.LocalMemoryApiDiscoveryService
		if api, ok := api.EmptyApi.FindApi(url); ok {
			if !api.MatchMethod(method) {
				c.WriteWithStatus(http.StatusMethodNotAllowed, constant.Default405Body)
				c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain)
				c.Abort()
				return
			}

			if !api.IsOk(api.Name) {
				c.WriteWithStatus(http.StatusNotAcceptable, constant.Default406Body)
				c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain)
				c.Abort()
				return
			}
			// [williamfeng323]TO-DO: the c.Api method need to be updated to use the newest API definition
			c.Api(api)
			c.Next()
		} else {
			c.WriteWithStatus(http.StatusNotFound, constant.Default404Body)
			c.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain)
			c.Abort()
		}
	}
}

apiFilterFunc首先通過api.EmptyApi.FindApi(url)來查找對應的api,找不到則返回404;找到的話則先通過api.MatchMethod判斷method是否匹配,不匹配的話返回405;之後通過api.IsOk判斷該api的status是否up,不是的話返回406;最後執行c.Api(api)及c.Next()。

dubbo-go-proxy-filter

[email protected]/pkg/api/api.go

func (a *Api) FindApi(name string) (*Api, bool) {
	if v, ok := CacheApi.Load(name); ok {
		return v.(*Api), true
	}

	return nil, false
}

// MatchMethod
func (a *Api) MatchMethod(method string) bool {
	i := RequestMethodValue[method]
	if a.RequestMethod == RequestMethod(i) {
		return true
	}

	return false
}

// IsOk api status equals Up
func (a *Api) IsOk(name string) bool {
	if v, ok := CacheApi.Load(name); ok {
		return v.(*Api).Status == Up
	}

	return false
}

api.go提供了FindApi、MatchMethod、IsOk方法

小結

apiFilterFunc首先通過api.EmptyApi.FindApi(url)來查找對應的api,找不到則返回404;找到的話則先通過api.MatchMethod判斷method是否匹配,不匹配的話返回405;之後通過api.IsOk判斷該api的status是否up,不是的話返回406;最後執行c.Api(api)及c.Next()。

doc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章