golang(gin框架),基于RESTFUL的跨语言远程通信尝试
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的跨语言远程通信尝试的更多相关文章
- 前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin
原文链接 我是一名五六年经验的前端程序员,现在准备学习一下 Golang 的后端框架 gin. 以下是我的学习实战经验,记录下来,供大家参考. https://github.com/gin-gonic ...
- 基于Thrift的跨语言、高可用、高性能、轻量级的RPC框架
功能介绍 跨语言通信 方便的使Java.Python.C++三种程序可以相互通信 负载均衡和容灾处理 方便的实现任务的分布式处理 支持服务的水平扩展,自动发现新的服务节点 能够兼容各种异常情况,如节点 ...
- golang gin框架中实现一个简单的不是特别精确的秒级限流器
起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...
- Golang gin框架学习
今天开始学习gin框架,在Github上找的示例的go-gin-example, 进度 日期 进展 疑惑 进展 1.30 下拉代码,初步了解gin的介绍.搭建 .mod文件 module原理.使用方法 ...
- golang gin框架中实现大文件的流式上传
一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...
- [Golang] Gin框架学习笔记
0x0 Gin简介 1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httpr ...
- golang gin框架 使用swagger生成api文档
github地址:https://github.com/swaggo/gin-swagger 1.下载swag $ go get -u github.com/swaggo/swag/cmd/swag ...
- golang gin框架中实现"Transfer-Encoding: chunked"方式的分块发送数据到浏览器端
参考了这篇帖子: https://golangtc.com/t/570b403eb09ecc66b90002d9 golang web如何发送小包的chunked数据 以下是代码: r.GET(&qu ...
- golang gin框架设置静态目录
router := gin.Default() 第一个参数是api 第二个静态问价的文件夹相对目录 router.StaticFS("/data", http.Dir(" ...
随机推荐
- LeetCode382-链表随机节点
原题链接:[382. 链表随机节点]:https://leetcode-cn.com/problems/linked-list-random-node/ 题目描述: 给定一个单链表,随机选择链表的一个 ...
- GO Exit Fatal panic
Exit() 应用程序(不只是函数)退出执行 defer 不会被执行(因为程序都退出了) log.Fatal() 输出打印内容 应用程序退出 defer 不会被执行 panic() 函数停止执行(不是 ...
- jquery:iframe里面的元素怎样触发父窗口元素的事件?
例如父窗口定义了一个事件. top: $(dom1).bind('topEvent', function(){}); 那么iframe里面的元素怎样触发父窗口dom1的事件呢?这样吗? $(dom1, ...
- SQLServer和java数据类型的对应关系
转载自:https://www.cnblogs.com/cunkouzh/p/5504052.html SQL Server 类型 JDBC 类型 (java.sql.Types) Java 语言类型 ...
- ExecutorService 线程池详解
1.什么是ExecutorService,为什么要使用线程池? 许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务,每当一个请求到达就创建一个新线程,然后在新线程中为请求服务,但是频繁创建新 ...
- 机器学习——可视化绘图matplotlib和seaborn
安装matplotlib和seaborn https://blog.csdn.net/Jia_jinjin/article/details/80428598 seaborn pairplot:特征两两 ...
- 常用windows命令和Dos命令
Windows常用快捷键 Ctrl + C :复制 Ctrl + V :粘贴 Ctrl + X :剪切 Ctrl + A :全选 Ctrl + Z :撤销(做错了后退一步) Ctrl + Y :向前一 ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]CSRe
[V&N2020 公开赛]CSRe 附件 步骤: 例行检查,无壳儿,但是有NET混淆,使用de4dot工具进行处理 之后用dnSpy打开,从入口点开始看程序 找到有关flag的信息 flag由 ...
- [BUUCTF]PWN——hitcontraining_uaf
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
- Windows 任务计划部署 .Net 控制台程序
Windows 搜索:任务计划程序 创建任务 添加任务名称 设置触发器:这里设置每10分钟执行一次 保存之后显示 此任务会从每天的 0:10:00 执行第一次后一直循环下去. 在操作选项卡下,选择启动 ...