文档章节

Go实现FastCgi Proxy Client 系列(三)优化篇

o0无忧亦无怖
 o0无忧亦无怖
发布于 2018/05/15 19:29
字数 710
阅读 231
收藏 4

墨迹一点

个人琐碎

最近比较忙,以致于很久都没有写blog了,但是,golang的水平自认为是总算入门了。

协程的个人理解

网上的说法一般都是协程是轻量级线程。

我个人认为协程的好处

  1. 无需在用户态和内核态切换(完全在用户态)
  2. 无需线程上下文切换的开销(因为之上的好处)
  3. 编码简单(原子操作,锁都没有了)

httpHandler优化

利用协程优化请求

这是我们原本的handler(就是监听http请求的一个对象,实现了ServeHTTP)

type HttpHandler struct
{   
    Vhosts     Vhosts
    HandlerMap map[string]*http.ServeMux
}

很明显,这里就已经是入口了,我们将其修改成

type HttpHandler struct
{   
    Vhosts            Vhosts
    HandlerMap        map[string]*http.ServeMux
    Response          chan *Response
    StaticFile        chan *StaticFileHandler
    serverEnvironment map[string]string
}

当我们遇到请求的实行,我们直接开启协程

go Run(w,r)

在Run方法中,将实现部分写入协程(即IO、计算部分),在大部分代码不变的情况下(请看1和2的分析)我们将几种错误的情况抛出一个Response对象,比如请求的是/favicon.ico

if r.RequestURI == "/favicon.ico" {
		httpHandler.Response <- &Response{200, map[string]string{}, nil, ""}
		return
}

具体的伪代码应如下:

if something wrong { 
    gerWrongCode 
    res := generate WrongResponse
    httpHandler.Response <- res
    return 
}


res := do proxy
httpHandler.Response <- res

另外,关于静态文件,我们并不需要proxy,所以我们要告知上面,这个是静态文件,go直接处理

        fileCode,filename := httpHandler.buildServerHttp(r, env, hm)

		switch fileCode {
		case FileCodeStatic:
			httpHandler.StaticFile <- &StaticFileHandler{
				name,
				port,
				filename,
			}
			return
            case ......
        }

处理协程回调

那么确定我们已经将各种IO和逻辑处理写入了协程了,这个时候,我们回到ServeHTTP方法

    go Run(w,r)
    for {
		select {    //进行协程的处理
		case response := <-httpHandler.Response:  //当遇到response的时候 送出结果
			response.send(w, r)
		case hand := <-httpHandler.StaticFile:    //当遇到是静态文件的时候 直接走本身go原本的handler
			staticHandler := httpHandler.HandlerMap[hand.Host+hand.Port]
			staticHandler.ServeHTTP(w, r)

		default:
			respond(w, "<h1>404</h1>", 404, map[string]string{})
		}
	}

添加日志

像nginx之类的,都可以写日志,那这个功能我也不能少

只需要在HttpHandler对象注入的时候加入一个log即可

type HttpHandler struct
{   
	Vhosts            Vhosts
	HandlerMap        map[string]*http.ServeMux
	Response          chan *Response
	StaticFile        chan *StaticFileHandler
	serverEnvironment map[string]string
	log               *log.Logger
}

func (httpHandler *HttpHandler) SetLogger(log *log.Logger) {
	httpHandler.log = log
}

func (httpHandler *HttpHandler)  GetLogger() *log.Logger {
	return httpHandler.log
}

然后,代码中可以放心大胆的使用 log.*方法

至于log写文件 ,百度谷歌谢谢,他本身就带了异步IO,就不用操心了。

其他

本文源码

Go实现FastCgi Proxy Client 系列(一)

Go实现FastCgi Proxy Client 系列(二)

一个FCM的消息代理服务器

一个秒级定时任务(非crontab)

© 著作权归作者所有

共有 人打赏支持
o0无忧亦无怖
粉丝 41
博文 88
码字总数 70523
作品 1
海淀
程序员
私信 提问
Nginx Upstream timed out 的解决办法

以下内容来自:http://www.ttlsa.com/nginx/nginx-upstream-timed-out-110-connection-timed-out/ 可能发生在如下两种情况上: 1. nginx proxy 此时需要适当的调整 proxyreadtimeout 值。 lo...

傅易
2015/06/04
0
0
nginx 代理多个tomcat缓存

user ftp; worker_processes 2; workerrlimitnofile 1024; events { use epoll; worker_connections 1024; } http { include mime.types; default_type application/octet-stream; include p......

一念三千
2015/08/27
0
0
nginx出错:upstream sent too big header

vps里查看nginx日志出现upstream sent too big header while reading response header from upstream错误。 1、反向代理端,可以放到server中: clientheaderbuffer_size 128k; largeclienth......

mickelfeng
2013/09/11
0
0
Nginx 新的开发分支 0.8.1 发布

自从 Nginx 0.7.59 版本发布后, Nginx 将 0.7.x 版本标识为稳定版,并开始下一个开发版本 0.8.x ,该版本为 0.8 系列的第一个发行版本。主要改进内容包括: Changes with nginx 0.8.1 08 Ju...

红薯
2009/06/08
439
1
Linux学习之路-Nginx(4)模块简要介绍篇【27】---20180228

一、ngxhttpproxy_module模块 ngxhttpproxy_module 转发请求至另一台主机 1、proxy_pass URL; Context:location, if in location, limitexcept 注意:proxypass后面路径不带uri时,会将locat......

DannyExia00
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云vpc、快照、镜像、重置密码_重启_关机、磁盘扩容

VPC 专有网络VPC(Virtual Private Cloud)是用户基于阿里云创建的自定义私有网络, 不同的专有网络之间二层逻辑隔离,用户可以在自己创建的专有网络内创建和管理云产品实例,比如ECS、负载均...

李超小牛子
27分钟前
2
0
阿里高级技术专家:研发效能的追求永无止境

背景 大约在5年前,也就是2013年我刚加入阿里的时候,那个时候 DevOps 的风刚吹起来没多久,有家公司宣称能够一天发布几十上百次,这意味着相比传统软件公司几周一次的发布来说,他们响应商业...

阿里云官方博客
55分钟前
1
0
Android 的 ViewModel 机制源码解析

Android ViewModel 的好处是会随 Activity 销毁调用它的 clear() 方法。 我们分析一下它是怎么做到的。 1. 例子使用: a、 创建类 TestMvvmViewModel 继承 ViewModel,重写 onCleared() ,把...

亭子happy
今天
2
0
WEB 开发总结

事务处理 事务的4个基本特征 1.Atomic(原子性),事务中包含的操作被看做是一个整体的业务单元,这个业务单元中的操作要么全部成功,要么全部失败,不会出现部分成功,部分失败的场景。 2....

北漂的我
今天
5
0
thinkphp5 利用七牛云 将amr格式语音文件转为mp3

$card_id 是我的本地的文件 将问价名字的后缀名去掉注意access_token的有效期public function ceshi1($card_id){ $mediaid = substr($card_id, 0, -4); $accessKey = ...

小小小壮
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部