在 Go 语言中,一般可以使用以下四种方式发布 Service:
- HTTP Server
HTTP Server 是最常用的发布 Service 的方式之一。Go 语言标准库中提供了 net/http 包,通过该包可以方便地创建 HTTP Server。下面是一个简单的例子:
package main
import (
"fmt"
"log"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
http.HandleFunc("/", hello)
log.Fatal(http.ListenAndServe(":8080", nil))
}
以上代码创建了一个简单的 HTTP Server,监听本地端口 8080,并且实现了一个 / 路由,当客户端请求该路由时会返回 Hello, World! 字符串。
- gRPC Server
gRPC 是 Google 开源的高性能、跨平台、开源的远程过程调用(RPC)框架。gRPC 支持多种语言,其中也包括 Go 语言。
在 Go 语言中,可以使用 google.golang.org/grpc 包来创建和管理 gRPC Server。下面是一个简单的例子:
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
)
type GreeterServer struct{}
func (s *GreeterServer) SayHello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
return &HelloReply{Message: "Hello, " + req.Name + "!"}, nil
}
func main() {
lis, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
RegisterGreeterServer(s, &GreeterServer{})
log.Println("starting gRPC server...")
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
以上代码创建了一个简单的 gRPC Server,监听本地端口 8080,并且实现了一个 SayHello 方法,当客户端调用该方法时会返回一个欢迎字符串。
- TCP Server
在一些特殊场景下,可能需要使用 TCP 协议来发布 Service。在 Go 语言中,可以使用 net 包来创建和管理 TCP Server。下面是一个简单的例子:
package main
import (
"bufio"
"log"
"net"
)
func handle(conn net.Conn) {
defer conn.Close()
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
ln := scanner.Text()
log.Println(ln)
fmt.Fprintf(conn, "you said: %s\n", ln)
}
}
func main() {
l, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
log.Printf("failed to accept connection: %v", err)
continue
}
go handle(conn)
}
}
以上代码创建了一个简单的 TCP Server,监听本地端口 8080,并且实现了一个 handle 方法,当客户端发送一条消息时会返回一个欢迎字符串。
- Unix Domain Socket Server
除了 TCP 和 HTTP 协议外,Go 语言还支持使用 Unix Domain Socket 来发布 Service。在 Go 语言中,可以使用 net 包来创建和管理 Unix Domain Socket Server。下面是一个简单的例子:
package main
import (
"fmt"
"log"
"net"
)
func handle(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
log.Fatalf("failed to read from socket: %v", err)
return
}
fmt.Println(string(buf[:n]))
}
func main() {
l, err := net.Listen("unix", "/tmp/mysocket.sock")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
log.Printf("failed to accept connection: %v", err)
continue
}
go handle(conn)
}
}
以上代码创建了一个简单的 Unix Domain Socket Server,并且实现了一个 handle 方法,当客户端发送一条消息时会将该消息打印到控制台上。
以上四种方式都可以用于发布 Service。需要根据具体需求选择合适的方式。




