1. 定義路由服務(wù)
我們寫一個簡單的K8S示例來做完整示例:
package router
import (
"github.com/gin-gonic/gin"
)
func Server() {
r := gin.Default()
//創(chuàng)建一個groupV1組,里邊放一個檢查存活的接口
groupV1 := r.Group("/api/v1")
{
groupV1.GET("/ping", Ping)
}
//在創(chuàng)建一個deployment組,來放置deployment的操作相關(guān)接口
deployment := r.Group("/api/v1/deployment")
{
deployment.GET("/list",GetDeploymentList)
deployment.GET("/",GetDeployment)
deployment.DELETE("/",DeleteDeployment)
deployment.POST("/",CreateDeployment)
deployment.PUT("/image",ApplyDeploymentByImage)
deployment.PUT("/replicas",ApplyDeploymentByReplicas)
}
//啟動服務(wù),如果不寫端口,默認8080
r.Run(":1840")
}
2. 定義headers函數(shù)
2.1 Get方法
Query(Params方式)
- 參數(shù)接收示例
deploymentName := c.Query("deployment_name")
- 完整代碼示例
func GetDeployment(c *gin.Context) {
namespaceName := c.Query("namespace_name")
deploymentName := c.Query("deployment_name")
clientSet,err := service.ConnectK8s()
if err !=nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
deploymentInfo,err := service.GetDeployment(clientSet,namespaceName,deploymentName)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
fmt.Printf("%+v\n",deploymentInfo)
c.JSON(200,deploymentInfo)
}
說明:
(c *gin.Context)必須要傳入
-
postman調(diào)用
image.png
2.2 Post方法
BindJSON (Body=>raw=>JSON)
- 定義結(jié)構(gòu)體如下
type DeploymentQueryParams struct {
NamespaceName string `json:"namespace_name"`
DeploymentName string `json:"deployment_name"`
ImageName string `json:"image_name"`
PortNum int32 `json:"port_num"`
Replica int32 `json:"replica"`
}
- 參數(shù)接收示例
err := c.BindJSON(&deploymentQueryParams)
- 代碼完整示例
func CreateDeployment(c *gin.Context) {
var deploymentQueryParams service.DeploymentQueryParams
//傳參綁定結(jié)構(gòu)體
err := c.BindJSON(&deploymentQueryParams)
if err !=nil{
c.JSON(400, gin.H{"error": err.Error()})
return
}
clientSet,err := service.ConnectK8s()
if err !=nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
deploymentInfo,err := service.CreateSimpleDeployment(clientSet,deploymentQueryParams)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
fmt.Printf("%+v\n",deploymentInfo)
c.JSON(200,deploymentInfo)
}
-
postman調(diào)用
image.png
PostForm(Body=>form-data)
- 參數(shù)接收示例
deploymentName := c.PostForm("deployment_name")
- 完整示例
參見2.3 PUT方法中"PostForm(Body=>form-data)" 部分。
2.3 PUT方法
BindJSON (Body=>raw=>JSON)
- 參數(shù)接收示例
err := BindJSON(&deploymentQueryParams)
- 完整代碼示例
func ApplyDeploymentByImage(c *gin.Context) {
var deploymentQueryParams service.DeploymentQueryParams
c.BindJSON(&deploymentQueryParams)
clientSet,err := service.ConnectK8s()
if err !=nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
deploymentInfo,err := service.ApplyDeploymentByImage(clientSet,deploymentQueryParams.NamespaceName,deploymentQueryParams.DeploymentName,deploymentQueryParams.ImageName)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
fmt.Printf("%+v\n",deploymentInfo)
c.JSON(200,deploymentInfo)
}
-
postman 調(diào)用
image.png
PostForm(Body=>form-data)
- 參數(shù)接收示例
deploymentName := c.PostForm("deployment_name")
- 完整示例
修改一下上例(BindJSON)
func ApplyDeploymentByImageA(c *gin.Context) {
namespaceName := c.PostForm("namespace_name")
deploymentName := c.PostForm("deployment_name")
imageName := c.PostForm("image_name")
clientSet,err := service.ConnectK8s()
if err !=nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
deploymentInfo,err := service.ApplyDeploymentByImage(clientSet,namespaceName,deploymentName,imageName)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
fmt.Printf("%+v\n",deploymentInfo)
c.JSON(200,deploymentInfo)
}
2.4 DELETE方法
Query(Params方式)
- 參數(shù)接收示例
deploymentName := c.Query("deployment_name")
- 完整示例
func DeleteDeployment(c *gin.Context) {
namespaceName := c.Query("namespace_name")
deploymentName := c.Query("deployment_name")
clientSet,err := service.ConnectK8s()
if err !=nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
err = service.DeleteDeployment(clientSet,namespaceName,deploymentName)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}else {
c.JSON(200,"刪除成功")
}
}
-
postman 調(diào)用
image.png
PostForm(Body=>form-data)
- 參數(shù)接收示例
deploymentName := c.PostForm("deployment_name")
- 完整示例
func DeleteDeployment(c *gin.Context) {
namespaceName := c.PostForm("namespace_name")
deploymentName := c.PostForm("deployment_name")
clientSet,err := service.ConnectK8s()
if err !=nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
err = service.DeleteDeployment(clientSet,namespaceName,deploymentName)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}else {
c.JSON(200,"刪除成功")
}
}
Param (Path)
因為我們在k8s這個場景下不能一下定位到需要操作的資源,因此并不合適使用該方式,所以就不寫完整示例了,只寫一個樣例:
- 路由設(shè)置
deployment.PUT("/:uuid",DeleteDeploymentA)
- 參數(shù)接收示例
uuid := c.Param("uuid")
3. main函數(shù)調(diào)用路由服務(wù)
func main() {
router.Server()
}
4. 數(shù)據(jù)返回和錯誤處理
- 返回數(shù)據(jù)
c.JSON(200,deploymentInfo)
- 錯誤處理
if err !=nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
- 示例
見 “2. 定義headers函數(shù)”中各示例均可看到:
func GetDeployment(c *gin.Context) {
namespaceName := c.Query("namespace_name")
deploymentName := c.Query("deployment_name")
clientSet,err := service.ConnectK8s()
if err !=nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
deploymentInfo,err := service.GetDeployment(clientSet,namespaceName,deploymentName)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
fmt.Printf("%+v\n",deploymentInfo)
c.JSON(200,deploymentInfo)
}




