现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

go-restful框架简介

2019-09-15 14:30 工业·编程 ⁄ 共 1842字 ⁄ 字号 暂无评论

虽然,当前go语言的rest框架比较多,其中比较有名的有beego, gin等。但是这些框架相对来说都有点太重,而Kubernetes中使用的go-restful框架是一个轻量级的框架,能够满足大多数restful程序开发中的需求,本文对项目中使用go-restful框架中使用到的基本概念和使用方式做了简单的整理,如有不当之处,请不吝赐教。

基本概念

go-restful 框架中最基础的几个概念包括: route, webservice, container。

route

route是http server的基本概念,是指一条http请求的URL, 根据此URL来确定那个函数为其服务。 go-restful中的route也是一样的,不过代码实现的时候更准确的说法是注册路由。

webservice

webservice实际上是一组route的集合。这组route拥有相同的rootpath或者base path,拥有相同的输入输出格式,基本一致的请求数据类型等一些通用的属性,举例说明:User为例,webservice是以/user/为基础路径的一个route集合,其下列的请求都是请求user相关操作的route。
换一种说法是将一组相关性非常强的request URL封装成为一个webserviice。举个例子来说明我们在公司开发过程中有项目信息和用户信息; 这样项目可以作为一个webservice, 用户可以作为另一个webservice。webservice只是一组route的集合,其必须加入到container中才能够生效。

Container

Container 在http的角度就是一个Server,其包含一组webservice, 一个serveMUx,以及对应的routeselect负责请求派发。

三者之间的关系

一个container实际上是对外提供的一个(从http的基本角度看)http Server; 一个container里面可以有很多个webservice, 一个webservice可以看做是一组对象的服务,是一个种类的服务请求的一个合集或者看成是子服务; 一个 route则是单个请求的路由,一个webservice包括一组route,这一组路由有相同的base路径。其三者的相互关系如下图:

wps1

示例程序

package main

import (
    "fmt"
    "github.com/emicklei/go-restful"
    "k8s.io/klog"
    "net/http"
    "io"
    "time"
)

// webserver监听的端口号
var listenPort string

func main() {
	// 初始化log
	klog.InitFlags(nil)

	// 此处仅为示例,正常情况下请从配置文件或通过参数设置
	listenPort = 8080
	
	// 创建container,并注册路由
	container := restful.NewContainer()
    register(container)
    
    // 创建webserver,并监听
	server := newWebserver()
    if err := server.ListenAndServe(); err != nil {
        if err == http.ErrServerClosed {
            klog.Fatalf("Http Server closed under request: %v\n", err)
        } else {
            klog.Fatalf("Could not listen on %s: %v\n", listenPort, err)
        }
    }
}

// 创建一个webserver
func newWebserver() *http.Server {
    return &http.Server{
        Addr:         listenAddr,
        Handler:      container,
        ReadTimeout:  5 * time.Second,
        WriteTimeout: 10 * time.Second,
        IdleTimeout:  15 * time.Second,
    }
}

// 注册路由
func register(container *restful.Container) {
    ws := new(restful.WebService)
    ws.Route(ws.GET("/hello").To(hello))
    container.Add(ws)
}

// 处理函数
func hello(req *restful.Request, resp *restful.Response) {
	io.WriteString(resp, "world")
}

给我留言

留言无头像?