微服务框架Go-kit 01 - 基础示例

news2024/9/19 10:50:48

一、Go kit简介

Go kit 是一个用于构建可扩展、灵活和可维护微服务的框架和工具集合。它提供了一系列库和组件,涵盖了微服务开发的各个方面,包括服务发现、负载均衡、通信、日志记录、请求跟踪、限流、熔断等。

Go kit 构建微服务时遵循一种类似于传统三层架构的模式,这个模式通常包括以下层:

  • Service(服务):
    Service 是一个定义了特定业务逻辑的接口,它封装了应用程序的业务功能。
    在 Go kit 中,你可以创建一个或多个 Service 接口的实现,用于处理具体的业务逻辑。每个 Service 可以包含多个方法来执行不同的操作。
  • Endpoint(端点):
    Endpoint 是将外部请求转换为内部服务调用的中间件。
    在 Go kit 中,你可以使用 Endpoint 来定义和包装每个服务方法(service method)。每个端点都负责处理特定的请求,并将其转发到相应的 Service 方法。
  • Transport(传输):
    Transport 是负责处理外部请求和服务之间通信的组件。
    在 Go kit 中,你可以使用不同的传输层,如 HTTP、gRPC 或任何其他自定义传输层,来处理请求和响应的编码、解码、路由等。

在 Go kit 中,将服务的业务逻辑封装到 Service 接口的实现中,然后通过 Endpoint 将外部请求转发到相应的 Service 方法。最后,通过 Transport 处理请求和响应的传输细节。

二、搭建简单的http服务

下面演示如何使用 Go kit 快速搭建一个微服务,实现通过userId获取用户名

项目结构

// 项目结构
-| Server
----| UserServer.go
-| EndPoint
----| UserEndPoint.go
-| Transport
----| UserTransport.go
- main.go
- go.mod

2.1 Server层

Server层实现业务逻辑

// UserService.go 实现业务
package Service

// IUserService 用于定义业务方法的接口
type IUserService interface {
	GetName(userId int) string
}

// UserService 用于实现上面定义的接口
type UserService struct{}

// 实现上方定义的业务方法
func (s UserService) GetName(userId int) string {
	if userId == 101 {
		return "Jerry"
	}
	return "Tom"
}

2.2 EndPoint层

EndPoint层 定义 Request、Response 格式,也就是声明 接收数据和响应数据的结构体

// UserEndPoint.go 定义 Request、Response 格式,也就是声明 接收数据和响应数据的结构体
package EndPoint

import (
	"context"
	"main/Service"

	"github.com/go-kit/kit/endpoint"
)

// Request 请求格式
type UserRequest struct {
	UserId int `json:"userId"`
}

// Response 响应格式
type UserResponse struct {
	Name string `json:"name"`
}

// 这里创建构造函数 GetName方法的业务处理
func GetUserEnpoint(userService Service.IUserService) endpoint.Endpoint {
	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
		//通过类型断言获取请求结构体
		req, ok := request.(UserRequest)
		if !ok {
			return UserResponse{}, nil
		}

		// 这里实际上就是调用我们在Server/UserServer.go中定义的业务逻辑
		name := userService.GetName(req.UserId)
		return UserResponse{Name: name}, nil
	}
}

2.3 Transport层

Transport主要负责HTTP、gRpc、thrift等相关的逻辑。当外部请求过来时,需要对Request进行解码,对Response进行编码

// Transport/UserTransport.go 主要负责HTTP、gRpc、thrift等相关的逻辑
// 当外部请求过来时,需要对Request进行解码,对Response进行编码
package Transport

import (
	"context"
	"encoding/json"
	"errors"
	"main/EndPoint"
	"net/http"
	"strconv"
)

func DecodeUserRequest(ctx context.Context, request *http.Request) (interface{}, error) {
	// 这里主要就是通过 request 拿到对应的参数构造成在 EndPoint中定义的 Request结构体即可
	if request.URL.Query().Get("userId") != "" {
		userId, _ := strconv.Atoi(request.URL.Query().Get("userId"))
		return EndPoint.UserRequest{UserId: userId}, nil
	}
	return nil, errors.New("参数错误")
}

func EncodeUserResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
	// 这里将Response返回成有效的json格式给http

	// 设置请求头信息
	w.Header().Set("Content-Type", "application/json")
	// 使用内置json包转换
	return json.NewEncoder(w).Encode(response)
}

2.4 启动服务

// 服务启动
package main

import (
	"main/EndPoint"
	"main/Service"
	"main/Transport"
	"net/http"

	httpTransport "github.com/go-kit/kit/transport/http"
)

// 服务发布
func main() {
	// 1.先创建我们最开始定义的Server/UserService.go
	user := Service.UserService{}

	// 2.在用EndPoint/UserEnpoint.go 创建业务服务
	endp := EndPoint.GetUserEnpoint(user)

	// 3.使用 kit 创建 handler
	// 固定格式
	// 传入 业务服务 以及 定义的 加密解密方法
	httpHanlder := httpTransport.NewServer(endp, Transport.DecodeUserRequest, Transport.EncodeUserResponse)

	// 使用http包启动服务
	http.ListenAndServe(":8080", httpHanlder)
}

结果展示
在这里插入图片描述
对C++或者Golang编程技术感兴趣的朋友请点击这里:零声学院课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java/php/node.js/python农业技术学习平台【2024年毕设】

本系统带文档lw万字以上 文末可领取本课题的JAVA源码参考 开发环境 开发语言:Java 框架:ssm 技术:ssmvue JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7或8.0 数据库工具:Navicat11 …

AI绘画Stable Diffusion 一键打造网红黏土风格图片,本地部署免费使用!

大家好,我是画画的小强 最近社交平台正在被一股全新的创作潮流所席卷,这就是“黏土AI”的狂潮。这种丑陋但又可爱的风格已经成为网民们热议的话题。无论是在小红书还是其他社交平台上,诸如#黏土、#我的黏土世界等标签都被这种新奇的创作风格…

Flink-cdc更好的流式数据集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一种数据变更捕获技术,用于从数据源(如数据库)中捕获和处理数据的变更事件。CDC技术允许实时地捕获数据库中的增、删、改操作,将这些变更事件转化为流式数据,并能够…

客厅落地台灯怎么摆放好?五款精品护眼落地灯分享

客厅落地台灯怎么摆放好?在追求品质生活的今天,许多人都选择入手了落地台灯,它不仅能够帮助补充光线,还能够提供敞亮的照明效果,特别在采光不是很好的地方,而客厅落地台灯怎么摆放好?其实大路灯…

SQL刷题笔记day1

1题目 我的代码: select * from employees order by hire_date desc limit 2,1 标准代码: select * from employees where hire_date (select distinct hire_date from employees order by hire_date desc limit 2,1) 复盘:因为按照入…

DOS学习-目录与文件应用操作经典案例-copy

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 copy命令的功能是复制一个或多个已经存在的文件到新的位置,或者将多个文件的内容整合后保存为一个单独的文件,亦或者用于创建批…

docker部署kafka实战

目录 一、部署kafaka、zookeeper 二、测试信息发送与接收 三、kafka进阶 一、部署kafaka、zookeeper 请提前安装docker、docker-compose 安装docker:docker--安装docker-ce-CSDN博客 安装docker-compose: 安装docker-compose_安装 docker-compose-CSD…

URL化00

题目链接 URL化 题目描述 注意点 字符串长度在 [0, 500000] 范围内假定该字符串尾部有足够的空间存放新增字符 解答思路 因为该字符串尾部有足够的空间存放新增字符,所以直接使用大小为s.length()的char数组进行操作,使用idx记录当前操作char数组的…

Vue学习笔记2——创建一个Vue项目

Vue项目 1、创建一个Vue项目2、Vue项目的目录结构3、模版语法4、属性绑定5、条件渲染 1、创建一个Vue项目 vue官方文档: https://cn.vuejs.org/打开命令行界面( “winR"再输入"cmd”),切换位置到指定的位置创建vue项目…

Z缓冲技术在AI去衣中的关键角色

引言: 人工智能(AI)技术的飞速发展,为图像处理领域带来了革命性的变化。其中,AI去衣技术作为一种新兴的应用,引起了广泛关注。它不仅在多媒体内容的编辑、虚拟现实和增强现实等领域具有重要的应用价值&…

【B站 heima】小兔鲜Vue3 项目学习笔记Day03

文章目录 Home1.Home整体结构搭建和分类实现2. banner轮播图功能3. Home 面板组件封装4.新鲜好物和人气推荐实现5. 图片懒加载指令实现6. Home- product产品列表实现7. Home-GoodsItem 组件封装 一级路由1. 整体认识和路由配置2. 面包屑导航3. 一级分类 - 轮播图的实现4. 激活状…

MacPro中Ubuntu安装GNOME桌面

第一步,先在MacPro中安装UTM虚拟机。 查看另一文章: https://blog.csdn.net/qq_38382925/article/details/139157877?spm1001.2014.3001.5502 第二步,在虚拟机中安装Ubuntu ARM64 server 查看另一文章: https://blog.csdn.net/qq…

Golang | Leetcode Golang题解之第100题相同的树

题目: 题解: func isSameTree(p *TreeNode, q *TreeNode) bool {if p nil && q nil {return true}if p nil || q nil {return false}queue1, queue2 : []*TreeNode{p}, []*TreeNode{q}for len(queue1) > 0 && len(queue2) > …

uni-app 微信 支付宝 小程序 使用 longpress 实现长按删除功能,非常简单 只需两步

1、先看效果 2、直接上代码 ui结构 <view class"bind" longpress"deleteImage" :data-index"index"><view class"bind_left">绑定设备</view><view class"bind_right"><view class"bind_t…

三方登录- iOS Twitter登录

背景 在现代移动应用中&#xff0c;集成第三方登录已经成为一种常见的需求&#xff0c;它不仅能提高用户体验&#xff0c;还能减少用户注册的阻力。我们选择了 Twitter 作为示例&#xff0c;但类似的步骤和逻辑也适用于其他第三方登录服务。希望这篇博客能为你提供清晰的指导&…

【Spring】spring入门程序

案例要求&#xff1a;创建一个 Studentservice 类&#xff0c;其中需要使用 studentDao 接口的保存方法&#xff0c;来存储一个Student 类的对象&#xff0c;StudentDao 接口有两个不同的实现类&#xff0c;通过 Spring 的方式&#xff0c;为 Student类创建对象并为属性赋值&am…

2024电工杯B题食谱评价与优化模型思路代码论文分析

2024年电工杯数学建模竞赛B题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型…

vmware - 主机向虚拟机拷贝文件的临时方法

文章目录 vmware - 主机向虚拟机拷贝文件的临时方法概述笔记确认主机/虚拟机之间网络是通的在虚拟机中新建一个文件夹(e.g. c:\test), 将这个文件夹设为共享文件夹。查看虚拟机中的当前用户(远程登录要用)远程登录END vmware - 主机向虚拟机拷贝文件的临时方法 概述 程序打包…

go 微服务框架kratos错误处理的使用方法及原理探究

通过go语言原生http中响应错误的实现方法&#xff0c;逐步了解和使用微服务框架 kratos 的错误处理方式&#xff0c;以及探究其实现原理。 一、go原生http响应错误信息的处理方法 处理方法&#xff1a; ①定义返回错误信息的结构体 ErrorResponse // 定义http返回错误信息的…

vscode 插件开发指南

1安装nodejs、vscode 2安装插件脚手架 npm install -g yo generator-code 3使用命令创建插件项目 yo code 4在vscode中打开项目 5运行调试&#xff0c;按F5键 6在新打开的窗口中按shiftctrlp 然后执行命令 7配置右键菜单命令 遇到问题&#xff1a; 1.package.json中vsc…