zoukankan      html  css  js  c++  java
  • go微服务系列(一)

    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的微服务,再启动服务发现中的代码。

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

  • 相关阅读:
    SlidingMenu官方实例分析8——CustomAnimation
    SlidingMenu官方实例分析7——SlidingContent和SlidingTitleBar区别
    SlidingMenu官方实例分析5——FragmentChangeActivity
    SlidingMenu官方实例分析4——AttachExample
    云虚拟主机和云服务器的区别
    SAP MM常用表
    dedecms 模板文件不存在,无法解析文档"的终极各种解决办法
    js代码如何测试代码运行时间
    java 连接msql数据库
    Java 创建xml文件和操作xml数据
  • 原文地址:https://www.cnblogs.com/baoshu/p/13461191.html
Copyright © 2011-2022 走看看