当前位置: 首页 > news >正文

golang学习笔记17——golang使用go-kit框架搭建微服务详解

  • 推荐学习文档
    • golang应用级os框架,欢迎star
    • golang应用级os框架使用案例,欢迎star
    • 案例:基于golang开发的一款超有个性的旅游计划app经历
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • 想学习更多golang知识,这里有免费的golang学习笔记专栏

文章目录

    • 引言
    • 微服务架构概述
      • 1.什么是微服务架构
      • 2.微服务架构的优势
    • Go 语言在微服务中的优势
      • 1.高效性能
      • 2.简洁语法
      • 3.强大的并发模型
      • 4.丰富的标准库
    • 使用 Go 语言搭建微服务的步骤
      • 1.选择微服务框架
      • 2.定义服务接口
      • 3.实现服务接口
      • 4.创建服务端点
      • 5.创建传输层
      • 6.启动服务
    • 总结

引言

随着互联网的快速发展,微服务架构已经成为了现代软件开发的主流趋势。Go 语言作为一种高效、简洁的编程语言,非常适合用于构建微服务架构。本文将详细介绍如何使用 Go 语言搭建微服务,并结合代码示例进行讲解。

微服务架构概述

1.什么是微服务架构

  • 微服务架构是一种将单一应用程序拆分为一组小型服务的架构风格。每个服务都运行在自己的进程中,通过轻量级的通信机制进行交互。
  • 微服务架构具有高可扩展性、高可用性、易于开发和维护等优点。

2.微服务架构的优势

  • 独立部署:每个微服务都可以独立部署,不会影响其他服务的运行。这使得开发团队可以更加快速地迭代和发布新功能。
  • 技术选型自由:每个微服务都可以选择适合自己的技术栈,不受其他服务的限制。这使得开发团队可以更加灵活地选择最适合的技术来解决问题。
  • 高可扩展性:可以根据业务需求,独立地扩展每个微服务,提高系统的整体性能。
  • 高可用性:如果某个微服务出现故障,不会影响其他服务的运行,提高了系统的整体可用性。

Go 语言在微服务中的优势

1.高效性能

  • Go 语言具有高效的性能,能够快速处理大量的请求。这使得 Go 语言非常适合用于构建高并发的微服务。

2.简洁语法

  • Go 语言的语法简洁明了,易于学习和使用。这使得开发团队可以更加快速地开发和维护微服务。

3.强大的并发模型

  • Go 语言内置了强大的并发模型,通过 goroutine 和 channel 可以轻松地实现高并发的微服务。

4.丰富的标准库

  • Go 语言提供了丰富的标准库,涵盖了网络编程、数据库访问、加密算法等多个领域。这使得开发团队可以更加快速地构建微服务。

使用 Go 语言搭建微服务的步骤

1.选择微服务框架

  • Go 语言有很多优秀的微服务框架,如 Go-Kit、Micro、Kratos 等。选择一个适合自己项目的微服务框架非常重要。
  • 在本文中,我们将使用 Go-Kit 框架来搭建微服务。Go-Kit 是一个功能强大、灵活可扩展的微服务框架,它提供了很多有用的功能,如服务发现、负载均衡、日志记录、监控等。

2.定义服务接口

  • 在 Go-Kit 中,服务接口是通过一组方法来定义的。每个方法代表一个服务操作。
    例如,我们可以定义一个简单的加法服务接口:
package servicetype AddService interface {Add(a, b int) int
}

3.实现服务接口

  • 定义好服务接口后,我们需要实现这个接口。在 Go-Kit 中,服务实现是通过结构体和方法来实现的。
  • 例如,我们可以实现一个简单的加法服务:
package servicetype addService struct{}func (s *addService) Add(a, b int) int {return a + b
}

4.创建服务端点

  • 在 Go-Kit 中,服务端点是服务接口的具体实现。它接收请求并返回响应。
  • 例如,我们可以创建一个加法服务端点:
package endpointimport ("context""errors""github.com/go-kit/kit/endpoint""service"
)type addRequest struct {A intB int
}type addResponse struct {Result intErr    error
}func makeAddEndpoint(s service.AddService) endpoint.Endpoint {return func(ctx context.Context, request interface{}) (interface{}, error) {req := request.(addRequest)result, err := s.Add(req.A, req.B)if err!= nil {return addResponse{Result: 0, Err: err}, nil}return addResponse{Result: result, Err: nil}, nil}
}

5.创建传输层

  • 在 Go-Kit 中,传输层负责将服务端点暴露给外部世界。它可以是 HTTP、gRPC 等协议。
  • 例如,我们可以创建一个 HTTP 传输层:
package transportimport ("context""encoding/json""errors""net/http""github.com/go-kit/kit/endpoint""github.com/go-kit/kit/log""github.com/go-kit/kit/transport""github.com/go-kit/kit/transport/http"
)func makeAddHTTPHandler(endpoint endpoint.Endpoint, logger log.Logger) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {var request addRequestif err := json.NewDecoder(r.Body).Decode(&request); err!= nil {w.WriteHeader(http.StatusBadRequest)json.NewEncoder(w).Encode(map[string]interface{}{"error": err.Error()})return}ctx := context.Background()response, err := endpoint(ctx, request)if err!= nil {w.WriteHeader(http.StatusInternalServerError)json.NewEncoder(w).Encode(map[string]interface{}{"error": err.Error()})return}resp := response.(addResponse)if resp.Err!= nil {w.WriteHeader(http.StatusBadRequest)json.NewEncoder(w).Encode(map[string]interface{}{"error": resp.Err.Error()})return}w.WriteHeader(http.StatusOK)json.NewEncoder(w).Encode(map[string]interface{}{"result": resp.Result})})
}

6.启动服务

  • 最后,我们需要启动服务。在 Go-Kit 中,可以使用 HTTP 服务器来启动服务。
  • 例如,我们可以启动一个加法服务:
package mainimport ("log""net/http""os""github.com/go-kit/kit/log/level""service""endpoint""transport"
)func main() {logger := log.NewLogfmtLogger(os.Stderr)addService := service.NewAddService()addEndpoint := endpoint.MakeAddEndpoint(addService)addHandler := transport.MakeAddHTTPHandler(addEndpoint, logger)http.Handle("/add", addHandler)level.Info(logger).Log("msg", "Starting server on port 8080")log.Fatal(http.ListenAndServe(":8080", nil))
}

总结

本文介绍了如何使用 Go 语言搭建微服务。我们首先介绍了微服务架构的概述和优势,然后介绍了 Go 语言在微服务中的优势。接着,我们详细介绍了使用 Go-Kit 框架搭建微服务的步骤,包括选择微服务框架、定义服务接口、实现服务接口、创建服务端点、创建传输层和启动服务。最后,我们总结了本文的内容,并希望本文能够对读者有所帮助。

关注我看更多有意思的文章哦!👉👉

相关文章:

golang学习笔记17——golang使用go-kit框架搭建微服务详解

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

git update-ref

git update-ref 是一个低级别的 Git 命令&#xff0c;用于直接更新 Git 的引用&#xff08;refs&#xff09;。这个命令可以用来设置或删除分支、标签或其他引用的值&#xff0c;通常用于脚本或复杂的 Git 操作中。 基本用法 git update-ref <ref> <new-value> […...

学习使用在windows系统上安装nodejs以及环境配置图文教程整理

学习使用在windows系统上安装nodejs以及环境配置图文教程整理 Node.js 介绍Node.js 安装1、Node.js下载2、Node.js安装3、Node.js测试4、Node.js安装目录5、Node.js环境变量配置6、配置镜像站&#xff0c;提升速度7、检查镜像站配置8、测试环境变量是否生效9、安装cnpm Node.js…...

Hexo框架学习——从安装到配置

第一章 Hexo入门 Hexo 是一个快速、简洁且高效的博客框架。 1.1 Hexo的下载与安装 1.1.1 Hexo下载 在下载Hexo之前&#xff0c;我们需要确保电脑上已经安装好以下软件&#xff1a; Node.js (Node.js 版本需不低于 10.13&#xff0c;建议使用 Node.js 12.0 及以上版本) Git…...

搭建Windows下的Rust开发环境

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 2.1.1 安装vs_buildtools 在Windows系列操作系统中&#xff0c;Rust开发环境需要依…...

[linux 驱动]misc设备驱动详解与实战

目录 1 描述 2 结构体 2.1 miscdevice 2.2 file_operations 3 注册和注销 3.1 misc_register 3.2 misc_deregister 4 解析 misc 内核源码 4.1 核心代码 4.2 函数解析 4.2.1 class_create_file 4.2.2 class_destroy 4.2.3 register_chrdev 5 示例 5.1 简单示例 5…...

C/S架构与B/S架构的适用场景分析

C/S架构&#xff08;客户端/服务器架构&#xff09;与B/S架构&#xff08;浏览器/服务器架构&#xff09;在适用场景上各有特点&#xff0c;主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。 一、C/S架构的适用场景 1、高性能与交互性要求高的应用&…...

AI论文精读笔记-Generative Adversarial Nets(GAN)

1. 论文基本信息 论文标题&#xff1a;Generative Adversarial Nets 作者&#xff1a;Ian J. Goodfellow,∗ Jean Pouget-Abadie,† Mehdi Mirza, Bing Xu, David Warde-Farley, Sherjil Ozair,‡ Aaron Courville, Yoshua Bengio 发表时间和期刊&#xff1a;2014.06&#xf…...

Redis(主从复制、哨兵模式、集群)概述及部署测试

目录 一、Redis 主从复制 1.1、Redis 主从复制概念 1.2、主从复制的作用 1.3、主从复制流程 1.4、搭建Redis 主从复制 二、Redis 哨兵模式 2.1、Redis 哨兵模式概念 2.2、哨兵模式原理 2.3、哨兵模式的作用 2.4、哨兵模式的结构 2.5、故障转移机制 2.6、主节点的选…...

jmeter吞吐量控制器

一、吞吐量控制器作用&#xff1a;旨在混合场景中&#xff0c;控制样本数&#xff0c;通常在比例场景中使用 吞吐量控制器提供了两种控制模式&#xff1a; 百分比执行&#xff08;Percent Executions&#xff09;&#xff1a; 吞吐量控制器会根据配置的百分比来决定其下的作用…...

【GBase 8c V5_3.0.0 分布式数据库常用几个SQL】

1.检查应用连接数 以管理员用户 gbase&#xff0c;登录数据库主节点。 接数据库&#xff0c;并执行如下 SQL 语句查看连接数。 SELECT count(*) FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;2.查看空闲连接 查看空闲(state 字段为”idle”)且长时间没有更…...

grep,wc命令

一.grep命令 1.grep命令的作用 我们通过grep命令从文件中通过关键字过滤文件行 2.grep命令的语法 grep [-n] 关键字 文件路径 其中grep作为命令主体 -n选项表示在结果中显示匹配的行的行号 关键字为必填参数&#xff0c;表示过滤的关键字&#xff08;可以使用""…...

NLP-文本分类文献阅读-前置基础-词汇解释-通俗易懂-9月份-学习总结

目录 迁移学习 特征选择 特征工程 朴素贝叶斯分类方法 支持向量机 K-最近邻&#xff08;K-Nearest Neighbors, KNN&#xff09; 特征向量稀疏 卷积神经网络 循环神经网络 图神经网络 TextCNN 动态 K 最大池化 One-hot BOW Word2vec 池化&#xff08;Pooling&#xff09; 全连接…...

Conda安装和使用(ubuntu)

以下是关于如何使用 Conda 的详细指南。这将涵盖从安装到基本操作的各个方面&#xff0c;帮助您高效地管理Python环境和依赖项。 Conda 简介 Conda 是一个跨平台的开源包管理器和环境管理器&#xff0c;最初由 Anaconda 开发&#xff0c;广泛用于数据科学、机器学习和科学计算…...

JavaEE:文件操作

文章目录 文件操作和IO文件系统操作File介绍属性构造方法方法 代码演示前四个listmkdirrenameTo 文件操作和IO 文件系统操作 创建文件,删除文件,创建目录,重命名… Java中有一个类,可以帮我们完成上述操作. 这个类叫做File类. File介绍 属性 这个表格描述了文件路径的分隔符…...

Python | 练习作业 2

为学生登录系统新增搜索功能。 第二天作业的解题思路&#xff1a; # 1.创建一个空列表保存搜索结果 # 2.让用户输入要搜索的内容 # 3.遍历学生信息&#xff0c;检查学生的id name age gender score # 中的属性值 是否跟用户搜索的内容一致 # 4.如果有一致的属性 那么就将该学生…...

C语言-整数和浮点数在内存中的存储-详解-上

C语言-整数和浮点数在内存中的存储-详解-上 1.前言2.整数2.1无符号整数2.2原码、反码、补码符号位最大值转换过程补码的意义简化算术运算易于转换方便溢出处理 1.前言 在C语言的使用中&#xff0c;需要时刻关注数据的类型&#xff0c;不同类型交替使用可能会发生错误&#xff…...

图论篇--代码随想录算法训练营第六十一天打卡| Floyd 算法,A*算法

Floyd 算法&#xff08;求多源汇最短路&#xff09; 题目链接&#xff1a;97. 小明逛公园 题目描述&#xff1a; 小明喜欢去公园散步&#xff0c;公园内布置了许多的景点&#xff0c;相互之间通过小路连接&#xff0c;小明希望在观看景点的同时&#xff0c;能够节省体力&…...

CMake构建学习笔记16-使用VS进行CMake项目的开发

文章目录 1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行 3. 项目案例4. 总结 1. 概论 在之前的系列博文中&#xff0c;我们学习了如何构建第三方的依赖库&#xff0c;也学习了如何去组建自己的CMake项目&#xff0c;尤其是学习了CMake的核心配…...

数据结构中线性表的定义和特点

线性表&#xff1a;有n个数据特征相同的元素构成的有限序列。 特点&#xff1a; 除了第一个元素&#xff0c;最后一个元素&#xff0c;其余的元素都有唯一的前驱和唯一的后继。 案例引入&#xff1a; 一元多项式的运算&#xff1a; 可以将一元多项式p(x)抽象为一个有n1个系…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...