当前位置: 首页 > news >正文

go构建web服务

构建最简单的HTTP服务

创建HTTP服务仅需几行代码,利用标准库net/http包实现核心功能。建立一个监听8080端口的服务,对所有请求返回"hello, world"响应。

mkdir simple-http-server cd simple-http-server go mod init simple-http-server

main.go中写入以下代码:

packagemainimport"net/http"funcmain(){http.HandleFunc("/",func(w http.ResponseWriter,r*http.Request){w.Write([]byte("hello, world"))})http.ListenAndServe(":8080",nil)}

http.HandleFunc注册路由处理函数,http.ListenAndServe启动服务监听。通过curl测试服务:

curl localhost:8080/

图书管理API服务架构

项目采用模块化设计,分为HTTP服务器和图书存储两大模块。API遵循RESTful风格,支持图书CRUD操作,数据交互使用JSON格式。

创建项目基础结构:

mkdir bookstore cd bookstore go mod init bookstore

项目目录布局:

├── cmd/ │ └── bookstore/ │ └── main.go ├── internal/ │ └── store/ │ └── memstore.go ├── server/ │ ├── middleware/ │ │ └── middleware.go │ └── server.go └── store/ ├── factory/ │ └── factory.go └── store.go

核心模块实现

数据存储模块
通过工厂模式创建存储实例,支持多种存储后端。定义通用接口:

typeBookStoreinterface{Create(*Book)errorUpdate(*Book)errorGet(string)(*Book,error)GetAll()([]*Book,error)Delete(string)error}

内存存储实现示例:

typememStorestruct{sync.RWMutex booksmap[string]*Book}

HTTP服务器模块
封装路由注册和中间件处理:

funcNewBookStoreServer(addrstring,s store.BookStore)*BookStoreServer{srv:=&BookStoreServer{addr:addr,store:s,}router:=mux.NewRouter()router.Use(loggingMiddleware)router.HandleFunc("/book",srv.createBook).Methods("POST")router.HandleFunc("/book/{id}",srv.updateBook).Methods("PUT")returnsrv}

主程序流程
初始化存储和服务器实例,优雅处理服务启停:

funcmain(){s,err:=factory.New("mem")srv:=server.NewBookStoreServer(":8080",s)errChan:=make(chanerror)gofunc(){errChan<-srv.ListenAndServe()}()quit:=make(chanos.Signal,1)signal.Notify(quit,syscall.SIGINT,syscall.SIGTERM)select{caseerr:=<-errChan:log.Printf("Server error: %v",err)case<-quit:ctx,cancel:=context.WithTimeout(context.Background(),5*time.Second)defercancel()srv.Shutdown(ctx)}}

关键实现细节

  1. 使用gorilla/mux实现路由匹配
  2. 中间件处理日志记录和异常恢复
  3. 内存存储使用读写锁保证并发安全
  4. 响应编码统一采用JSON格式
  5. 实现优雅停机机制

示例API请求:

POST /book Content-Type: application/json {"id":"978-3-16-148410-0","name":"Go语言设计模式","authors":["张三"],"press":"人民邮电出版社"}

响应处理逻辑:

func(bs*BookStoreServer)createBook(w http.ResponseWriter,req*http.Request){varbook store.Bookiferr:=json.NewDecoder(req.Body).Decode(&book);err!=nil{http.Error(w,err.Error(),http.StatusBadRequest)return}iferr:=bs.store.Create(&book);err!=nil{http.Error(w,err.Error(),http.StatusInternalServerError)return}w.WriteHeader(http.StatusCreated)}
http://www.gsyq.cn/news/94831.html

相关文章:

  • 在 C++ 中轻松实现字符串与字符数组的相互转换
  • 【WRF理论第二十期】湍流与扩散(Turbulence / Diffusion)
  • 基于透镜天线阵列的毫米波大规模多输入多输出(MIMO)系统可靠波束空间信道估计研究附Matlab代码
  • Linux的权限
  • 如何用AlphaFold预测氨基酸突变对蛋白质结构的影响
  • Python类入门:用“汽车工厂”理解面向对象编程
  • 基于文化优化算法图像量化附Matlab代码
  • 高频软件测试基础面试题
  • 【大模型预训练】09-训练数据集生成技术:数据增强与合成数据的生成方法
  • 挖漏洞一个月赚2万多,别被骗了!
  • 基于自抗扰控制ADRC的永磁同步电机仿真模型附Simulink仿真
  • C++进阶技巧:如何在同一对象中存储左值或右值
  • 我在私有漏洞赏金计划常规测试中发现IP欺骗漏洞的过程
  • 基于无迹卡尔曼滤波(UKF)与模型预测控制(MPC)的多无人机避撞研究附Matlab代码
  • 列表基本概念
  • 【JavaWeb】Servlet继承结构
  • 【Java方法】--递归的正确使用方法,告别栈溢出
  • Linux网络编程-udp
  • 力扣hot100:搜索插入位置
  • 提升SEO效率:2025年真正有效的8款AI工具终极清单
  • 实战教程:1小时掌握逆向Unity游戏 (共13课时)
  • 【高可用系统监控的设计原则与实践】
  • 每天一个假设-day5:如何提高测试人员和开发人员的协作效率
  • 视觉色选机:如何挑选技术可靠与服务完善的设备厂家
  • 含SOP配电网重构 关键词:配网重构 yalmip 二阶锥 参考文档:《二阶锥松弛在配电网最优...
  • Labview模拟温度检测报警系统 1、通过设定上下限温度,通过比较温度来到达指示灯的闪烁情况
  • 岐金兰洞见:落地之障,在认知范式,不在技术路径
  • Flutter 测试驱动开发的基本流程
  • Qt关闭主窗体与quit()的深度解析
  • Qt主窗体关闭与quit()的退出机制差异