Go:使用 go-micro 构建微服务(二)

news2025/2/24 4:03:29

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服务添加成功
在这里插入图片描述

3.3 服务发现代码示例

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的微服务,再启动服务发现中的代码。
服务发现将会输出如下,服务发现成功:
在这里插入图片描述

小结

https://www.cnblogs.com/baoshu/p/13461191.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12月21日:fastadmin顶部搜索栏selectpage事件绑定以及实现添加表单和查询数据在同一个页面

fastadmin将添加表单从弹窗转为页面 如图所示,实现这种两个标签页,各自执行自己的操作 添加页从弹窗转为页面实现步骤: 首先:从前端页面来看,需要将添加的功能移动到index页面,即可初步实现 将Index页面如…

l2实时接口在手机APP上的使用方法介绍

考虑到很多人白天只能在手机上看行情,因此也重点介绍一下l2实时接口在手机APP上的使用方法,但是功能上PC才是最直观的。除了本文介绍的重点功能,Level2还有其他功能,具体使用方法可参考同花顺官方介绍。 利用“BBD”看当天大盘走…

R语言中的风险价值模型度量指标TVaR与VaR

99%的预期缺口[…]与99.6%的[…]风险值非常接近 受到“ 瑞士经验”报告中一句话的启发, 在99%置信水平[...]上的预期缺口[…]对应于大约99.6%至99.8%的风险价值 最近我们被客户要求撰写关于VaR的研究报告…

DPDK KNI 接口3

图1. kni结构图 从结构图中可以看到KNI需要内核模块的支持,即rte_kni.ko 当rte_kni模块加载时,创建/dev/kni设备节点(rte_kni模块创建kni杂项设备,文件系统节点/dev/kni需要手动或者通过udev机制创建),藉…

django.test.client的一些用法

对于文件(文本文件,或图片文件等等文件)从客户端上传到服务端,对于常规情况,也就是真实服务端和客户端,我们往往是需要给files这个参数的。 具体来说,就像这样: import requestshe…

万字总结Bootloader到内核的启动流程

Bootloader启动流程分析 Bootloader的启动过程可以分为单阶段、多阶段两种。通常多阶段的 Bootloader能提供更为复杂的功能以及更好的可移植性。从固态存储设备上启动的 Bootloader大多都是两阶段的启动过程。第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的…

【ML实验5】SVM(手写数字识别、核方法)

实验代码获取 github repo 山东大学机器学习课程资源索引 实验目的 实验内容 这里并不是通过 KTT 条件转化,而是对偶问题和原问题为强对偶关系,可以通过 KTT 条件进行化简。 令 xα[α1,α2,...,αn]Tx\alpha[\alpha_1,\alpha_2,...,\alpha_n]^Txα[α1…

极狐阿尔法S 全新HI版在上海率先推送城区NCA

继深圳之后,12月19日,极狐阿尔法S 全新HI版城区NCA(即城区智驾导航辅助功能)交付上海车主,将胜任城区复杂环境的“点到点”智驾融入更多用户的生活中。 此前,极狐阿尔法S 全新HI版已面向全国车主推送第二次…

Unreal Engine项目目录结构

目录 Engine 引擎源码文件 Games 项目工程文件 Visualizer VS编辑器配置文件 之前说的是工程目录结构,这次来说项目目录结构。 这里只是举了个例子,实际请根据不同的UE版本自行分析。 Engine 引擎源码文件 虚幻是开源的,我们可以直接在工…

05-Golang的基本数据类型

Golang的基本数据类型变量数据类型整型类型基本使用及细节基本介绍整数类型演示案例整型的使用细节浮点类型基本使用及细节基本介绍浮点型的分类案例演示使用细节字符类型基本使用及细节基本介绍案例演示字符类型本质探讨布尔类型的使用基本介绍字符串类型基本使用及细节基本介…

复变函数的积分

复变函数的积分化解成曲线积分的问题。 那化成第一类曲线积分还是第二类曲线积分?(高等数学 中有讲第一类曲线积分和第二类曲线积分)。 路径是有方向的,由起点和终点不同,路径有正向和负向。 复变函数的积分归结起来…

「学习方法」Scratch、Python、C++如何学才能融会贯通?

前言 相信很多家长朋友都发现一个问题:“编程教育正在以飞快的速度渗透于孩子们的培养体系中,这是为什么呢?原因很简单,这是因为通过专业的编程教育可以全面提升孩子的逻辑思维、创造力、动手能力等,让孩子们拥有更全…

线程池的使用

线程池 3大方法、7大参数、4种拒绝策略 好处:降低资源的消耗、提高响应的速度、方便管理、 线程池可以理解为银行业务 三大方法 第1大方法:单个线程 ExecutorService threadExecutor Executors.newSingleThreadExecutor(); 第2大方法&a…

c语言 操作符详解例题 数据存储 指针初阶 水仙花数 杨辉三角 逆序字符串 喝汽水问题 打印图形 猜凶手

【题目名称】 下面代码的结果是&#xff1a;a #include <stdio.h> int i; int main() {i--; sizeof的返回值是无符号整型if (i > sizeof(i)) i四个字节所以是4。算出的结果类型是unsigned int无符号和有符号比较大小 会先把有符号整型转化为无符号。 -1放到内…

浏览器底部导航栏遮盖问题

欧吼&#xff0c;算是遇到两次了这种问题。每次解决完都觉得很无语&#x1f92e; 先看问题如图&#xff08;怕公司说我泄露他们啥信息&#xff0c;于是打了非常离谱且难看的马赛克&#x1f60a;&#xff09;&#xff1a; 本来要在底部导航栏上方展示底部信息。 电脑上看倒是好…

怎样设计产品帮助中心?以下几点不可忽视

在日常产品的使用过程中&#xff0c;我们经常会遇到一些关于产品的使用相关问题&#xff0c;此时我们会去翻阅产品的说明书&#xff0c;而对于线上的产品来说&#xff0c;一般都会搭配对应的帮助文档&#xff0c;帮助文档可以提供关于用户在使用过程中遇到的各种问题的解答&…

【再学Tensorflow2】TensorFlow2的建模流程:Titanic生存预测

TensorFlow2的建模流程1. 使用Tensorflow实现神经网络模型的一般流程2. Titanic生存预测问题2.1 数据准备2.2 定义模型2.3 训练模型2.4 模型评估2.5 使用模型2.6 保存模型参考资料在机器学习和深度学习领域&#xff0c;通常使用TensorFlow来实现机器学习模型&#xff0c;尤其常…

03Python算数运算符及变量基本使用

算数运算符 算数运算符 是完成基本的算术运算使用的符号&#xff0c;用来处理四则运算 运算符描述实例加10 20 30-减10 - 20 -10*乘10 * 20 200/除10 / 20 0.5//取整除返回除法的整数部分&#xff08;商&#xff09; 9 // 2 输出结果 4%取余数返回除法的余数 9 % 2 1*…

干货 | 云原生时代的灰度发布有几种“姿势”?

随着企业数字化转型进程不断发展&#xff0c;云原生时代的来临&#xff0c;企业应用越来越多&#xff0c;不得不面对应用程序升级的巨大挑战。传统的停机发布方式&#xff0c;新旧版本应用切换少则停机30分钟&#xff0c;多则停机10小时以上&#xff0c;愈发无法满足业务端的需…

java入门及环境配置

java三大版本 JavaSE: 标准版&#xff08;桌面程序&#xff0c;控制台开发........) JavaEE: 嵌入式开发&#xff08;手机&#xff0c;小家电.....&#xff09; JavaEE: E企业级开发&#xff08;web端&#xff0c;服务器开发...&#xff09; JDK、JRE、JVM: Java安装开发环境&a…