Mrxuexi

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

相关文章: