Golang Tips: HTTP Server 监听 Unix 套接字

栏目: Go · 发布时间: 8年前

内容简介:Golang Tips: HTTP Server 监听 Unix 套接字

Unix 套接字用于并且只能用于同一台宿主机上的进程间通信, Unix 套接字相比网络套接字来讲, 不需要做网络协议栈上的一些工作, 在它眼里没有 packet 的概念, 它只是单纯的做内存拷贝, 所以它的性能要比普通的网络套接字好, 至于好多少, 后面找机会出个压测报告.

而且, 在服务器端开发的过程中, 也会发现好多程序它们既可以监听 Unix 套接字, 又可以监听网络套接字, 比如 php-fpm, 那么使用 Golang 的 HTTP Client 如何连接其它程序监听的 Unix 套接字呢? 使用 Golang 又如何写一个监听 Unix 套接字的 HTTP Server 呢?

直接看样例代码:

package main

import (
	"fmt"
	"net"
	"net/http"
	"os"
)

func main() {
	var cmd string
	if len(os.Args) > 1 {
		cmd = os.Args[1]
	}
	switch cmd {
	case "server":
		RunServer()
	default:
		RunClient()
	}
}

var (
	// 声明 Unix 套接字的地址
	addr = &net.UnixAddr{Name: "target.sock", Net: "unix"}
)

func RunClient() {
	unixDial := func(_, _ string) (conn net.Conn, err error) {
		conn, err = net.DialUnix("unix", nil, addr)
		return
	}
	client := &http.Client{Transport: &http.Transport{
		Dial: unixDial,
	}}
	resp, err := client.Get("http://hostname/path")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(resp.StatusCode)
	}
}

func RunServer() {
	os.Remove(addr.Name)
	lis, err := net.ListenUnix("unix", addr)
	if err != nil {
		fmt.Println("ListenUnix", err)
		return
	}
	http.HandleFunc("/", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
		w.WriteHeader(222) // 这里返回一个特殊的 code, 好做验证
	}))
	svr := &http.Server{Handler: http.DefaultServeMux}
	err = svr.Serve(lis)
	if err != nil {
		fmt.Println("Serve err:", err)
	}
}

上面的程序包含两部分, client 和 server 部分, 首先使用如下命令将 server 跑起来:

$ go run main.go server

server 跑起来之后在开一个终端可以查看当前目录, 会发现多了一个 target.sock 的文件:

$ ls
main.go target.sock

接下来用我们写的 HTTP Client 来请求上面正在运行的监听了 Unix 套接字的 HTTP Server, 在开一个终端, 运行 Client:

$ go run main.go
222
$

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Designing Data-Intensive Applications

Designing Data-Intensive Applications

Martin Kleppmann / O'Reilly Media / 2017-4-2 / USD 44.99

Data is at the center of many challenges in system design today. Difficult issues need to be figured out, such as scalability, consistency, reliability, efficiency, and maintainability. In addition, w......一起来看看 《Designing Data-Intensive Applications》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具