微服务技术初探(go-micro)

news/2024/5/6 20:10:58/文章来源:https://www.cnblogs.com/liao-lin/p/16670858.html

微服务技术初探

微服务概述

微服务是近几年产生的新概念,与传统的单体式服务相比,微服务具有更好的扩展性及低耦合度等特性。微服务的重点在于服务的治理和调度。
微(micro):狭义来说就是体积小。
服务(service):区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集,比如用户注册服务、用户权限认证服务等。
微服务架构:微服务架构是将复杂的系统使用组件化的方式进行拆分,并用轻量级通讯方式进行整合的一种设计方法。可以用一句话描述“分而治之,合而用之”。
微服务架构风格:微服务架构风格是将单个应用程序作为一组小型服务开发的方法,每个服务程序都在自己的进程中运行,并与轻量级机制(比如HTTP API、RPC)进行通信,这些服务围绕业务功能构建,不同服务可以用不同的编程语言编写,数据存储也通常各自管理而不是集中式管理。
总结来说微服务是用微服务架构风格设计的应用。

go-micro学习微服务

服务发现

在做微服务开发的时候,客户端的一个接口可能需要调用N个服务,客户端必须知道所有服务的网络位置(ip+port),如:

vqwTFU.png

以往的做法是把服务的地址放在配置文件或数据库中,这样就有以下几个问题:

  • 需要配置N个服务的网络位置,加大配置的复杂性
  • 服务的网络位置变化,需要改变每个调用者的配置
  • 集群的情况下,难以做负载(反向代理的方式除外)

微服务里选择服务发现来解决这些问题。如:

vqwOyR.png

服务端把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问(健康检查)。客户端在调用服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样客户端和服务端就解耦了!

常见的服务发现框架有:Etcd、Eureka、Consul、Zookeeper、Apollo

go-micro默认的服务发现框架是consul,在v2以后版本中默认的服务发现换成了etcd。

go-micro安装

这里选择使用较多的v4版本

环境安装:

https://github.com/asim/go-micro

#安装go-micro
go get -u -v github.com/micro/go-micro
#安装工具集
go get -u -v github.com/micro/micro
#dependence
# protobuf安装
https://github.com/protocolbuffers/protobuf/releases
# protoc-gen-go安装
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
# protoc-gen-micro安装
# go install github.com/micro/micro/v2/cmd/protoc-gen-micro@latest
# go install github.com/micro/micro/v3/cmd/protoc-gen-micro@master
go install github.com/go-micro/generator/cmd/protoc-gen-micro# 如果是windows要安装micro cli
git clone https://github.com/go-micro/cli.git
cd cmd/go-micro
go build -o micro.exe
或者:
https://github.com/go-micro/cli/tree/v1.1.1## 这里protoc-gen-micro我用的适配最新的https://github.com/GhostLuker/protoc-gen-micro
protoc-gen-mymicro.exe
protoc --proto_path=. --mymicro_out=. --go_out=:. proto/helloworld.proto

docker环境安装:

$ docker pull microhq/micro

go-micro创建个HelloWorld微服务

# 创建微服务项目代码
go-micro new service helloworld# 初始化
cd helloworld
(原本是make proto tidy,windows这里有点问题我就直接执行Makefile里的指令)
protoc --proto_path=. --micro_out=. --go_out=:. proto/helloworld.proto
go mod tidy

这样一个微服务程序就初始化完成了。目录结构如下:

helloworld
├── Dockerfile
├── Makefile
├── go.mod
├── go.sum
├── handler
│   └── helloworld.go
├── main.go
└── proto├── helloworld.pb.go├── helloworld.pb.micro.go└── helloworld.proto

go run main.go 启动服务端后

可以使用命令行直接调用也可以手写客户端代码调用:

# 命令行调用
go-micro call helloworld Helloworld.Call "{\"name\": \"John\"}"

客户端代码调用示例:

package mainimport ("context""fmt""go-micro.dev/v4"helloworld "helloworld/proto"
)/**
命令行调用micro服务服务的方法:go-micro call helloworld Helloworld.Call "{\"name\": \"John\"}"
*/func main() {// create the greeter client using the service name and clientserv := micro.NewService(micro.Name("helloworld"),micro.Version("latest"),)serv.Init()//创建客户端hello_client := helloworld.NewHelloworldService("helloworld", serv.Client())//调用rpc服务rsp, err := hello_client.Call(context.TODO(), &helloworld.CallRequest{Name: "Tom"})if err != nil {fmt.Println(err)return}fmt.Println(rsp.GetMsg())
}

配合服务注册的go-micro示例

如上是go-micro微服务框架生成的helloworld代码示例,下面测试下带有服务注册的helloworld示例,这里服务注册使用golang的神器etcd来实现。

ETCD的安装非常简单这里省略...

服务端代码

package mainimport ("github.com/asim/go-micro/plugins/registry/etcd/v4""go-micro.dev/v4/registry""helloworld/handler"pb "helloworld/proto""go-micro.dev/v4"log "go-micro.dev/v4/logger"
)var (service = "helloworld"version = "latest"
)func main() {// Create servicesrv := micro.NewService(micro.Name(service),micro.Version(version),// etcd注册micro.Registry(etcd.NewRegistry(registry.Addrs("127.0.0.1:2379"),)),)srv.Init()// Register handlerpb.RegisterHelloworldHandler(srv.Server(), new(handler.Helloworld))// Run serviceif err := srv.Run(); err != nil {log.Fatal(err)}
}

客户端代码:

package mainimport ("context""fmt""github.com/asim/go-micro/plugins/registry/etcd/v4""go-micro.dev/v4""go-micro.dev/v4/registry"helloworld "helloworld/proto"
)/**
命令行调用micro服务服务的方法:go-micro call helloworld Helloworld.Call "{\"name\": \"John\"}"
*/func main() {// create the greeter client using the service name and clientserv := micro.NewService(micro.Name("helloworld"),micro.Version("latest"),micro.Registry(etcd.NewRegistry(registry.Addrs("127.0.0.1:2379"),)),)serv.Init()//创建客户端hello_client := helloworld.NewHelloworldService("helloworld", serv.Client())//调用rpc服务rsp, err := hello_client.Call(context.TODO(), &helloworld.CallRequest{Name: "Tom"})if err != nil {fmt.Println(err)return}fmt.Println(rsp.GetMsg())
}

其实go-micro也可以通过命令行进行指定配置注册中心:

--registry=etcd
--registry_address=172.18.0.58:2379

但是生产过程一般不这样使用,会增加部署的复杂性。

小结

通过go-micro对微服务进行了简单的入门学习,go-micro框架的其它知识如: 服务发现、RPC客户/服务端、广播/订阅机制、API网关、链路追踪、超时容错、重试机制、负载均衡、等等待后续慢慢探索。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言实现通讯录

目录标题通讯录的介绍通讯录的准备通讯录的初始化通讯录的添加通讯录的打印通讯录的查找并打印通讯录的删除通讯录的排序通讯录的修改通讯录的改善动态通讯录的实现以文件的形式存储通讯录的介绍 通讯录想必大家都应该不陌生,我们在手机里面都会有通讯录里面记录着…

爬虫数据可视化前的环境准备(已安装python环境前提下)

一、requests请求库安装 在桌面右键打开终端输入:pip install requests 二、Beautiful Soup解析库安装 终端输入:Beautiful Soup 4安装:pip install bs4 lxml安装:pip install lxml三、matplotlib安装下载miniconda下载地址:https://docs.conda.io/en/latest/miniconda.ht…

CF102411 ICPC 2019-2020 North-Western Russia Regional Contest题解

A Accurate Movement 签到 M Managing Difficulties 签到 B Bad Treap 已知\(y=\sin(x)\),要求给出数组\(a[n]\),满足\(\forall i,j\in[1,n],a[i]\neq a[j]\),都有\(\sin(a[i])\neq \sin(a[j])\)。 这里又一种不怎么玄的写法,就是我们找到一个整数\(x\),\(sin(x)\)非常非常…

计算机的概述

计算机是由硬件系统(hardware system)和软件系统(software system)两部分组成的。硬件系统电源电源是电脑中不可缺少的供电设备,它的作用是将220V交流电转换为电脑中使用的5V、12V、3.3V直流电,其性能的好坏,直接影响到电脑其他设备工作的稳定性,进而会影响整机的稳定性…

AXI MCDMA 仿真与工作流程分析

说明 关于背景知识,可以先看 https://www.cnblogs.com/xingce/p/16386108.html 引用一段官方的说明,AXI MCDMA存在的主要目的是为了节约资源,我们想要使用这个模块的主要目的也是为了降低资源消耗,从而可以将系统部署在更小面积的FPGA芯片上,当然,具体的效果还需要进一步…

软件定义网络第一次作业,问题与解决方法

软件定义网络第一次作业,问题与解决方法 实验结果截图:实验总结: 1.若使用VMware Workstation Pro。 版本最好使用20.04版本,网络较稳定且兼容性好。且22.04版本可能无法安装Vmware tools。 2.遇到网络无法访问,可尝试换源。 3.若需要压缩包,可在虚拟机中下载,或从电脑拖…

【kali】一款黑客们都在使用的操作系统

💕💕💕 博主昵称:摆烂阳💕💕💕 🥰博主主页跳转链接 👩‍💻博主研究方向:web渗透测试 、python编程 📃 博主寄语:希望本篇文…

共享单车需求量登记分类及影响因素分析——基于机器学习模型的比较分析

全文链接:http://tecdat.cn/?p28519 作者:Yiyi Hu 近年来,共享经济成为社会服务业内的一股重要力量。作为共享经济的一个代表性行业,共享单车快速发展,成为继地铁、公交之后的第三大公共出行方式。但与此同时&…

【笔记】Python网络爬虫与信息提取

实战:总结知识点疫情爬虫Re正则表达式Re库的使用scrapy爬虫框架介绍Scrapy常用命令网络爬虫技术亮点:1、采用requests发送请求,获取响应2、采用BeautifulSoup4解析页面数据3、采用正则表达式 提取不规则字符串4、采用json模块处理json格式数据…

Java架构师常见基础面试题(附答案)

随着每日确诊病例人数的减少以及治愈患者人数增多,随着这场抗“疫”战争即将以胜利告终,接踵而来的是企业复工、金三银四求职高峰季的来临。有很多Java工程师想要把握住这个机会,实现升职加薪、成为Java架构师。但你知道企业在招聘面试时会提…

证件照换底色

阅读原文 如有侵权,请联系立即删除。 5种方法轻松给证件照换底色不同底色的证件照有着不同的用途。如白底的证件照一般用于身份证、港澳通行证等用途;而蓝底的证件照则用于工作证、简历等。例如我们需要提供蓝色背景的证件照,而手头只有白色背景的证件照,该怎么办呢?其实我…

开学季征文丨来大学已两年,我还有几个两年?

👋写在前面 大家好,我是陈橘又青,一名双非本科大学生,计算机科学与技术专业,最近因为疫情的原因,开学以来一直在家里上网课,也不是很忙,所以我想借着这次开学季征文活动,…

羧基化聚苯乙烯-二氧化硅复合材料/季铵化壳聚糖掺杂荷正电聚苯乙烯微球的制备步骤

今日小编为大家分享了羧基化聚苯乙烯-二氧化硅复合材料/季铵化壳聚糖掺杂荷正电聚苯乙烯微球的制备步骤,一起来看! 羧基化聚苯乙烯-二氧化硅复合超疏水涂层的制备方法,其特征在于包括如下步骤: (聚苯乙烯种子微球的制备;羧基修饰的聚苯乙烯微…

【控制】滑模控制,小例子,有程序有结果图

目录滑模控制的一点笔记和看法1【控制】滑动模型控制(Sliding Mode Control)2【控制】滑模控制,小例子,有程序有结果图3【控制】滑模控制,滑模面的选择文章目录1 问题描述2 滑模控制器设计2.1 滑模面选择2.2 控制器设计…

麻了,别再为难软件测试员了

前言 有不少技术友在测试群里讨论,近期的面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些测试工程师了。 这不,为了帮大家节约时…

hive中使用iceberg表格式时锁表总结

1. 原因 写入iceberg表时,会在hive_locks表中插入一条记录,表示该表正在被写入(hive中的独占锁)当数据插入完成后,会自动删除该条记录。 2. 出现场景 (1)在同时往同一个iceberg表中写入数据时,会出现Retrying task after failure: Waiting for lock之类的警告信息 如果有…

Docker 环境 Nacos2 MySQL8

本文介绍 docker 环境下安装并单机运行 Nacos2,使用 docker 环境下的 MySQL 8 存储数据。本文介绍 docker 环境下安装并单机运行 Nacos2,使用 docker 环境下的 MySQL 8 存储数据。 1 拉取镜像 1.1 创建目录 在硬盘上创建 nacos 的有关目录: mkdir -p /Users/yygnb/dockerMe/…

FPGA之旅设计99例之第十三例-----FPGA在OLED上显示DHT11数据

一. 简介 这是FPGA之旅设计的第十三例啦,本例是一个综合性的例程,基于OLED屏幕显示,和DHT11温湿度采集,将DHT11采集到的温湿度显示到OLED屏幕上。 在开始本例之前,先补充一下,在上例中,代码中…

Webpack 打包 - 14. html压缩

这里使用 html-webpack-plugin 插件压缩 html 文件。 1.文件结构 2.代码 index.html<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>webpack</title> </head> <body> <!--这里…