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. Java 性能优化的 50 个细节

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. #尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间, ...

  2. IDE搬进浏览器里——JetBrains Projector

    发展 提起 JetBrains,你会想到什么?各路强大的 IDE,比如 Android Studio.IDEA.WebStorm--这些对于开发者来说耳熟能详的产品都出自这家公司,这些 IDE 的功能 ...

  3. 【Linux】【Services】【SaaS】Docker+kubernetes(2. 配置NTP服务chrony)

    1. 简介 1.1. 这次使用另外一个轻量级的NTP服务,chrony.这是openstack推荐使用的ntp服务. 1.2. 官方网站:https://chrony.tuxfamily.org/ 2 ...

  4. MySQL-核心技术

    1.基本查询语句 1.1使用select 语句查询一个数据表 select * from user; 1.2 查询表中的一列或多列 select id,ixdh from user; 1.3从一个表或 ...

  5. 1945-祖安 say hello-String

    1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include<bits/stdc++.h> 3 char str[100][40]; 4 char s[10 ...

  6. 【C++】最长回文子串/动态规划

    ACM #include <bits/stdc++.h> using namespace std; const int maxn = 1010; char S[maxn]; int dp[ ...

  7. 【代码优化】List.remove() 剖析

    一.犯错经历 1.1 故事背景 最近有个需求大致的背景类似: 我已经通过一系列的操作拿到一批学生的考试成绩数据,现在需要筛选成绩大于 95 分的学生名单. 善于写 bug 的我,三下五除二完成了代码的 ...

  8. Linux下安装数据库sqlite3

    目录 一.简介 二.安装 三.测试 一.简介 SQLite 是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.SQLite 是在世界上最广泛部署的 SQL 数据库引擎 ...

  9. 自动执行Python脚本

    一.自动执行Python脚本(前提条件是电脑已安装对应的Python程序) 1.1.win+R-输入cmd在输入where python查看Python的安装位置 C:\Users\ASUS\AppD ...

  10. libevent 资源链接

    * libevent官网:http://libevent.org/  * libevent API:http://www.monkey.org/~provos/libevent/doxygen-2.0 ...