go微服务系列(一) - go micro入门

1. 什么是go micro#

1.1 go micro作用#

它是一个可插入的RPC框架,用于在Go中编写微服务。开箱即用,您将收到:

  • 服务发现: 应用程序自动注册到服务发现系统
  • 负载平衡: 客户端负载平衡,用于平衡服务实例之间的请求
  • 同步通信: 提供请求 / 响应传输层。
  • 异步通信: 内置发布 / 订阅功能。
  • 消息编码: 基于消息的内容类型头的编码 / 解码。
  • RPC 客户机/服务器包: 利用上述功能并公开接口来构建微服务

1.2 go micro架构组成#

Go 微体系结构可以描述为三层堆栈

顶层由客户端-服务器模型和服务抽象组成。

  • 服务器: 用于编写服务的构建块
  • 客户端: 提供了向服务请求的接口。

底层由以下类型的插件组成:

  • 代理: 为异步发布/订阅通信提供消息代理的接口。
  • 编解码器: 用于编码/解码消息。支持的格式包括 json,bson,protobuf,msgpack 等。
  • 注册表: 提供服务发现机制(默认为 Consul)
  • 选择器: 建立在注册表上的负载平衡抽象。它允许使用诸如随机,轮循,最小康等算法来 “选择” 服务。
    传输 - 服务之间同步请求 / 响应通信的接口。
  • Go Micro还提供了Sidecar等功能。这使您可以使用Go以外的语言编写的服务

Sidecar提供服务注册,gRPC编码/解码和HTTP处理程序。它支持多种语言。

2. go micro入门#

最简单的用法大概如下,结合net/http标准库监听路由

Copy
package main import ( "github.com/micro/go-micro/web" "net/http" ) func main() { server := web.NewService(web.Address(":8081")) // 路由 server.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello go micro")) }) _ = server.Run() }

也可以集成第三方web框架作为路由

  • 比如gin
Copy
package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/micro/go-micro/web" ) func main() { // 使用gin作为路由 r := gin.Default() r.GET("/user", func(c *gin.Context) { c.String(http.StatusOK, "user api") }) server := web.NewService( web.Address(":8081"), // 端口 web.Metadata(map[string]string{"protocol": "http"}), // 元信息 web.Handler(r)) // 路由 _ = server.Run() }

3. 结合consul进行服务注册/发现#

微服务里最重要的关键一步就是服务注册

常用的有consul、etcd、zookeeper、eureka

我们这里使用consul

3.1 consul的安装#

这里直接使用docker安装

Copy
docker run -d --name=cs -p 8500:8500 consul agent -server -bootstrap -ui -client 0.0.0.0

然后再访问端口8500,如下现实安装成功

3.2 服务注册代码示例#

github.com/micro/go-micro/registry/consul
上面这个在1.14.0版本之后删除了,要用这个github.com/micro/go-plugins/registry/consul,或者换成etcd作为注册中心

Copy
package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/web" "github.com/micro/go-plugins/registry/consul" ) func main() { // 添加consul地址 cr := consul.NewRegistry( registry.Addrs("127.0.0.1:8500")) // 使用gin作为router router := gin.Default() router.GET("/user", func(c *gin.Context) { c.String(http.StatusOK, "user api") }) // 初始化go micro server := web.NewService( web.Name("productService"), // 当前微服务服务名 web.Registry(cr), // 注册到consul web.Address(":8081"), // 端口 web.Metadata(map[string]string{"protocol": "http"}), // 元信息 web.Handler(router)) // 路由 _ = server.Run() }

把上述代码运行起来,再去consul界面查看,发现productService服务添加成功

然后把代码停掉,再去consul界面查看,productService就没了,非常方便

3.2 服务发现代码示例#

Copy
package main import ( "fmt" "log" "github.com/micro/go-micro/client/selector" "github.com/micro/go-micro/registry" "github.com/micro/go-plugins/registry/consul" ) func main() { // 1.连接到consul cr := consul.NewRegistry(registry.Addrs("127.0.0.1:8500")) // 2.根据service name获取对应的微服务列表 services, err := cr.GetService("productService") if err != nil { log.Fatal("cannot get service list") } // 3.使用random随机获取其中一个实例 next := selector.Random(services) svc, err := next() if err != nil { log.Fatal("cannot get service") } fmt.Println("[测试输出]:", svc.Id, svc.Address, svc.Metadata) }

然后使用goland先启动服务注册中的productService的微服务,再启动服务发现中的代码。

服务发现将会输出如下,服务发现成功:

posted @   宝树呐  阅读(8188)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
CONTENTS