1. 什么是go micro

1.1 go micro做用

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

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

1.2 go micro架构组成

Go 微体系结构能够描述为三层堆栈github

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

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

底层由如下类型的插件组成:算法

Go MicroSidecarGo

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

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框架做为路由json

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进行服务注册/发现

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

经常使用的有consul、etcd、zookeeper、eurekaapi

咱们这里使用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/consulgithub.com/micro/go-plugins/registry/consul
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()
}
consulproductService

consulproductService

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)
}
productService

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