铁匠 铁匠
首页
golang
java
架构
常用算法
  • Java
  • nginx
  • 系统运维
  • 系统安全
  • mysql
  • redis
参考文档
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

铁匠

不予评判的专注当下
首页
golang
java
架构
常用算法
  • Java
  • nginx
  • 系统运维
  • 系统安全
  • mysql
  • redis
参考文档
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • golang 入门学习指南
  • go-kit

    • go-kit学习指南 - 基础概念和架构
      • 介绍
      • 分层设计
      • 实现步骤
        • 参考代码
        • 启动服务
        • 测试
    • go-kit学习指南 - 多协议支持
    • go-kit学习指南 - 中间件
    • go-kit开发微服务 - 服务注册与发现
  • go
  • go-kit
fengjx
2024-04-18
目录

go-kit学习指南 - 基础概念和架构

# 介绍

go-kit 是一个微服务开发工具集,并不算一个完整的框架。根据工程实践总结的一套开发规范,解决分布式开发中的常见问题,它同样也适用于单体服务开发。

github 地址:

# 分层设计

go-kit 的分层设计思想是指将一个微服务应用程序划分为不同的层次,每个层次负责特定的功能,并且层与层之间的依赖关系被限制在特定的方向上。这种分层设计有助于提高代码的可维护性、可扩展性和可测试性,使得系统更容易理解、修改和维护。

  • 传输(Transport)层:负责处理网络通信协议,例如 HTTP、gRPC 等,并将请求和响应转换为端点可以处理的数据结构。
  • 端点(Endpoints)层: 整个服务的入口,负责将网络请求转换为业务逻辑调用,并将结果转换为网络响应。
  • 服务(Service)层:务层包含了实际的业务逻辑实现,负责处理请求并产生相应的结果。

# 实现步骤

以下是实现一个简单的 say-hello 的示例。

示例代码: https://github.com/fengjx/go-kit-demo/tree/master/greetsvc (opens new window)

# 参考代码

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"net/http"

	"github.com/go-kit/kit/endpoint"
	httptransport "github.com/go-kit/kit/transport/http"
)

func main() {

	svc := greetService{}

	satHelloHandler := httptransport.NewServer(
		makeHelloEndpoint(svc),
		decodeRequest,
		encodeResponse,
	)

	http.Handle("/say-hello", satHelloHandler)
	log.Println("http server start")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

type helloReq struct {
	Name string `json:"name"`
}

type helloResp struct {
	Msg string `json:"msg"`
}

type greetService struct {
}

func (svc greetService) SayHi(_ context.Context, name string) string {
	return fmt.Sprintf("hi: %s", name)
}

func makeHelloEndpoint(svc greetService) endpoint.Endpoint {
	return func(ctx context.Context, request interface{}) (interface{}, error) {
		req := request.(*helloReq)
		msg := svc.SayHi(ctx, req.Name)
		return helloResp{
			Msg: msg,
		}, nil
	}
}

func decodeRequest(_ context.Context, r *http.Request) (interface{}, error) {
	name := r.URL.Query().Get("name")
	req := &helloReq{
		Name: name,
	}
	return req, nil
}

func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
	data := map[string]any{
		"status": 0,
		"msg":    "ok",
		"data":   response,
	}
	return json.NewEncoder(w).Encode(data)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

go-kit 的 helloworld 示例代码远比其他 web 框架复杂,主要是它有一套严格的分层规范和多协议支持。根据过往大型项目的实践来看,必要的代码分层对于多人协作开发的项目至关重要,可以保持代码的可维护和可扩展性,这对于长期维护的项目收益巨大。

# 启动服务

go run main.go
1

# 测试

# sya-hello
curl http://localhost:8080/say-hello?name=fengjx
1
2
#go-kit
Last Updated: 2024/05/12, 15:25:49
golang 入门学习指南
go-kit学习指南 - 多协议支持

← golang 入门学习指南 go-kit学习指南 - 多协议支持→

最近更新
01
go-kit学习指南 - 多协议支持
04-19
02
go-kit学习指南 - 中间件
04-19
03
go-kit开发微服务 - 服务注册与发现
04-19
更多文章>
Theme by Vdoing | Copyright © 2016-2024 铁匠 | 粤ICP备15021633号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式