Go语言实战 : API服务器 (2) 运行流程

1.API服务器的总流程

分为两步:

  1. 启动API服务器
  2. API服务器对HTTP请求进行处理

2.API服务器启动流程

  1. 解析配置文件,利用配置文件完成对服务器的初始化配置
  2. 初始化logger,开启日志记录
  3. 与数据库建立连接
  4. 设置http连接(例如设置响应头,注册路由,注册中间件)

3.HTTP 请求处理流程

  1. DNS域名解析
    DNS的过程是这样的:首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个url发给这个配置的DNS服务器,如果能够找到相应的url则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS,整个DNS可以看做是一个树状结构,该请求将一直发送到根直到得到结果。现在已经拥有了目标ip和端口号,这样我们就可以打开socket连接了。

  2. 建立连接
    当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的(tcp链接),所以之前还有一个DNS解析过程,把域名变成ip,如果url里不包含端口号,则会使用该协议的默认端口号。

  3. 发送请求
    连接成功建立后,开始向web服务器发送请求,这个请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为GET 路径/文件名 HTTP/1.0
    文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本)

现在可以发送GET命令:GET /mydir/index.html HTTP/1.0

  1. 接收请求
    API服务器收到这个请求,进行处理,首先根据 HTTP 请求行的信息来解析到 HTTP 方法和路径,之后根据 API 服务器注册的路由信息(大概可以理解为:HTTP 方法 + 路径和具体处理函数的映射)找到具体的处理函数。

  2. 处理请求
    在接收到请求之后,API 通常会解析 HTTP 请求报文获取请求头和消息体,然后根据这些信息进行相应的业务处理,HTTP 框架一般都有自带的解析函数,只需要输入 HTTP 请求报文,就可以解析到需要的请求头和消息体。

例如对应刚刚的get请求,就会解析出请求的消息头和消息体,然后API服务器就根据解析出来的内容,从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。

业务处理主要可以分为:

  1. 包含对数据库的操作:需要访问数据库(增删改查),然后获取指定的数据,对数据处理后构建指定的响应结构体,返回响应包。
  2. 不包含对数据库的操作:进行业务逻辑处理后,构建指定的响应结构体,返回响应包。

4.REST Web 框架选择

要编写一个 RESTful 风格的 API 服务器,首先需要一个 RESTful Web 框架,选择 GitHub star 数最多的 Gin。采用轻量级的 Gin 框架,具有如下优点:

  • 快速

基于 Radix 树的路由,小内存占用。没有反射。可预测的 API 性能。

  • 支持中间件

传入的 HTTP 请求可以由一系列中间件和最终操作来处理。例如:Logger,Authorization,GZIP,最终操作 DB。

  • Crash 处理

Gin 可以 catch 一个发生在 HTTP 请求中的 panic 并 recover 它。这样,你的服务器将始终可用。例如,你可以向 Sentry 报告这个 panic!

  • JSON 验证

Gin 可以解析并验证请求的 JSON,例如检查所需值的存在。

  • 路由组

更好地组织路由。是否需要授权,不同的 API 版本…… 此外,这些组可以无限制地嵌套而不会降低性能。

  • 错误管理

Gin 提供了一种方便的方法来收集 HTTP 请求期间发生的所有错误。最终,中间件可以将它们写入日志文件,数据库并通过网络发送。

  • 内置渲染

Gin 为 JSON,XML 和 HTML 渲染提供了易于使用的 API。

  • 可扩展性

新建一个中间件非常简单

5.配置解决方案

Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式,具有如下特性:

  • 设置默认值
  • 从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件读取配置信息
  • 实时监控和重新读取配置文件(可选)
  • 从环境变量中读取
  • 从远程配置系统(etcd或Consul)读取并监控配置变化
  • 从命令行参数读取配置
  • 从buffer读取配置
  • 显式配置值

从上面这些特性来看,Viper 毫无疑问是非常强大的,而且 Viper 用起来也很方便,在初始化配置文件后,读取配置只需要调用 viper.GetString()、viper.GetInt() 和 viper.GetBool() 等函数即可。

Viper能够执行下列操作:

  1. 查找、加载和反序列化JSON、TOML、YAML、HCL、INI、envfile和Java properties格式的配置文件;
  2. 提供一种机制为你的不同配置选项设置默认值;
  3. 提供一种机制来通过命令行参数覆盖指定选项的值;
  4. 提供别名系统,以便在不破坏现有代码的情况下轻松重命名参数;
  5. 当用户提供了与默认值相同的命令行或配置文件时,可以很容易地分辨出它们之间的区别;

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

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

相关文章

Linux 命令 之查看程序占用内存

2019独角兽企业重金招聘Python工程师标准>>> 查看PID ps aux | grep nginx root 3531 0.0 0.0 18404 832 ? Ss 15:29 0:00 nginx: master process ./nginx 查看占用资源情况 pmap -d 3531 top -p 3531 转载于:https://my.oschina.net/mengzha…

逻辑回归 自由度_回归自由度的官方定义

逻辑回归 自由度Back in middle and high school you likely learned to calculate the mean and standard deviation of a dataset. And your teacher probably told you that there are two kinds of standard deviation: population and sample. The formulas for the two a…

动画电影的幕后英雄怎么说好_幕后编码面试-好与坏

动画电影的幕后英雄怎么说好Interviewing is a skill in and of itself. You can be the best developer in the world but you may still screw up an interview.面试本身就是一种技能。 您可以成为世界上最好的开发人员,但您仍可能会搞砸面试。 How many times h…

数据库之DML

1、表的有关操作: 1.1、表的创建格式: CREATE TABLE IF NOT EXISTS 表名(属性1 类型,属性2 类型,....,属性n 类型);# 标记部分表示可以省略 1.2、表的修改格式:ALTER table 表名 ADD…

网络对抗技术作业一 201421410031

姓名:李冠华 学号:201421410031 指导教师:高见 1、虚拟机安装与调试 安装windows和linux(kali)两个虚拟机,均采用NAT网络模式,查看主机与两个虚拟机器的IP地址,并确保其连通性。同时…

生存分析简介:Kaplan-Meier估计器

In my previous article, I described the potential use-cases of survival analysis and introduced all the building blocks required to understand the techniques used for analyzing the time-to-event data.在我的上一篇文章中 ,我描述了生存分析的潜在用例…

强密码检测

#!/usr/bin/env python # -*- coding: utf-8 -*- #1. 密码长度应该大于或等于8位 #2. 密码必须包含数字、字母及特殊字符三种组合 nums 0123456789 chars1 abcdefghijklmnopqrstuvwxyz chars2 ABCDEFGHIJKLMNOPQRSTUVWXYZ symbols r!#$%^&*()_-/*{}[]\|";:/?…

OD Linux发行版本

题目描述: Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。 发行版集是一个或多…

Go语言实战 : API服务器 (3) 服务器雏形

简单API服务器功能 实现外部请求对API 服务器健康检查和状态查询,返回响应结果 1.API服务器的状态监测 以内存状态检测为例,获取当前服务器的健康状况、服务器硬盘、CPU 和内存使用量 func RAMCheck(c *gin.Context) {u, _ : mem.VirtualMemory()//获…

TCP/IP协议-1

转载资源,链接地址https://www.cnblogs.com/evablogs/p/6709707.html 转载于:https://www.cnblogs.com/Chris-01/p/11474915.html

http://nancyfx.org + ASPNETCORE

商务产品servicestack: https://servicestack.net/ http://nancyfx.org ASPNETCORE http://nancyfx.org Drapper ORM精简框架 https://github.com/StackExchange/Dapper Nancy 是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平…

使用r语言做garch模型_使用GARCH估计货币波动率

使用r语言做garch模型Asset prices have a high degree of stochastic trends inherent in the time series. In other words, price fluctuations are subject to a large degree of randomness, and therefore it is very difficult to forecast asset prices using traditio…

ARC下的内存泄漏

##ARC下的内存泄漏 ARC全称叫 ARC(Automatic Reference Counting)。在编译期间,编译器会判断对象的使用情况,并适当的加上retain和release,使得对象的内存被合理的管理。所以,从本质上说ARC和MRC在本质上是一样的,都是…

python:校验邮箱格式

# coding:utf-8import redef validateEmail(email):if re.match("^.\\(\\[?)[a-zA-Z0-9\\-\\.]\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) ! None:# if re.match("/^\w[a-z0-9]\.[a-z]{2,4}$/", email) ! None:print okreturn okelse:print failret…

cad2019字体_这些是2019年最有效的简历字体

cad2019字体When it comes to crafting the perfect resume to land your dream job, you probably think of just about everything but the font. But font is a key part of your first impression to recruiters and employers.当制作一份完美的简历来实现理想的工作时&…

Go语言实战 : API服务器 (4) 配置文件读取及连接数据库

读取配置文件 1. 主函数中增加配置初始化入口 先导入viper包 import (..."github.com/spf13/pflag""github.com/spf13/viper""log")在 main 函数中增加了 config.Init(*cfg) 调用,用来初始化配置,cfg 变量值从命令行 f…

方差偏差权衡_偏差偏差权衡:快速介绍

方差偏差权衡The bias-variance tradeoff is one of the most important but overlooked and misunderstood topics in ML. So, here we want to cover the topic in a simple and short way as possible.偏差-方差折衷是机器学习中最重要但被忽视和误解的主题之一。 因此&…

win10 uwp 让焦点在点击在页面空白处时回到textbox中

原文:win10 uwp 让焦点在点击在页面空白处时回到textbox中在网上 有一个大神问我这样的问题:在做UWP的项目,怎么能让焦点在点击在页面空白处时回到textbox中? 虽然我的小伙伴认为他这是一个 xy 问题,但是我还是回答他这个问题。 首…

python:当文件中出现特定字符串时执行robot用例

#coding:utf-8 import os import datetime import timedef execute_rpt_db_full_effe_cainiao_city():flag Truewhile flag:# 判断该文件是否存在# os.path.isfile("/home/ytospid/opt/docker/jsc_spider/jsc_spider/log/call_proc.log")# 存在则获取昨天日期字符串…

MySQL分库分表方案

1. MySQL分库分表方案 1.1. 问题:1.2. 回答: 1.2.1. 最好的切分MySQL的方式就是:除非万不得已,否则不要去干它。1.2.2. 你的SQL语句不再是声明式的(declarative)1.2.3. 你招致了大量的网络延时1.2.4. 你失去…