开发 web 服务程序

2023-11-15

github

任务目标

  1. 熟悉 go 服务器工作原理
  2. 基于现有 web 库,编写一个简单 web 应用类似 cloudgo
  3. 使用 curl 工具访问 web 程序
  4. 对 web 执行压力测试

  • 根据代码提示,按照cloud_go应用,编写相应的Web程序。
  • main.go
    • 按照flag包的应用,从命令行获取特定的端口号,默认为8080,并获取web服务,调用Run对特定端口开启特定服务,相应代码如下:
    const (
        PORT string = "8080"
    )
    
    func main() {
        port := os.Getenv("PORT")//get custom environment variables
        if len(port) == 0 {
            port = PORT
        }
        flag.StringVar(&port, "p", PORT, "PORT for httpd listening")
        flag.Parse()
        server := service.NewServer() // get server
        server.Run(":" + port) // run the server at specific port
    }
    
  • server.go
    • go文件函数NewServer提供main.go创建相应的web服务。
    • 调用render.New()函数为相应的web服务渲染格式,此处只简单的设置IndentJSON格式,后分别调用negroni.Classicmux.NewRouter,以默认参数创建web服务对象和Router路由对象。
    func NewServer() *negroni.Negroni {
        // New constructs a new Render instance with the supplied options.
        formatter := render.New(render.Options{ 
            IndentJSON: true,
        }) // rendering a web format
    
        n := negroni.Classic()
        mx := mux.NewRouter()
    
        initRoutes(mx, formatter)
        // set the router 
        n.UseHandler(mx)
        return n
    }
    
    • 其上的initRoutes函数负责设置路由配置,主要是按照不同的路由提供不同的服务,其中包含通过变量名获取参数信息如通过对http.Request调用URL处理获取特定信息,也如通过Methods方法获取形如{id}对应的变量值。其中,对路由调用HandleFunc设置不同路由特定的函数操作,需要传入func(w http.ResponseWriter, req *http.Request)形式的函数处理。
    func initRoutes(mx *mux.Router, formatter *render.Render) {
        // Methods adds a matcher for HTTP methods.
        // It accepts a sequence of one or more methods to be matched, e.g.:
        // "GET", "POST", "PUT".
        mx.HandleFunc("/{status}/{id}", testHandler(formatter)).Methods("GET")
        mx.HandleFunc("/{status}", testHandler(formatter)).Methods("GET")
        //provide a hanlder func to deal with specific router
        //corresponding to func(w http.ResponseWriter, req *http.Request)
    }
    
    • 根据传入的路由形式,我们可以获取处理的localhost:9090/xxx以及localhost:9090/xxx/yyy形式的路由并获取对应的参数值。通过形如map[string] string的方式输入对应的xxxyyy即可获取对应的参数。此处再调用render.JSON函数对http.ResponseWriter处理,再其上输出文本信息,即如下即可。
    func testHandler(formatter *render.Render) http.HandlerFunc {
        return func(w http.ResponseWriter, req *http.Request) {
            vars := mux.Vars(req)
            id := vars["id"]
            status := vars["status"]
            formatter.JSON(w, http.StatusOK, struct{ Test string }{"Hello " + status + id})
        }
    }
    
  • 测试
    • linux系统上调用curl -v http://www.sysu.edu.cn/访问网址,根据输出内容可以看出
      • *为首的信息为curl程序的操作内容
      • >为首的信息为发送到指定网址的内容
      • <为首的信息为指定网址返回的内容 在这里插入图片描述
    • 以上述代码运行后输入http://localhost:9090/hello时,对应路由信息为/{status},即status对应hello,id为空,输出内容如下:在这里插入图片描述
    • 输入http://localhost:9090/hello/world时,status对应hello,id为对应world,输出内容如下:在这里插入图片描述
    • 修改代码,去掉对路由/{status}的处理后再次输入http://localhost:9090/hello,输出内容如下,可以发现报错404,此时可以认为设置路由时需要处理不同层次的内容,上级路由与下级路由之间不能互通。在这里插入图片描述
    • 此时,通过Apache软件对服务进行压力测试,输入指令ab -n 1000 -c 100 http://localhost:9090/hello/world,输出如下结果,其中左侧为链接网络消耗的时间等信息,右侧为测试后的结果,通过对信息的分析可以了解到连接的速度以及网址访问的相关信息。在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发 web 服务程序 的相关文章

  • go struct{} 空结构体的特点和作用

    空结构体的特点和作用 参考代码 package main import fmt unsafe func main empStruct 空结构体的实例和作用 func empStruct 空结构体的特点 1 不占用内存 2 地址不变 var
  • golang之跨语言ipc通信

    1 golang之跨语言ipc通信 文章目录 1 golang之跨语言ipc通信 1 1 unix domain Socket unix域套接字 介绍 1 2 IPC SOCKET通信 1 2 1 函数及地址定义介绍 1 2 2 UNIX
  • Go Web编程实战(6)----反射

    目录 反射 反射的3大原则 接口类型变量 转换为 反射类型对象 反射类型对象 转换为 接口类型变量 反射类型对象 修改 值必 可写的 反射 与其他语言一样 Go语言的反射同样是指 计算机程序在运行时 可以访问 检测和修改它本身状态或行为的一
  • 权重实现随机抽奖

    一般抽奖是怎么实现的 在实习期间学会了一种通用的写法 在这里记录一下 最近在学Golang语法基础 这里就用Golang来写 package main import fmt time math rand func main r rand N
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • golang:环境变量GOPROXY和GO111MODULE设置

    我们安装完golang后 我们在windows的cmd命令下就可以直接查看和使用go命令和环境变量了 同样的在linux下可以在控制台使用 如下图所示 C Users lijie1 gt go env set GO111MODULE set
  • beego+goAdmin+mysql+docker+natapp作为微信小程序地服务器“伪部署”

    写在前面的话 1 为什么我要叫伪部署 答 因为我把它们放在服务器运行 都是开发模式 生产模式实在不会弄 所以就这样了 2 系统环境 答 腾讯云服务器 系统为 ubuntu 版本不记得 应该是比较高的 3 前提假设 答 假设你的服务器已经安装
  • 【golang】error parsing regexp: invalid or unsupported Perl syntax (正则表达式校验密码)

    要在 Go 中编写密码校验规则 确保密码不少于8位且包含数字和字母 你可以使用正则表达式和 Go 的 regexp 包来实现 以下是一个示例代码 错误示范 package main import fmt regexp func valida
  • Go中 Redis Client的使用

    文章目录 常见操作 List 操作 Pipeline 使用 在 Go 语言中使用 Redis 时 可以使用第三方库实现 Redis Client 的封装 本文介绍如何使用 Go 语言的 redisClient 去连接 Redis 服务器 并
  • goland环境配置

    goland modules环境配置 下载和安装goland 环境配置 配置环境变量GOPATH 配置go modules GOPROXY代理的系统变量 工程目录中新建三个工作目录 goland中启用go modules 新建一个go程序
  • Golang 内存对齐视频

    https www bilibili com video BV1Ja4y1i7AF 简而言之 就是注意写代码的时候要把相同类型的元素放在一起 更进一步需要自己将结构体配对为32位或64位的整数倍 有助于减少额外空间消耗
  • Golang三剑客之Pflag、Viper、Cobra

    如何构建应用框架 想知道如何构建应用框架 首先你要明白 一个应用框架包含哪些部分 在我看来 一个应用框架需要包含以下 3 个部分 命令行参数解析 主要用来解析命令行参数 这些命令行参数可以影响命令的运行效果 配置文件解析 一个大型应用 通常
  • 【go语言开发】编写单元测试

    本文主要介绍使用go语言编写单元测试用例 首先介绍如何编写单元测试 然后介绍基本命令的使用 最后给出demo示例 文章目录 前言 命令 示例 前言 在go语言中编写单元测试时 使用说明 测试文件命名 在 Go 语言中 测试文件的命名应与被测
  • go-zero开发入门之网关往rpc服务传递数据2

    go zero 的网关服务实际是个 go zero 的 API 服务 也就是一个 http 服务 或者说 rest 服务 http 转 grpc 使用了开源的 grpcurl 库 当网关需要往 rpc 服务传递额外的数据 比如鉴权数据的时候
  • go-zero目录结构和说明

    code of conduct md 行为准则 CONTRIBUTING md 贡献指南 core 框架的核心组件 bloom 布隆过滤器 用于检测一个元素是否在一个集合中 breaker 熔断器 用于防止过多的请求导致系统崩溃 cmdli
  • go-zero开发入门之网关往rpc服务传递数据1

    go zero 的网关往 rpc 服务传递数据时 可以使用 headers 但需要注意前缀规则 否则会发现数据传递不过去 或者对方取不到数据 go zero 的网关对服务的调用使用了第三方库 grpcurl 入口函数为 InvokeRPC
  • go-zero开发入门-API服务开发示例

    接口定义 定义 API 接口文件 接口文件 add api 的内容如下 syntax v1 info title API 接口文件示例 desc 演示如何编写 API 接口文件 author 一见 date 2023年12月07日 vers
  • go-carbon v2.3.4 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

    carbon 是一个轻量级 语义化 对开发者友好的 golang 时间处理库 支持链式调用 目前已被 awesome go 收录 如果您觉得不错 请给个 star 吧 github com golang module carbon gite
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github
  • 【go语言】读取toml文件

    一 简介 TOML 全称为Tom s Obvious Minimal Language 是一种易读的配置文件格式 旨在成为一个极简的数据序列化语言 TOML的设计原则之一是保持简洁性 易读性 同时提供足够的灵活性以满足各种应用场景 TOML

随机推荐

  • Hive三种不同的数据导出的方式

    Hive三种不同的数据导出的方式 1 导出到本地文件系统 insert overwrite local directory home anjianbing soft export data app order city d row form
  • 2021-09-22

    linux防火墙查看状态 操作防火墙的命令 查看防火墙状态 systemctl status firewalld 让防火墙可用 systemctl enable firewalld 让防火墙不可用 systemctl disable fir
  • 信号——产生、处理、捕捉、接收、阻塞

    一个信号是一条小消息 它通知系统进程中发生了一个某种类型的事件 提供了一种处理异步事件的方法 每一种信号都有一个名字 在头文件
  • 用Matlab作函数的图像

    函数简介 1 作图函数是plot 其调用格式如下 plot y plot x y plot x y LineSpec plot x1 y1 s1 x2 y2 s2 x3 y3 s3 说明 1 plot y 绘出以向量y为纵坐标 y的个元素的
  • IPV6基本报头

    version 版本号 值为6 与ipv4作用相同 4bit Traffic class 流分类 相当于ipv4的TOS字段 用于qos 表示报文的类或者优先级 8bit Flow label 流标签 用于区分实时流量 标签 源地址可以确定
  • 使用vue-amap实现地图经纬度显示、具体地址显示、卫星图、路网路况、在鼠标按下的地方添加标注点和添加多个标注点

    文章目录 写在开头 一 本文目的 二 版本信息 三 在App vue中调用其他 vue文件 四 点击地图显示经纬度和具体地址 五 添加卫星图和路网路况 六 在鼠标按下的地方添加标注点 七 在地图上显示多个标注点 写在最后 写在开头 我的上篇
  • LeetCode每日一题之209长度最小的子数组

    文章目录 问题描述 方法一 暴力求解 方法二 滑动窗口 问题描述 方法一 暴力求解 暴力求解法 时间复杂度O n 2 空间复杂度O 1 暴力求解法的思想 每一次遍历数组 然后更新result的值 一个for循环作为起始位置 一个for循环作
  • 使用JavaScript实现MQTT客户端的创建

    随着物联网的快速发展 实现设备之间的可靠和高效通信变得至关重要 MQTT作为一种轻量级的 开放的消息传输协议 被广泛应用于物联网领域 本文将为您介绍如何使用MQTT实现物联网设备之间的通信 MQTT基本概念 MQTT是一种基于发布 订阅模型
  • Qt modbus slave 从站 封装好的类直接使用

    实现基本的功能 QT serialport serialbus modbusSlove h ifndef MODBUSSLOVE H define MODBUSSLOVE H include
  • 【UE4源代码观察】观察DDC(DerivedDataCache)

    UE4源代码观察 观察DDC DerivedDataCache YakSue的博客 CSDN博客 概念 DDC 全名DerivedDataCache 派生数据缓存 很早就知道UE4里存在DDC这个概念 也发现了DDC占用了很多磁盘空间 也遇
  • WebSocket -- 扫盲篇

    一 WebSocket是HTML5出的东西 协议 也就是说HTTP协议没有变化 或者说没关系 但HTTP是不支持持久连接的 长连接 循环连接的不算 首先HTTP有1 1和1 0之说 也就是所谓的keep alive 把多个HTTP请求合并为
  • 剑指 Offer 31. 栈的压入、弹出序列—思路和心得

    思路来自于 LeetCode力扣刷题 剑指Offer 31 栈的压入 弹出序列 哔哩哔哩 https b23 tv mvsIvAi import java util Stack class Solution 思路 模拟一个栈进行相应的弹出操
  • java实现冒泡排序

    冒泡排序 算法重复走访要排序的数列 一次比较两个元素 如果它们顺序错误就交换它们的位置 这样最大的数就到了最后 重复操作即可得到有序数列 冒泡排序算法运行 1 比较相邻的元素 如果第一个比第二个大 就交换他们两个 2 对每一对相邻元素作同样
  • STM32之flash的读写

    文章目录 一 创建STM32CUBEMX工程 二 KEIL下的配置 三 参考 一 创建STM32CUBEMX工程 芯片选择F103C8 配置定时器 打开外部时钟 配置时钟 配置PC13为output对应板子上的LED 设置堆栈大小为4K 导
  • Css Pc端默认样式(适用于大部分项目开发)

    5b8b 4f53 yh Microsoft Yahei body textarea input select option font size 14px color 333 font family Hiragino Sans GB Mic
  • C++期末作业翻牌消消乐小游

    C 期末作业翻牌消消乐小游戏 适合初学者学习使用 附答辩PPT和项目报告 详细情况请看下图 点我下载资源 点我下载资源
  • 前端追梦人CSS教程

    一 基础概念 1 1 什么是CSS 层叠样式表 英文全称 Cascading Style Sheets 是一种用来表现HTML 标准通用标记语言的一个应用 或XML 标准通用标记语言的一个子集 等文件样式的计算机语言 1 2 语法 选择器
  • 腾讯T3亲自教你,338页网易面经

    前言 19年6月份从网易云音乐离开 放弃了留学机会 开始了人生的第一次创业 前后尝试了两个项目 因为个人能力与时机因素都失败了 虽然没能享受到创业所能够带来高杠杆物质上的回报 但是对个人软技能和自我边界认知上都有了很大的提升 投递公司与拿到
  • ROS环境下大疆tello无人机源码安装&驱动代码解读

    大疆tello无人机是一款微小型无人机 可以支持多种开发模式 这里用的是ROS1的kinetic版本进行开发 参考文档来自http wiki ros org tello driver 1 kinetic下tello源码安装 打开终端 键入以
  • 开发 web 服务程序

    github 任务目标 熟悉 go 服务器工作原理 基于现有 web 库 编写一个简单 web 应用类似 cloudgo 使用 curl 工具访问 web 程序 对 web 执行压力测试 根据代码提示 按照cloud go应用 编写相应的W