跟着刘旭老师学go web做的笔记

【Go Web 编程快速入门【Golang/Go语言】(完结)】 https://www.bilibili.com/video/BV1Xv411k7Xn/?p=27&share_source=copy_web&vd_source=03c1dc52eeb3747825ecad0412c18ab1

https

【HTTP/1.1,HTTP/2和HTTP/3的区别】 https://www.bilibili.com/video/BV1vv4y1U77y/?share_source=copy_web&vd_source=03c1dc52eeb3747825ecad0412c18ab1

http 明文传输 中间人也能看见

https TLS传输层安全 加密数据,只有客户端和服务器知道它们在说啥

http Listener

http.ListenAndServe 函数
http.ListenAndServeTLS 函数

在Terminal里输入

go run E:\GO\src\crypto\tls\generate_cert.go -h
go run E:\GO\src\crypto\tls\generate_cert.go -host localhost //就是你自己的储存目录下面的\src\crypto\tls\generate_cert.go
//设置加密证书
//出现 cert.pem 和key.pem文件
http.HandleFunc("/",func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello"))
})
http.ListenAndServeTLS(":8080","cert.pem","key.pem",nil)
//现在是https://localhost:8080/了

HTTP/2

客户端与服务器沟通

HTTP/1.1 请求和响应

HTTP/2 Stream (每个数据类型都可以单独优化)

  • 请求多路复用
  • Header 压缩
  • 默认安全
    • HTTP ,但很多决定不支持 HTTP
    • HTTPS
  • Server Push

Server Push

http.HandleFunc("/home",func(w http.ResponseWriter, r *http.Request) {
if pusher,ok := w.(http.Pusher);ok{
//Push的第一个目标是我们要推送的文件,第二个是一些选项
pusher.Push("/css/app.css",&http.PushOptions{
Header: http.Header{"Content-Type": []string{"text/css"}},
})
}
t,_ := template.ParseFiles("home.html")
t.ExecuteTemplate(w,"home.html",nil)
})
http.ListenAndServeTLS(":8080","cert.pem","key.pem",nil)

测试

import "testing"

测试 Model 层

  • user_test.go

    测试代码所在文件的名称以 _test 结尾

    对于生产编译,不会包含以 _test 结尾的文件

    对于测试编译,会包含以 _test 结尾的文件

  • func TestUpdatesModifiedTime(t *testing.T) { … }

    测试函数名应以 Test 开头(需要导出)

    函数名需要表达出被验证的特性

    测试函数的参数类型是 *testing.T,它会提供测试相关的一些工具

目前文件结构是goWeb-blog包,底下有mian.go,有moddel文件夹,

model文件夹下有两个文件,company.go和测试文件company_test.go

model/company.go

//company.go
package model
import "strings"
type Company struct {
ID int
Name string
Country string
} func (c *Company) GetCompanyType() (result string) {
if strings.HasSuffix(c.Name, ".LTD"){
result = "Limited Liability Company"
}else{
result = "Others"
}
return
}

model/company_test.go

//company_test.go
package model
import (
"fmt"
"testing"
)
func TestGetCompanyType(t *testing.T) {
var c = &Company{
ID: 123,
Name: "ABC.LTD",
Country: "China",
}
var x = c.GetCompanyType()
if x != "Limited Liability Company"{
fmt.Println("the type is other")
}else{
fmt.Println("get Limited Liability Company")
}
}

执行命令行

go test goWeb-blog/model 

//注意,假如你这个测试文件和main.go同级,就可以直接
// go test
//否则就得加路径

得到结果

ok      goWeb-blog/model        0.501s

测试 Controller 层

  • 为了尽量保证单元测试的隔离性,测试不要使用例如数据库、外部API、文件系统等外部资源。
  • 模拟请求和响应
  • 需要使用 "net/http/httptest" 提供的功能

NewRequest 函数 r

  • func NewRequest(method, url string, body io.Reader) (*Request, error)
    • method:HTTP Method
    • url:请求的 URL
    • body:请求的 Body
    • 返回的 *Request 可以传递给 handler 函数

ResponseRecorder 响应记录器 w

type ResponseRecorder {
Code int // 状态码 200、500…
HeaderMap http.Header // 响应的 header
Body *bytes.Buffer // 响应的 body
Flushed bool // 缓存是否被 flush 了
}

用来捕获从 handler 返回的响应,只是做记录

可以用于测试断言

注:上个测试的model这次还会用到

普通文件controller/company.go

//    controller/company.go
package controller
import (
"encoding/json"
"net/http"
"timer/goWeb-sql/model"
) func RegisterRoutes() {
http.HandleFunc("/company", handlerCompany)
} func handlerCompany(w http.ResponseWriter, r *http.Request){
c:= model.Company{
ID: 123,
Name: "google",
Country: "USA",
}
//进行json编码并写到响应里面
enc := json.NewEncoder(w)
enc.Encode(c)
}

测试文件 controller/company_test.go

//   controller/company_test.go
package controller import (
"encoding/json"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
"timer/goWeb-sql/model"
)
func TestHandlerCompanyCorrect(t *testing.T) {
r:=httptest.NewRequest(http.MethodGet,"/companier",nil)
w:=httptest.NewRecorder()
handlerCompany(w,r) result,_:= ioutil.ReadAll(w.Result().Body)
c:= model.Company{}
json.Unmarshal(result, &c)
if c.ID != 123{
t.Errorf("failed to handle company correctly")
}
}

命令行

这个路径啊,就看在这个包的引用路径,比如我测试文件引用本包的model,

"timer/goWeb-sql/model",那就把model抠了,换成controller就行

(当时起名字好像就是叫的time/goWeb-sql,稍微有点歧义)

go test timer/goWeb-sql/controller

结果

//假如成功
ok timer/goWeb-sql/controller 0.687s
//假如失败
--- FAIL: TestHandlerCompanyCorrect (0.00s)
company_test.go:20: failed to handle company correctly
FAIL
FAIL timer/goWeb-sql/controller 0.723s
FAIL

Profiling性能分析

能分析什么

  • 内存消耗
  • CPU 使用
  • 阻塞的 goroutine
  • 执行追踪
  • 还有一个 Web 界面:应用的实时数据

等等,可以监听的种类在增多

如何进行分析

import _ "net/http/pprof"
设置一些监听的 URL,它们会提供各类诊断信息
go tool pprof http://localhost:8000/debug/pprof/heap // 内存
从应用获取内存 dump:应用在使用哪些内存,它们会去哪
go tool pprof http://localhost:8000/debug/pprof/profile // CPU
CPU 的快照,可以看到谁在用 CPU
go tool pprof http://localhost:8000/debug/pprof/block // goroutine
看到阻塞的 goroutine
go tool pprof http://localhost:8000/debug/pprof/trace?seconds=5 // trace
监控这段时间内,什么在执行,什么在调用什么… http://localhost:8000/debug/pprof // 网页
一个快照,刷新页面时的诊断数据

main函数

package main
import (
"fmt"
"timer/goWeb-sql/controller"
"net/http"
_ "net/http/pprof"
)
func main(){
server:= http.Server{
Addr: "localhost:8080",
}
controller.RegisterRoutes()
fmt.Println("Server starting now...")
//goroutine 没有中间件,这样性能分析工具就不会受到中间件影响
go http.ListenAndServe("localhost:8000",nil)
//自己的频道,可以添加中间件
server.ListenAndServe()
}

命令行

go run .

网页:

  • 打开 http://localhost:8080/company
  • 再打开 http://localhost:8000/debug/pprof/(东西挺多的可以看看)

打开一个新的命令行界面(原来那个不要关)

go tool pprof http://localhost:8000/debug/pprof/heap

然后可以进行交互

比如: help -> top -> png

若是png无法执行要求下载,那就下吧 graphviz.org/download/

下好了以后,继续png

就能生成内存分析的图片

实例

这个是我做的,臃肿的有bug的博客项目。。。。。。

session有点问题。。。。。。哦我实力好弱

需要参考可以看看

https://gitee.com/time-wuling/simpleBlog

go web学习(五)的更多相关文章

  1. java web 学习五(servlet开发1)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  2. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  3. Web学习之css

    CSS指层叠样式表(Cascading Style Sheets),CSS 是标准的布局语言,用来控制元素的尺寸.颜色.排版.CSS 由 W3C 发明,用来取代基于表格的布局.框架以及其他非标准的表现 ...

  4. web学习第一章

    web学习第一章   我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...

  5. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  7. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  8. Java web 学习之旅

    java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...

  9. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  10. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. day32:进程&进程join&守护进程deamon

    目录 1.进程的基本概念 2.进程初体验 3.join:先子后主 4.守护进程:deamon 5.使用自定义类的方式创建进程 6.两张和进程相关的图 进程的基本概念 什么是进程? 进程就是正在运行的程 ...

  2. PHP的WAMP的安装

    WAMP独立安装 软件官网下载: Apache:http://httpd.apache.org/download.cgi MySQL:http://dev.mysql.com/downloads/ P ...

  3. 零样本文本分类应用:基于UTC的医疗意图多分类,打通数据标注-模型训练-模型调优-预测部署全流程。

    零样本文本分类应用:基于UTC的医疗意图多分类,打通数据标注-模型训练-模型调优-预测部署全流程. 1.通用文本分类技术UTC介绍 本项目提供基于通用文本分类 UTC(Universal Text C ...

  4. Ubuntu-管理开机自启动服务

    1. 管理服务启停工具 systemctl -- 将应用程序抽象为一个service,然后对这个service进行创建.启停.状态查看.配合journalctl进行日志管理 子命令 效果 start ...

  5. 开心档之MySQL 序列使用

      MySQL 序列使用 MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将 ...

  6. python:冒泡排序(Bubble Sort)超详细教程!

    关于排序,真的非常的重要.数据可以从小到大排序,也可以从大到小排序.这样对于一个有序的数据,我们处理起来就很方便,这对于我们的工作帮助是很大的. 那么你拿到一组无序的数据,你将要如何去处理它呢? 冒泡 ...

  7. fzy&czn生日赛t1 CZN

    fzy&czn生日赛t1 CZN 膜拜hybb首杀 目录 fzy&czn生日赛t1 CZN 题目背景 题目描述 分析 my code wnag's code 题目 题目背景 有一天,c ...

  8. [OpenCV-Python] 10 图像上的算术运算

    文章目录 OpenCV-Python: 核心操作 10 图像上的算术运算 10.1 图像加法 10.2 图像混合 10.3 按位运算 OpenCV-Python: 核心操作 10 图像上的算术运算 目 ...

  9. MySQL高频面试题

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...

  10. 京喜APP - 图片库优化

    作者:京东零售 何骁 介绍 京喜APP早期开发主要是快速原生化迭代替代原有H5,提高用户体验,在这期间也积累了不少性能问题.之后我们开始进行一些性能优化相关的工作,本文主要是介绍京喜图片库相关优化策略 ...