午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > 淺談go-restful框架的使用和實現

淺談go-restful框架的使用和實現

熱門標簽:惠州電銷防封電話卡 浙江高頻外呼系統多少錢一個月 建造者2地圖標注 阿里云ai電話機器人 釘釘有地圖標注功能嗎 鄭州亮點科技用的什么外呼系統 濱州自動電銷機器人排名 汕頭小型外呼系統 黃岡人工智能電銷機器人哪個好

REST(Representational State Transfer,表現層狀態轉化)是近幾年使用較廣泛的分布式結點間同步通信的實現方式。REST原則描述網絡中client-server的一種交互形式,即用URL定位資源,用HTTP方法描述操作的交互形式。如果CS之間交互的網絡接口滿足REST風格,則稱為RESTful API。以下是 理解RESTful架構 總結的REST原則:

  1. 網絡上的資源通過URI統一標示。
  2. 客戶端和服務器之間傳遞,這種資源的某種表現層。表現層可以是json,文本,二進制或者圖片等。
  3. 客戶端通過HTTP的四個動詞,對服務端資源進行操作,實現表現層狀態轉化。

為什么要設計RESTful的API,個人理解原因在于:用HTTP的操作統一數據操作接口,限制URL為資源,即每次請求對應某種資源的某種操作,這種 無狀態的設計可以實現client-server的解耦分離,保證系統兩端都有橫向擴展能力。

go-restful

go-restful is a package for building REST-style Web Services using Google Go。go-restful定義了Container WebService和Route三個重要數據結構。

  1. Route 表示一條路由,包含 URL/HTTP method/輸入輸出類型/回調處理函數RouteFunction
  2. WebService 表示一個服務,由多個Route組成,他們共享同一個Root Path
  3. Container 表示一個服務器,由多個WebService和一個 http.ServerMux 組成,使用RouteSelector進行分發

最簡單的使用實例,向WebService注冊路由,將WebService添加到Container中,由Container負責分發。

func main() {
  ws := new(restful.WebService)
  ws.Path("/users")
  ws.Route(ws.GET("/").To(u.findAllUsers).
    Doc("get all users").
    Metadata(restfulspec.KeyOpenAPITags, tags).
    Writes([]User{}).
    Returns(200, "OK", []User{}))

 container := restful.NewContainer().Add(ws)
 http.ListenAndServe(":8080", container)
}

container

container是根據標準庫http的路由器ServeMux寫的,并且它通過ServeMux的路由表實現了Handler接口,可參考以前的這篇 HTTP協議與Go的實現 。

type Container struct {
  webServicesLock    sync.RWMutex
  webServices      []*WebService
  ServeMux        *http.ServeMux
  isRegisteredOnRoot   bool
  containerFilters    []FilterFunction
  doNotRecover      bool // default is true
  recoverHandleFunc   RecoverHandleFunction
  serviceErrorHandleFunc ServiceErrorHandleFunction
  router         RouteSelector // default is a CurlyRouter
  contentEncodingEnabled bool     // default is false
}
func (c *Container)ServeHTTP(httpwriter http.ResponseWriter, httpRequest *http.Request) {
  c.ServeMux.ServeHTTP(httpwriter, httpRequest)
}

往Container內添加WebService,內部維護的webServices不能有重復的RootPath,

func (c *Container)Add(service *WebService)*Container {
  c.webServicesLock.Lock()
  defer c.webServicesLock.Unlock()
  if !c.isRegisteredOnRoot {
    c.isRegisteredOnRoot = c.addHandler(service, c.ServeMux)
  }
  c.webServices = append(c.webServices, service)
  return c
}

添加到container并注冊到mux的是dispatch這個函數,它負責根據不同WebService的rootPath進行分發。

func (c *Container)addHandler(service *WebService, serveMux *http.ServeMux)bool {
  pattern := fixedPrefixPath(service.RootPath())
  serveMux.HandleFunc(pattern, c.dispatch)
}

webservice

每組webservice表示一個共享rootPath的服務,其中rootPath通過 ws.Path() 設置。

type WebService struct {
  rootPath    string
  pathExpr    *pathExpression 
  routes     []Route
  produces    []string
  consumes    []string
  pathParameters []*Parameter
  filters    []FilterFunction
  documentation string
  apiVersion   string

  typeNameHandleFunc TypeNameHandleFunction
  dynamicRoutes bool
  routesLock sync.RWMutex
}

通過Route注冊的路由最終構成Route結構體,添加到WebService的routes中。

func (w *WebService)Route(builder *RouteBuilder)*WebService {
  w.routesLock.Lock()
  defer w.routesLock.Unlock()
  builder.copyDefaults(w.produces, w.consumes)
  w.routes = append(w.routes, builder.Build())
  return w
}

route

通過RouteBuilder構造Route信息,Path結合了rootPath和subPath。Function是路由Handler,即處理函數,它通過 ws.Get(subPath).To(function) 的方式加入。Filters實現了個類似gRPC攔截器的東西,也類似go-chassis的chain。

type Route struct {
  Method  string
  Produces []string
  Consumes []string
  Path   string // webservice root path + described path
  Function RouteFunction
  Filters []FilterFunction
  If    []RouteSelectionConditionFunction
  // cached values for dispatching
  relativePath string
  pathParts  []string
  pathExpr   *pathExpression
  // documentation
  Doc           string
  Notes          string
  Operation        string
  ParameterDocs      []*Parameter
  ResponseErrors     map[int]ResponseError
  ReadSample, WriteSample interface{} 
  Metadata map[string]interface{}
  Deprecated bool
}

dispatch

server側的主要功能就是路由選擇和分發。http包實現了一個 ServeMux ,go-restful在這個基礎上封裝了多個服務,如何在從container開始將路由分發給webservice,再由webservice分發給具體處理函數。這些都在 dispatch 中實現。

  1. SelectRoute根據Req在注冊的WebService中選擇匹配的WebService和匹配的Route。其中路由選擇器默認是 CurlyRouter 。
  2. 解析pathParams,將wrap的請求和相應交給路由的處理函數處理。如果有filters定義,則鏈式處理。
func (c *Container)dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) {
  func() {
    c.webServicesLock.RLock()
    defer c.webServicesLock.RUnlock()
    webService, route, err = c.router.SelectRoute(
      c.webServices,
      httpRequest)
  }()

  pathProcessor, routerProcessesPath := c.router.(PathProcessor)
  pathParams := pathProcessor.ExtractParameters(route, webService, httpRequest.URL.Path)
  wrappedRequest, wrappedResponse := route.wrapRequestResponse(writer,
  httpRequest, pathParams)

  if len(c.containerFilters)+len(webService.filters)+len(route.Filters) > 0 {
    chain := FilterChain{Filters: allFilters, Target: func(req *Request, resp *Response) {
      // handle request by route after passing all filters
      route.Function(wrappedRequest, wrappedResponse)
    }}
    chain.ProcessFilter(wrappedRequest, wrappedResponse)
  } else {
    route.Function(wrappedRequest, wrappedResponse)
  }
}

go-chassis

go-chassis實現的rest-server是在go-restful上的一層封裝。Register時只要將注冊的schema解析成routes,并注冊到webService中,Start啟動server時 container.Add(r.ws) ,同時將container作為handler交給 http.Server , 最后開始ListenAndServe即可。

type restfulServer struct {
  microServiceName string
  container    *restful.Container
  ws        *restful.WebService
  opts       server.Options
  mux       sync.RWMutex
  exit       chan chan error
  server      *http.Server
}

根據Method不同,向WebService注冊不同方法的handle,從schema讀取的routes信息包含Method,Func以及PathPattern。

func (r *restfulServer)Register(schemainterface{}, options ...server.RegisterOption)(string, error) {
  schemaType := reflect.TypeOf(schema)
  schemaValue := reflect.ValueOf(schema)
  var schemaName string
  tokens := strings.Split(schemaType.String(), ".")
  if len(tokens) >= 1 {
    schemaName = tokens[len(tokens)-1]
  }
  
  routes, err := GetRoutes(schema)
  for _, route := range routes {
    lager.Logger.Infof("Add route path: [%s] Method: [%s] Func: [%s]. ",
      route.Path, route.Method, route.ResourceFuncName)
    method, exist := schemaType.MethodByName(route.ResourceFuncName)
    ...
    handle := func(req *restful.Request, rep *restful.Response) {
      c, err := handler.GetChain(common.Provider, r.opts.ChainName)
      inv := invocation.Invocation{
        MicroServiceName:  config.SelfServiceName,
        SourceMicroService: req.HeaderParameter(common.HeaderSourceName),
        Args:        req,
        Protocol:      common.ProtocolRest,
        SchemaID:      schemaName,
        OperationID:    method.Name,
      }
      bs := NewBaseServer(context.TODO())
      bs.req = req
      bs.resp = rep
      c.Next(inv, func(ir *invocation.InvocationResponse)error {
        if ir.Err != nil {
          return ir.Err
        }
        method.Func.Call([]reflect.Value{schemaValue, reflect.ValueOf(bs)})
        if bs.resp.StatusCode() >= http.StatusBadRequest {
          return ...
        }
        return nil
      })
    }
 
    switch route.Method {
    case http.MethodGet:
      r.ws.Route(r.ws.GET(route.Path).To(handle).
       Doc(route.ResourceFuncName).
       Operation(route.ResourceFuncName))
    ...
    }
  }
  return reflect.TypeOf(schema).String(), nil
}

實在是比較簡單,就不寫了。今天好困。

遺留問題

  1. reflect在路由注冊中的使用,反射與性能
  2. route select時涉及到模糊匹配 如何保證處理速度
  3. pathParams的解析

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:滄州 駐馬店 東營 晉中 昭通 泰安 阿壩 瀘州

巨人網絡通訊聲明:本文標題《淺談go-restful框架的使用和實現》,本文關鍵詞  淺談,go-restful,框架,的,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談go-restful框架的使用和實現》相關的同類信息!
  • 本頁收集關于淺談go-restful框架的使用和實現的相關信息資訊供網民參考!
  • 推薦文章
    亚洲精品成人久久电影| 女尊高h男高潮呻吟| 国产激情视频网站| 国产欧美久久久久久| 国产美女精品视频国产| 亚洲男人第一av| 国产富婆一级全黄大片| 国产在线播精品第三| 久久久五月婷婷| 欧美日韩国产色视频| 亚洲电影第1页| 久久久久久亚洲精品| 91超碰在线免费观看| youjizz.com亚洲| 亚洲视频一二三四| 成人高潮免费视频| 国产精品国产精品国产专区| 久久99久久精品欧美| 国产精品久久久久一区二区三区共| 在线免费观看成人短视频| 亚洲人成77777在线观看网| 78m国产成人精品视频| 国产成人女人毛片视频在线| 久草免费福利在线| 国产一级黄色录像| 天堂中文在线网| 免费的成人av| 中文字幕一区二区三区在线观看 | 日本一区二区三区四区五区六区| 天天干天天色天天干| 午夜精品一区二区三区视频| 精品国产av鲁一鲁一区| 成人动漫av在线| 狠狠久久亚洲欧美专区| 日韩精品免费综合视频在线播放| 国产成人亚洲综合91精品| 亚洲午夜精品一区二区| 激情文学亚洲色图| 日本在线免费观看| 蜜桃免费网站一区二区三区| 亚洲人成影院在线观看| 精品免费国产二区三区| 57pao成人国产永久免费| 日韩欧美亚洲区| 亚洲国产综合av| 久久国产视频播放| 国内精品在线播放| 亚洲1区2区3区视频| 国产亚洲精品久久久久动| 三区精品视频| 亚洲色图视频免费播放| 日本欧美色综合网站免费| 91麻豆精品国产自产在线观看一区 | 欧美性猛xxx| 欧美aⅴ在线观看| 亚洲欧洲第一视频| 久久精品国产秦先生| 波兰性xxxxx极品hd| 国产免费黄色一级片| 国产精品久久久久久久久影视| 欧美日韩日本国产| 国产精品123| 国产午夜福利一区| 97se国产在线视频| 国产精品久久久一本精品 | 国产成人在线影院| 日韩中文字幕三区| 91 com成人网| 日韩福利电影在线观看| 一区二区三区在线观看免费视频| 热久久99这里有精品| 久久人人爽人人爽| 日本高清一二三区| 欧美老妇交乱视频| 国产成+人+日韩+欧美+亚洲| 麻豆一区在线观看| 久久综合中文色婷婷| 欧美在线免费播放| 国产免费视频一区二区三区| 手机在线看福利| 国语自产精品视频在线看| 久久精品日韩一区二区三区| 看看黄色一级片| 久久97精品久久久久久久不卡 | 曰韩精品一区二区| 私库av在线播放| 国产日韩av网站| 久久久在线视频| 久久先锋资源网| 国产精品99久久久久久成人| 国产女人水真多18毛片18精品| 一区二区三区日本| 手机免费看av| 欧美午夜免费| 中文字幕久久久av一区| 欧美日韩国产一二三| 亚洲精品人妻无码| 久久久www成人免费毛片| 在线播放免费视频| 中国黄色录像片| 成人做爰www免费看视频网站| 色伊人久久综合中文字幕| 国产免费叼嘿网站免费| 欧美 日韩 国产精品| www欧美日韩| 亚洲国产高清在线观看视频| 男人晚上看的视频| 国产精品视频公开费视频| 成人免费在线播放视频| 国产三级第一页| 波多野结衣喷潮| 国产一二三区在线播放| 亚洲欧洲免费视频| av在线不卡观看免费观看| 国产精品99久久久久久成人| 欧美劲爆第一页| 午夜精品久久久久影视| 国产精品18久久久久久久久| 精品区在线观看| 日本高清www免费视频| xfplay5566色资源网站| 精品综合久久久久| 中文字幕一区二区三区最新| 成人羞羞国产免费| 欧美色图天堂网| 国产精品456露脸| 美国黄色特级片| 乱一区二区三区在线播放| 日韩av在线资源| 国产精品日韩成人| 91成人在线免费视频| 国产精品久久久久久久小唯西川| 久久精品国产亚洲7777| 日韩欧中文字幕| 国产日韩欧美精品在线| 182在线观看视频| 视色,视色影院,视色影库,视色网| 亚洲网站在线观看| 另类综合日韩欧美亚洲| 天天操中文字幕| 国产精品熟妇一区二区三区四区| www.avtt| 亚洲欧洲精品在线观看| 精品一区二区三区免费毛片| 久久久婷婷一区二区三区不卡| 国产精品日韩在线观看| 久久艳片www.17c.com | 日韩一二三区视频| 26uuu久久综合| 亚洲天堂777| 性色av蜜臀av色欲av| 亚洲午夜久久久影院伊人| 久久99国产综合精品女同| 一区二区三区中文免费| 国产精品suv一区| 欧产日产国产精品98| 手机在线免费观看毛片| 久久国产精品视频在线观看| 国产精品成人一区二区| 亚洲成人在线视频播放| 亚洲国产日韩a在线播放性色| 久久久久久久久久久久久久av| av免费中文字幕| 麻豆久久久av免费| 国产欧美 在线欧美| 久久人人97超碰精品888| 九九热精品在线| 午夜精品视频网站| 26uuu日韩精品一区二区| www.精品av.com| 日韩精品极品在线观看| 亚洲一区中文在线| 丁香六月综合激情| 亚洲欧美偷拍一区| 国产女人18毛片水真多18| 好吊色这里只有精品| 国产欧美精品一区二区三区-老狼| 欧美一区欧美二区| 国产一区二区三区国产| 欧美成人精品欧美一级乱黄| 国产亚洲精品av| 免费在线观看a级片| 佐山爱在线视频| 干日本少妇视频| 亚洲最大的网站| 欧美激情综合亚洲一二区 | 91精品国产高清| 国产性色av一区二区| 亚洲天堂成人在线| 日韩中文综合网| 97精品伊人久久久大香线蕉 | 岛国精品视频在线播放| 91九色最新地址| 天天做天天摸天天爽国产一区 | 少妇精品高潮欲妇又嫩中文字幕| 可以免费看的av毛片| 日韩av无码一区二区三区不卡| 国产乱淫av片杨贵妃| 国产精品扒开腿做爽爽爽的视频| 欧美成人aa大片| 午夜视频在线观看一区二区| 五月婷婷激情综合| 色综合天天综合网国产成人综合天 | 亚洲精品乱码久久久久久| www.久久视频| www.自拍偷拍| 秘密基地免费观看完整版中文| 黄色三级视频在线| 国产大学生av| 免费观看一区二区三区| 玖玖爱在线观看| 欧美第一页在线观看| 国产女主播喷水视频在线观看 | 日韩女优中文字幕| 444亚洲人体| 97在线免费观看视频| 自拍偷拍亚洲在线| 欧美在线观看视频在线| 夜夜嗨av一区二区三区中文字幕 | 国产高清视频免费在线观看| 精品一级少妇久久久久久久| 日韩男人的天堂| 欧美成人精品欧美一级| 在线免费看黄视频| 精品夜夜澡人妻无码av| 日韩黄色影视| 日韩欧美视频一区二区| 国产国产精品人在线视| 91在线色戒在线| 日本不卡一区二区三区四区| www.99av.com| 国产又黄又粗又猛又爽的视频| 日日碰狠狠添天天爽| 国产亚洲精品成人| 99er热精品视频| 美腿丝袜亚洲三区| 巨乳诱惑日韩免费av| 亚洲精品无码专区| 亚洲久久在线观看| 久久黄色精品视频| 日本一区二区三区久久| 亚洲性生活大片| 精品人妻少妇AV无码专区| wwwww黄色| 少妇精品无码一区二区三区| 91插插插影院| 亚洲一级黄色录像| 在线观看国产黄| 国产一区激情在线| 成人亚洲一区二区一| 成人动漫视频在线| 国产精品欧美久久久久无广告 | 国产精品推荐精品| 在线丝袜欧美日韩制服| 午夜在线观看av| 国产97免费视频| 久久久久91| 亚洲婷婷在线视频| 色综合久久综合| 精品一区二区电影| 日韩亚洲精品视频| 精品人在线二区三区| 中文字幕亚洲一区二区三区五十路| 亚洲成人中文字幕| 一区二区亚洲精品国产| 欧美麻豆久久久久久中文 | 国产欧美一区二区三区在线| 国产91在线高潮白浆在线观看| 国产精品扒开腿做爽爽爽男男| 亚洲tv在线观看| 亚洲熟妇无码av在线播放| 扒开伸进免费视频| 影音先锋黄色资源| 国产精品成人一区二区三区电影毛片| 久久国产精品网| 亚洲成色www.777999| 亚洲一区二区在线看| 日本一区二区黄色| 宇都宫紫苑在线播放| 人妻激情偷乱频一区二区三区| 久青草视频在线观看| 久久91精品久久久久久秒播| 欧美日韩国产在线看| 日韩中文字幕在线免费观看| 日韩国产美国| 男女啪啪网站视频| 国产无遮挡又黄又爽在线观看| 亚洲第一天堂网| 首页国产欧美日韩丝袜| 成人一区二区三区在线观看| 99久久免费视频.com| 一区二区欧美在线观看| 欧美日韩免费高清一区色橹橹| 亚洲最新视频在线| 国产成人精品午夜| 日本成人激情视频| 国产在线视频2019最新视频| 亚洲不卡1区| 天天干天天av| 福利一区二区三区四区| 天堂av一区二区三区| 久久成人18免费观看| 国产精品久久久一本精品| 欧美日韩成人一区| 6080亚洲精品一区二区| 亚洲欧美在线磁力| 国产成人精品在线播放| 欧美日韩精品一区| 日韩精品国产一区| 久久精品视频5| 久久久久久久电影| 91精品国产91久久久久久一区二区 | 国产最新精品视频| 裸体丰满少妇做受久久99精品| 欧美日韩一区二区三| 久久精品国产精品亚洲色婷婷| 亚洲欧美日本一区二区| 无码人妻精品一区二区50| 日韩 欧美一区二区三区| 国产精品久久影院| 久久黄色影院| 91免费看`日韩一区二区| 亚洲欧洲av色图| 欧美丰满一区二区免费视频| 2019中文字幕免费视频| 久久99久久久久久| 午夜爱爱毛片xxxx视频免费看| 一级片aaaa| 91啦中文在线观看| 91精品国产综合久久久蜜臀粉嫩| 欧美激情一区二区三区高清视频 | 欧美精品视频www在线观看| 国产精品久久久久久久app| 欧美xxxxx在线视频| 亚洲精品国产av| 欧美午夜不卡视频| 97久久精品午夜一区二区| av无码av天天av天天爽| 久久精品国产一区二区| 精品国产乱码91久久久久久网站| 岛国视频一区| 高清一区二区视频| 亚洲精品久久久久久国| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲伦在线观看| 欧美日韩国产专区| 久久久国产精彩视频美女艺术照福利| 蜜桃视频日韩| 久久午夜夜伦鲁鲁片| 免费无码国产精品| 懂色av中文字幕一区二区三区| 亚洲一区免费视频| 日韩高清免费在线| 日本韩国在线不卡| 五月天国产一区| 国产精品91av| 精品乱码一区内射人妻无码 | 美女999久久久精品视频| 亚洲啪啪av| 天天插天天操天天射| 日韩免费av网站| 国产精品色一区二区三区| 成人精品免费视频| 九色91av视频| 在线a免费观看| 狠狠色丁香婷婷综合| 日韩精品极品在线观看| 国产中文字幕乱人伦在线观看| 这里只有久久精品视频| 亚洲综合视频网| 国产91露脸中文字幕在线| 免费看a级黄色片| 亚洲黄色在线免费观看| 久久精品夜色噜噜亚洲aⅴ| 亚洲图片制服诱惑| 精品视频一区在线| 国产又黄又粗又猛又爽的视频 | 欧美亚洲精品在线观看| 国产精品毛片久久久久久| 亚洲女人天堂网| 男人天堂成人网| 日本性高潮视频| 天天干,天天操,天天射| 亚洲精品国产精华液| 欧美另类极品videosbest最新版本 | 四虎一区二区| 卡一卡二卡三在线观看| 国产成人三级在线观看| 亚洲国内高清视频| 欧美日韩喷水| 任你操精品视频| 国产高清成人在线| 亚洲精品720p| 亚洲综合色av| 800av在线播放| 久久精品三级| 91麻豆精品国产91久久久久久 | 国产对白videos麻豆高潮| 成人午夜免费av| 精品无人国产偷自产在线| 久久亚洲一区二区| 一区二区三区在线观看免费视频| 麻豆国产精品一区二区三区 | 日韩中文娱乐网| 久久综合狠狠综合久久综青草| 成人黄色a级片| 国产精品麻豆久久久| 海角国产乱辈乱精品视频| 亚洲网中文字幕| 国内精品视频一区二区三区八戒 |