golang(gin框架),基於RESTFUL的跨語言遠端通訊嘗試
背景:
在今年的專案實訓過程中,遇到了這樣的問題:
企業老師講課實用的技術棧是Java springboot。
實訓實際給我們講課以外的開發時間非常短暫,為了方便協作、提高效率,我們想要將系統模組拆分成幾個粒度比較大的分散式服務。然而同學合作開發之間用的語言棧不相同,讓大家都學習類似gRPC的跨語言遠端呼叫技術也不現實,於是便決定通過一箇中心閘道器對各個模組發起http restful呼叫,實現模組服務的拆分。
簡單嘗試:
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")
}