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标准库监听路由
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的微服务,再启动服务发现中的代码。
服务发现将会输出如下,服务发现成功:

go微服务系列(一) go micro入门的更多相关文章
- Spring Cloud微服务系列文,服务调用框架Feign
之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON. 这种 ...
- 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)
微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...
- 从零开始,轻松搞定SpringCloud微服务系列
本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...
- 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足
Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...
- 微服务系列实践 .NET CORE
从事这个行业转眼已经6年了,从当初刚毕业的在北京朝八晚十,从二环到五环,仍每天精力充沛的小愤青:再到深圳一点一滴的辛勤在软件行业的耕种,从当初单体应用架构到现在微服务架构的经历,回想起来自己的收获倒是 ...
- 微服务系列(二):使用 API 网关构建微服务
编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨:微服务架构是如何影响客户端到服务端的通信,并提出一种使用 API 网关的方法. 作者介绍:Chris Richardso ...
- .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)
原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...
- .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)
原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...
- 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3
编者的话 |本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点.第二篇描述了采用微服务架构的应用客户端 ...
随机推荐
- drf☞jwt自动签发与手动签发
目录 一.自动签发 二.手动签发 一.自动签发 urls from rest_framework_jwt.views import obtain_jwt_token # 使用jwt自带的登录视图 ur ...
- Security and Risk Management(5)
Ethics: ISC Code of Ethics You agree to this before the exam, and the code of ethics is very testabl ...
- Ethical Hacking - GAINING ACCESS(18)
CLIENT SIDE ATTACKS Backdooring ANY file Combine backdoor with any file - Generic solution. Users ar ...
- vue & 百度地图:使用百度地图
index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- C++语法小记---类型转换
类型转换 C++类型转换主要包含两种: 隐式类型转换 小类型向大类型转换 char -> int short ->int int -> unsigned int int -> ...
- BUUCTF-web ikun(Python 反序列化)
正如本题所说,脑洞有点大.考点还很多,不过最核心的还是python的pickle反序列化漏洞 题目中暗示了要6级号,找了很多页都没看到,于是写了脚本 在第180页有6级号,但是价格出奇的高,明显买不起 ...
- java基础(九)--方法重载
如System.out.println()方法即是方法重载的. 以下举例说明自定义sum()方法的重载 package cnblogs; public class TestBase09MathRelo ...
- python匿名函数和内置函数
一.匿名函数 匿名函数定义lambda a,b,c:(x,y,z) a.b.c相当于形参,多个形参之间用逗号隔开,多个形参不能用括号括起来 (x.y.z)相当于返回值,多个返回值之间用逗号隔开,多个返 ...
- 【转载】 jmeter 命令行模式(非GUI)运行脚本,察看结果树结果为空,解决办法
转载地址:https://www.cnblogs.com/canglongdao/p/12636403.html jmeter 命令行模式(非GUI)运行脚本,察看结果树结果为空,解决办法: jmet ...
- Fortify Audit Workbench 笔记索引
Password Management: Password in Configuration File(明文存储密码) https://www.cnblogs.com/mahongbiao/p/124 ...