Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go语言分布式系统

用Go语言编写一个简单的分布式系统

作者:uccs

这篇文章主要介绍了用Go语言编写一个简单的分布式系统,文中的代码示例讲解的非常详细,对我们的学习或工作有一定的帮助,感兴趣的小伙伴跟着小编一起来看看吧

分布式

RegistryService

RegistryService 提供的服务:

mutex.Lock()
append(xxx, xxx)
mutex.UnLock()

RegistryService 对外只需要提供 RegisterService 方法,其他服务调用这个函数,就能够获取 RegistryService 提供的服务

最后在提供一个 ShutdownService 用于像 /services 接口发送 delete 请求,告知 RegistryService,我停止了一个服务

LogService

LogService 服务是对日志进行管理,将其他服务的日志进行收集、存储,提供 /log 接口,用于其他服务将日志发送给 LogService

GradingService 和 Portal

这两个是业务服务

api

os.OpenFile

用于指定模式打开文件,并返回文件的指针

func OpenFile(name string, flag int, perm FileMode) (*File, error)

flag 参数:

perm 参数:

- 0:无权限
- 1:执行权限
- 2:写权限
- 3:写和执行权限
- 4:读权限
- 5:读和执行权限
- 6:读和写权限
- 7:读、写和执行权限

ioutil.ReadAll

可以将整个文件内容读取到内存中,可以将请求体的内容读取到内存中

ps:将整个文件的内容或者请求体一次性读取到内存中,对于非常大的文件或者请求体,内存占用过高

fmt.Scanln

会阻塞程序的执行,直到用户在终端输入一行内容并按下回车键,然后它会将用户输入的值存储到传入的参数中

它主要用于读取并解析简单的基本类型数据

func main(){
  var name string
	var age int
	fmt.Print("Enter your name: ")
	fmt.Scanln(&name)
	fmt.Print("Enter your age: ")
	fmt.Scanln(&age)
	fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
}

http

http.Server

var srv htto.Server
go func(){
  srv.ListenAndServe()
}()
go func(){
  srv.Shutdown()
}()

ServeHTTP

当一个结构体实现了 ServeHTTP 方法后,那么这个结构体就实现了 http.Handler 接口

实现了 http.Handler 接口的结构体,就可以作为 http.Handle 方法的第二个参数

然后调用 http.ListenAndServe 方法就可以启动一个服务,会自动调用 ServeHTTP 方法来处理请求

func main() {
	http.Handle("/ping", &MyHandler{})
	http.ListenAndServe(":8080", nil)
}
type MyHandler struct{}
func (mh MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	switch r.Method {
	case http.MethodGet:
		w.WriteHeader(http.StatusOK)
		w.Write([]byte("pong"))
	default:
		w.WriteHeader(http.StatusMethodNotAllowed)
	}
}

将结构体序列化

type Registration struct {
	ServiceName string
	ServiceURL  string
}
r := Registration{
  ServiceName: "LogService",
  ServiceURL:  "http://localhost:3000/services",
}
buf := new(bytes.Buffer)
enc := json.NewEncoder(buf)
err := enc.Encode(r)
res, err := http.Post(ServicesURL, "application/json", buf)

使用 http 默认请求

req, _ := http.NewRequest(http.MethodDelete, "http://localhost:3000/services", bytes.NewBuffer([]byte("http://localhost:4000/log")))
req.Header.Add("Content-Type", "text/plain")
res, err := http.DefaultClient.Do(req)

log

log.New

log.New 用于创建一个新的日志记录器实例,用于将日志消息写入指定的输出地,并可选择性地添加前缀字符串

它接收 io.Writer 类型的参数,os.OpenFile 返回的文件指针类型 *os.File 实现了 io.Writer 接口,所以可以将文件指针传入 log.New 方法中

代码参考如下:

import (
	"fmt"
	stlog "log"
	"os"
)
func main() {
	file, err := os.OpenFile("./logs", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	log := stlog.New(file, "[go] -  ", stlog.LstdFlags)
	log.Println("hello world")
}

在重写 Write 方法时,需要定义一个类型别名,然后在类型别名上实现 Write 方法,那么这个类型别名就能够传入 log.New 方法中

代码参考如下:

import (
	stlog "log"
	"os"
)
type filelog string
func (fl filelog) Write(data []byte) (int, error) {
	file, err := os.OpenFile(string(fl), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
	if err != nil {
		return 0, err
	}
	defer file.Close()
	file.Write(data)
	return len(data), nil
}
func main() {
	log := stlog.New(filelog("./logs"), "[go] -  ", stlog.LstdFlags)
	log.Println("hello world")
}

以上就是用Go语言编写一个简单的分布式系统的详细内容,更多关于Go语言分布式系统的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文