go微服务系列(一) go micro入门
2024-10-09 13:12:46
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
标准库监听路由
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
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安装
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作为注册中心
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 服务发现代码示例
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
的微服务,再启动服务发现中的代码。
服务发现将会输出如下,服务发现成功:
最新文章
- MyEclipse 快捷键
- CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)
- Unity Sprite切割导出
- ant简述
- jquery介绍
- 错误提示:类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内 .
- 小生经验贴 --- adapter的数据更新
- IOS--- NavigationBar标题按钮
- docker-compose 工具安装
- 自定义Excel导出简易组件
- response和request
- pkgmgmt: Comparison between different Linux Systems..
- [js笔记整理]事件篇
- css中的层叠性及权重的比较
- Vue之七导航守卫
- golang 缓冲区的终端输入
- <;TCP/IP>;记一次关于IP地址和MAC物理地址的思考
- Linux系统安装管理
- WINSCP传输文件自动赋予777权限
- 使用CacheCloud管理Redis实例