ginapi服务器性能,gin框架构建Api之:环境配置和路由

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本。具有快速灵活,容错方便等特点。其实对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错。框架更像是一些常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。

什么是 API

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数或者接口,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无须访问源码,或理解内部工作机制的细节。

要实现一个 API 服务器,首先要考虑两个方面:API 风格和媒体类型。Go 语言中常用的 API 风格是 RPC 和 REST,常用的媒体类型是 JSON、XML 和 Protobuf。在 Go API 开发中常用的组合是 gRPC + Protobuf 和 REST + JSON,本次我们使用gin作为api服务的构建框架。

加载路由,并启动 HTTP 服务

main.go 中的 main() 函数是 Go 程序的入口函数,在 main() 函数中主要做一些配置文件解析、程序初始化和路由加载之类的事情,最终调用 http.ListenAndServe() 在指定端口启动一个 HTTP 服务器。本小节是一个简单的 HTTP 服务器,仅初始化一个 Gin 实例,加载路由并启动 HTTP 服务器。

开发环境搭建

Go 有多种安装方式,比如 Go 源码安装、Go 标准包安装、第三方工具(yum、apt-get 等)安装。本小册 API 运行在 Linux 服务器上,选择通过标准包来安装 Go 编译环境。Go 提供了每个平台打好包的一键安装,这些包默认会安装到如下目录:/usr/local/go。当然你可以改变它们的安装位置,但是改变之后你必须在你的环境变量中设置如下两个环境变量:

GOROOT:GOROOT 就是 Go 的安装路径

GOPATH:GOPATH 是作为编译后二进制的存放目的地和 import 包时的搜索路径

假定你想要安装 Go 的目录为 $GO_INSTALL_DIR,后面替换为相应的目录路径,安装步骤如下。

下载安装包

安装包下载地址为 golang.org,如果打不开可以使用这个地址:golang.google.cn。

Linux 版本选择 goxxxxx.linux-amd64.tar.gz 格式的安装包,这里在 Linux 服务器上直接用 wget 命令下载:

$ wget https://dl.google.com/go/go1.10.2.linux-amd64.tar.gz

设置安装目录

$ export GO_INSTALL_DIR=$HOME

这里我们安装到用户主目录下。

解压 Go 安装包

$ tar -xvzf go1.10.2.linux-amd64.tar.gz -C $GO_INSTALL_DI

设置环境变量

$ export GO_INSTALL_DIR=$HOME

$ export GOROOT=$GO_INSTALL_DIR/go

$ export GOPATH=$HOME/ginserver

$ export PATH=$GOPATH/bin:$PATH:$GO_INSTALL_DIR/go/bin

如果不想每次登录系统都设置一次环境变量,可以将上面 4 行追加到 $HOME/.bashrc 文件中。

执行 go version 检查 Go 是否成功安装

$ go version

go version go1.10.2 linux/amd64

看到 go version 命令输出 go 版本号 go1.10.2 linux/amd64,说明 go 命令安装成功。

创建 $GOPATH/src 目录, $GOPATH/src是 Go 源码存放的目录,所以在正式开始编码前要先确保 $GOPATH/src 目录存在,执行命令:

$ mkdir -p $GOPATH/src

加载路由,并启动 HTTP 服务

main.go 中的 main() 函数是 Go 程序的入口函数,在 main() 函数中主要做一些配置文件解析、程序初始化和路由加载之类的事情,最终调用 http.ListenAndServe() 在指定端口启动一个 HTTP 服务器。本小节是一个简单的 HTTP 服务器,仅初始化一个 Gin 实例,加载路由并启动 HTTP 服务器。

编写入口函数,编写 main() 函数,main.go 代码:

package main

import (

"runtime"

"com.api.com/router"

)

func main() {

runtime.GOMAXPROCS(runtime.NumCPU())

routers := router.InitRouter()

routers.Run(":8080")

}

加载路由 src/com.api.com/router/router.go

.........

// InitRouter 定义路由及函数

func InitRouter() *gin.Engine {

router := gin.Default()

load(

// Cores.

router,

// Middlwares.

middleware.Logging(),

)

//router.GET("/video/getAddressByFileId", http.GetAddressByFileID)

return router

}

自定义recovery捕获错误

gin.Recovery():在处理某些请求时可能因为程序 bug 或者其他异常情况导致程序 panic,这时候为了不影响下一次请求的调用,需要通过 gin.Recovery()来恢复 API 服务器

`````

type recovery struct {

//out optional output to log any panics

}

func (r recovery) Serve(ctx *gin.Context) {

defer func() {

if err := recover(); err != nil {

fmt.Println("recover from panic", err.(error),string(debug.Stack()))

errJson, _:= json.Marshal(ctx.Request.URL.Query())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

楚留香手游服务器维护,【楚留香手游】4.27日游戏维护公告

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼诸位亲爱的少侠:绿阴铺野换新光,薰风初昼长。正所谓春困夏乏秋打盹,睡不醒的冬三月。一年虽四季,睡觉总相宜。立夏将至,天机阁弟子看少侠与周公天人交战实在辛苦&#xff…

mysql手动启动1067错误_解决MySQL启动时万恶的1067错误(转)

解决MySQL启动时万恶的1067错误(转)[more]我的机器不知为何,安装MySQL的时候,一到配置那一步就无休止的等待,只好结束任务,然而启动MySQL的时候出现1067错误提示。卸载,依然出现无休止等待,解决办法是先结束…

reset java_Java PushbackReader reset()用法及代码示例

Java中的PushbackReader类的reset()方法用于重置Stream。对于PushbackReader,此方法始终会引发异常,因为PushbackReader不支持此方法。用法:public void reset()参数:此方法不接受任何参数。返回值:此方法不返回任何值。异常&…

java如何关闭一个线程_如何关闭一个java线程池

Java 并发工具包中 java.util.concurrent.ExecutorService 接口定义了线程池任务提交、获取线程池状态、线程池停止的方法等。JDK 1.8 中,线程池的停止一般使用 shutdown()、shutdownNow()方法。shutdown有序关闭,已提交任务继续执行不接受新任务主线程向…

2048java课程设计报告_软件工程——Java版2048游戏学习报告

2048游戏学习报告姓名:王浩专业:计算机科学与技术年级:15级4班学号:201510411420目录一. 前言 3二. 对游戏的简要分析 31. 游戏的定位分析 32. 游戏的构造分析及对应代码 …

java android rsa加密解密_Android RSA数据加密与Java服务端RSA私钥解密出错问题

1. 出错描述:服务RSA解密抛出javax.crypto.BadPaddingException: Decryption error2.出错原因:Android系统使用的虚拟机(dalvik)跟SUN标准JDK是有所区别的,其中他们默认的RSA实现就不同。即Android端用Cipher.getInstance("RSA")方…

java ee 值范围_【转载】JAVAEE之内置对象和属性范围

内置对象和属性范围​ 四种属性范围​ 九个内置对象1.内置对象如果说想要使用一个对象,必须new 出来,但是在我们的jsp操作中,发现我们使用过的out,request对象没有进行实例化,类似于这样的对象,我们叫做jsp的内置对象&…

java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例

并发主题使用Executors 和 ThreadPoolExecutor实现Java线程池案例首先需要一个工作线程:package com.journaldev.threadpool;public class WorkerThread implements Runnable {private String command;public WorkerThread(String s){this.commands;}Overridepublic…

getordefault java_Java map.getOrDefault()方法的用法详解

Map.getOrDefault(Object key, V defaultValue)方法的作用是&#xff1a;当Map集合中有这个key时&#xff0c;就使用这个key值&#xff1b;如果没有就使用默认值defaultValue。代码示例如下&#xff1a;HashMap map new HashMap<>();map.put("name", "co…

java 复合_【福利】java新手做的复合型计算器!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼先前用那个代码不走样说要审核,我这里不用那个来发代码import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JTextField;import java.awt.GridLayout;import javax.sw…

python模块如何导入解释器_无法从嵌入式解释器导入内置模块(仅限Windows)

这个问题看起来可能是一个重复的问题但我认为我的问题是不同的。我正在从一个MSVC编译的C应用程序运行Python 3.4解释器&#xff0c;并且我尝试使用PTVSD模块来调试更容易。到目前为止&#xff0c;我已经能够连接到Python Ipter&#xff0c;我从命令行开始&#xff0c;没有问题…

java方法的传递方式_JAVA基础--方法传参

JAVA基础--方法传参为啥拿这个当话题&#xff1f;在初学者阶段&#xff0c;许多童鞋都对方法传参比较迷茫&#xff0c;知其然不知其所以然。一.先说说参数传递的几个术语&#xff1a;值调用(call by vale):表示方法接收的是调用者传递的值。引用调用(call by reference):表示方…

java web spark_spark-微型的Java Web框架 Spark Framework

导读热词Spark是一个微型的Java Web框架&#xff0c;它的灵感来自于Sinatra&#xff0c;它的目的是让你以最小的代价创建出一个Java Web应用。Implement CORS in Spark -spark中如何处理跨域资源共享问题代码如下&#xff1a;// Enables CORS on requests. This method is an i…

java udp 协议_网络协议 - UDP 协议详解

网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛&#xff0c;所以也有必要对UDP协议进行详解。pdai UDP概述UDP(User Datagram Protocol)即用户数据报协议&#xff0c;在网络中它与TCP协议一样用于处理数据包&#xff0c;是一种无连接的协议。在OSI模型中&#xff0c;在第…

java 8 foreach_Java 8 forEach Stream()与旧版forEach循环

我正在尝试使用Spring的示例代码.部分代码如下所示&#xff1b;private List points;long timeTakeninMilis System.currentTimeMillis();public List getPoints() {return points;}public void setPoints(List points) {this.points points;}public void drawJava8() {point…

java list 超出范围_java-列索引超出范围:2,列数1

我有这个表&#xff1a;学生CREATE TABLE IF NOT EXISTS Klas_student(Student varchar(7) REFERENCES studenten (Studentenummer) ON DELETE CASCADE NOT NULL,Klas text NOT NULL REFERENCES Klas (Naam_id) ON DELETE CASCADE NOT NULL);在此表格中,我想添加值,我使用prepa…

java 写入指定路径文件_java对指定目录下文件读写操作介绍 | 学步园

最近因为项目的国际化的需要&#xff0c;需要对整个项目的100来个插件做国际化&#xff0c;这是一件痛苦的事情&#xff0c;因为纯体力劳动。为了省点工作量&#xff0c;想着能不能写个程序批处理了&#xff0c;减少点工作量&#xff0c;于是就有了下面的代码。1.读取指定的(.j…

点击编辑框全选内容java_Android 中使用EditText 点击全选再次点击取消全选功能

最近在开发浏览器碰到这么一个需求&#xff1a;点击地址栏的时候&#xff0c;需要全选并调出键盘&#xff0c;再次点击就取消全选显示光标。点击屏幕除地址栏其他位置时&#xff0c;键盘隐藏&#xff0c;隐藏光标。大部分浏览器都是这样的逻辑&#xff0c;这样可以提高用户体验…

java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码

RSA的应用RSA是一种非对称加密算法。现在&#xff0c;很多登陆表单的密码的都采用RSA加密&#xff0c;例如京东中的登陆使用公钥对密码进行加密java使用RSA加密方式实现数据加密解密&#xff0c;需要首先产生私钥和公钥测试代码public static void main(String args[]){try {RS…

java线程卡住排查_基于 Java 线程栈 排查问题

除日志外&#xff0c;还有没有别的方式跟踪线上服务问题呢&#xff1f;或者&#xff0c;跟踪并排除日志里无法发现的问题&#xff1f;方法当然是有的&#xff0c;就是通过现场快照定位并发现问题。我们所说的现场&#xff0c;主要指这两方面&#xff1a;Java 线程栈。线程栈是J…