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入门的更多相关文章

  1. Spring Cloud微服务系列文,服务调用框架Feign

    之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON.    这种 ...

  2. 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)

    微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...

  3. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  4. 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足

    Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...

  5. 微服务系列实践 .NET CORE

    从事这个行业转眼已经6年了,从当初刚毕业的在北京朝八晚十,从二环到五环,仍每天精力充沛的小愤青:再到深圳一点一滴的辛勤在软件行业的耕种,从当初单体应用架构到现在微服务架构的经历,回想起来自己的收获倒是 ...

  6. 微服务系列(二):使用 API 网关构建微服务

    编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨:微服务架构是如何影响客户端到服务端的通信,并提出一种使用 API 网关的方法. 作者介绍:Chris Richardso ...

  7. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...

  8. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...

  9. 【CHRIS RICHARDSON 微服务系列】微服务架构中的进程间通信-3

    编者的话 |本文来自 Nginx 官方博客,是微服务系列文章的第三篇,在第一篇文章中介绍了微服务架构模式,与单体模式进行了比较,并且讨论了使用微服务架构的优缺点.第二篇描述了采用微服务架构的应用客户端 ...

随机推荐

  1. 从零搭建Spring Cloud Gateway网关(三)——报文结构转换

    背景 作为网关,有些时候可能报文的结构并不符合前端或者某些服务的需求,或者因为某些原因,其他服务修改报文结构特别麻烦.或者需要修改的地方特别多,这个时候就需要走网关单独转换一次. 实现 话不多说,直接 ...

  2. 那些非cmake生成的VTK工程存在的让人崩溃的坑

    由于cmake和IDE的一些编译选项不同,所以导致我们使用者需要多做一些事情.而且vtk官方也表示: If you are not using CMake to compile your code, ...

  3. Java应用服务器之tomcat部署

    一.相关术语简介 首先我们来了解下tomcat是什么,tomcat是apache软件基金会中的一个项目,由apache.Sun 和其他一些公司及个人共同开发而成.主要作用是提供servlet和jsp类 ...

  4. Active Directory - Creating users via PowerShell

    Method1: Create a user by executing the following PowerShell Script. New-ADUser -name 'Michael Jorda ...

  5. python- generator生成器

    什么是生成器? 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后 ...

  6. 利用宝塔和rainloop搭建咱的邮箱

    需要咱准备的东东:一枚域名.服务器需根据情况开放25.110.143.465.993端口.宝塔邮局管理器.rainloop.LNMP或者LAMP. 搭建步骤: 1.安装宝塔邮局管理器: 2.设置宝塔邮 ...

  7. 如何看待HTTP/3

    前言 HTTP/2 相比于 HTTP/1.1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何优雅降级应该是国内还不普遍使用的原因之一. ...

  8. 01 shell编程之变量定义

    一.SHELL介绍 ㈠ 什么是shell脚本? 简单来说就是将需要执行的命令保存到文本中,按照顺序执行.它是解释型的,意味着不需要编译. 若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= s ...

  9. Invalid RNPermission 'ios.permission.xxx'. should be one of: ( )

    原因可能是配置配置问题, 我碰到的是Android上完美运行,iOS报错,原因是前期用的Android开发,iOS的配置项没有配完整 按照官方配置一遍 https://github.com/react ...

  10. vue学习(六) 事件修饰符 stop prevent capture self once

    //html <div id="app"> <div @click="divHandler" style="height:150px ...