golang(gin框架),基於RESTFUL的跨語言遠端通訊嘗試

學習先生發表於2022-01-02

golang(gin框架),基於RESTFUL的跨語言遠端通訊嘗試

背景:

在今年的專案實訓過程中,遇到了這樣的問題:

企業老師講課實用的技術棧是Java springboot。

實訓實際給我們講課以外的開發時間非常短暫,為了方便協作、提高效率,我們想要將系統模組拆分成幾個粒度比較大的分散式服務。然而同學合作開發之間用的語言棧不相同,讓大家都學習類似gRPC的跨語言遠端呼叫技術也不現實,於是便決定通過一箇中心閘道器對各個模組發起http restful呼叫,實現模組服務的拆分。

慕慕生鮮架構.drawio

簡單嘗試:

spring boot專案的一個註冊介面:

/**
 * springboot專案的一個註冊介面通過param簡單的傳入userName和password兩個值
 * 進行簡單的校驗後完成註冊。
 * 示例:localhost:8080/register?userName=1233&password=123456
 */
@RestController //@Controller+ @ResponseBody
public class UserController {
    @Autowired
    private UserService userService;
    @PostMapping("/register")
    public Result register(@RequestParam("userName") String userName,
                           @RequestParam("password") String password){
        if(!StringUtils.hasText(userName)){
            return Result.error(MallExceptionEnum.NEED_USERNAME);
        }
        if(!StringUtils.hasText(password)){
            return Result.error(MallExceptionEnum.NEED_PASSWORD);
        }
        if(password.length()<6){
            return Result.error(MallExceptionEnum.NEED_PASSWORD_LENGTH);
        }
        userService.register(userName,password);
        return Result.success();
    }
}

golang對Java專案的Restful呼叫:

package main

import (
   "bytes"
   "fmt"
   "github.com/gin-gonic/gin"
   "net/http"
   "strings"
)

func main() {
   router := gin.Default()
   gin.SetMode(gin.DebugMode)
    //註冊路由"/test",一個匿名實現方法完成對springboot的簡單嘗試呼叫
   router.GET("/test", func(c *gin.Context) {
      var body = strings.NewReader("請求的body在這個介面示例中無影響")
      //對springboot專案的註冊介面傳送一個Post請求,返回一個response結構體
      resp, err := http.Post("http://localhost:8080/register?userName=Mrxuexi&password=123456",       "application/json; charset=utf-8", body)
      //獲取響應結構體resp的body部分(body是io.ReadCloser型別),將其轉化為[]byte
      reader := resp.Body
      buf := new(bytes.Buffer)
      buf.ReadFrom(reader)

      c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders)
      fmt.Println("resp", resp)
      fmt.Println("body", buf)
   })
    
   router.Run(":9090")
}

測試:

Postman對golang服務發起的請求:

image-20220102152412846

Spring boot專案收到來自golang服務的請求,並進行了處理和響應:

image-20220102152647949

Golang專案捕獲到了響應:

image-20220102152738715

資料庫成功插入了一條資訊:

image-20220102152832775

相關文章