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")
}

测试:

Postman对golang服务发起的请求:

Spring boot项目收到来自golang服务的请求,并进行了处理和响应:

Golang项目捕获到了响应:

数据库成功插入了一条信息:

golang(gin框架),基于RESTFUL的跨语言远程通信尝试的更多相关文章

  1. 前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin

    原文链接 我是一名五六年经验的前端程序员,现在准备学习一下 Golang 的后端框架 gin. 以下是我的学习实战经验,记录下来,供大家参考. https://github.com/gin-gonic ...

  2. 基于Thrift的跨语言、高可用、高性能、轻量级的RPC框架

    功能介绍 跨语言通信 方便的使Java.Python.C++三种程序可以相互通信 负载均衡和容灾处理 方便的实现任务的分布式处理 支持服务的水平扩展,自动发现新的服务节点 能够兼容各种异常情况,如节点 ...

  3. golang gin框架中实现一个简单的不是特别精确的秒级限流器

    起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...

  4. Golang gin框架学习

    今天开始学习gin框架,在Github上找的示例的go-gin-example, 进度 日期 进展 疑惑 进展 1.30 下拉代码,初步了解gin的介绍.搭建 .mod文件 module原理.使用方法 ...

  5. golang gin框架中实现大文件的流式上传

    一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...

  6. [Golang] Gin框架学习笔记

    0x0 Gin简介 1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httpr ...

  7. golang gin框架 使用swagger生成api文档

    github地址:https://github.com/swaggo/gin-swagger 1.下载swag $ go get -u github.com/swaggo/swag/cmd/swag ...

  8. golang gin框架中实现"Transfer-Encoding: chunked"方式的分块发送数据到浏览器端

    参考了这篇帖子: https://golangtc.com/t/570b403eb09ecc66b90002d9 golang web如何发送小包的chunked数据 以下是代码: r.GET(&qu ...

  9. golang gin框架设置静态目录

    router := gin.Default() 第一个参数是api 第二个静态问价的文件夹相对目录 router.StaticFS("/data", http.Dir(" ...

随机推荐

  1. 【leetocde】922. Sort Array By Parity II

    Given an array of integers nums, half of the integers in nums are odd, and the other half are even.  ...

  2. 技术预演blog

    canal整合springboot实现mysql数据实时同步到redis spring+mysql集成canal springboot整合canal监控mysql数据库 SpringBoot cana ...

  3. Shell脚本实现监视指定进程的运行状态

    在之前的博客中,曾经写了自动化测试程序的实现方法,现在开发者需要知道被测试的进程(在此指运行在LINUX上的主进程的)在异常退出之前的进程的运行状态,例如内存的使用率.CPU的使用率等. 现用shel ...

  4. Oracle SQL中join方式总结

    在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结).SQL JOIN其实是一个逻辑概念,像NEST LOOP JOIN. HASH JOIN等 ...

  5. Spring 与 SpringBoot 的区别

    概述 Spring 与 SpringBoot 有什么区别???梳理一下 Spring 和 SpringBoot 到底有什么区别,从 Spring 和 SpringBoot 两方面入手. Spring ...

  6. pandas读取csv文件中文乱码问题

    1.为什么会出现乱码问题,用什么方式编码就用什么方式解码,由于csv不是用的utf-8编码,故不能用它解码. 常用的编码方式有 utf-8,ISO-8859-1.GB18030等. 2.中文乱码原因: ...

  7. VectorCAST - 通过确保测试的完整性控制产品质量

    软件测试面临的问题有一句格言是这样说的,"如果没有事先做好准备,就意味着做好了 失败的准备."如果把这个隐喻应用在软件测试方面,就可以这样说"没有测试到,就意味着测试失败 ...

  8. Groovy获取Bean两种方式(奇淫技巧操作)

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 背景: 在Java代码中当我们需要一个Bean对象,通常会使用spring中@Autowired注解,用来自动装配对象. 在Groovy ...

  9. 微信小程序第一步

    微信小程序开发文档https://developers.weixin.qq.com/miniprogram/dev/#小程序简介

  10. Nginx 中 location 的匹配顺序

    nginx中location的匹配模式有以下几种: 精确匹配:以=开头,只有完全匹配才能生效,例子location = /uri 非正则匹配:以^~开头,^表示非.~表示正则,例子location ^ ...