go微服务初探--基于GoMicro框架构建一个简单的微服务接口

本文详细介绍了GoMicro框架的组件结构,包括Registry、Selector、Broker、Transport等,并展示了如何使用go-micro搭建基于Consul的服务发现机制。通过实例演示了服务端和客户端的创建与交互,阐述了go-micro在微服务架构中的应用。
摘要由CSDN通过智能技术生成

在这里插入图片描述

go-micro是组件化的框架,每一个基础功能都是一个interface,方便扩展。同时,组件又是分层的,上层基于下层功能向上提供服务,整体构成go-micro框架。
go-micro的组件包括:

Registry组件:服务发现组件,提供服务发现机制:解析服务名字至服务地址。目前支持的注册中心有consul、etcd、 zookeeper、dns、gossip等
Selector组件:构建在Registry之上的客户端智能负载均衡组件,用于Client组件对Registry返回的服务进行智能选择。
Broker组件:发布/订阅组件,服务之间基于消息中间件的异步通信方式,默认使用http方式,线上通常使用消息中间件,如Kafka、RabbitMQ等。
Transport组件:服务之间同步通信方式。
Codec组件:服务之间消息的编码/解码。
Server组件:服务主体,该组件基于上面的Registry/Selector/Transport/Broker组件,对外提供一个统一的服务请求入口。
Client组件:提供访问微服务的客户端。类似Server组件,它也是通过Registry/Selector/Transport/Broker组件实现查找服务、负载均衡、同步通信、异步消息等功能。
所有以上组件功能共同构成一个go-micro微服务。

在这里插入图片描述

软件版本信息:
go version
go version go1.14.12 darwin/amd64

/**
bogon:helloworldweb JackMeng$ micro
micro      microv113  microv160  microv180  microv29   microv30
bogon:helloworldweb JackMeng$ micro


micro -version
micro version v2.8.0-dc57add-1590923188
*/

protoc-gen-micro&protoc-gen-go的安装:
go get -u github.com/micro/protoc-gen-micro
go get -u github.com/golang/protobuf/protoc-gen-go

consul集群:
192.168.0.50:8500
192.168.0.51:8500
192.168.0.52:8500

快速搭建集群命令:
端口列表:
8300 TCP Server RPC端口,用于Client与Server通信或Server与Server通信
8301 TCP/UDP 用于单数据中心所有Client的通信
8302 TCP/UDP 用于单个或多个数据中心之间Server信息同步
8400 TCP 所有agent都要使用的端口,用于处理从CLI来的RPC
8500 TCP 用于API接口或WEB UI访问
8600 TCP/UPD 用于解析dns查询

firewall-cmd --zone=public --add-port=8500/tcp --permanent
firewall-cmd --zone=public --add-port=8300/tcp --permanent
firewall-cmd --zone=public --add-port=8300/udp --permanent
firewall-cmd --zone=public --add-port=8302/tcp --permanent
firewall-cmd --zone=public --add-port=8302/udp --permanent
firewall-cmd --zone=public --add-port=8400/tcp --permanent
firewall-cmd --zone=public --add-port=8600/tcp --permanent
firewall-cmd --zone=public --add-port=8600/udp --permanent
firewall-cmd --zone=public --add-port=8301/tcp --permanent
firewall-cmd --zone=public --add-port=8301/udp --permanent


在三台机器上分别启动server
192.168.0.50启动consul
consul agent -server -bootstrap-expect=3 -data-dir=/usr/local/consul/data -node=consul01 -bind=192.168.0.50 -client=0.0.0.0 -datacenter=shenzhen -ui -rejoin
192.168.0.51启动consul
consul agent -server -bootstrap-expect=3 -data-dir=/usr/local/consul/data -node=consul02 -bind=192.168.0.51 -client=0.0.0.0 -datacenter=shenzhen -ui -rejoin
192.168.0.52启动consul
consul agent -server -bootstrap-expect=3 -data-dir=/usr/local/consul/data -node=consul03 -bind=192.168.0.52 -client=0.0.0.0 -datacenter=shenzhen -ui -rejoin



参数说明:

 server: 以server身份启动。默认是client
 bootstrap-expect:集群要求的最少server数量,当低于这个数量,集群即失效。
 data-dir:data存放的目录,更多信息请参阅consul数据同步机制
 node:节点id,集群中的每个node必须有一个唯一的名称。默认情况下,Consul使用机器的hostname
 bind:监听的ip地址。默认绑定0.0.0.0,可以不指定。表示Consul监听的地址,而且它必须能够被集群中的其他节点访问。Consul默认会监听第一个private IP,但最好还是提供一个。生产设备上的服务器通常有好几个网卡,所以指定一个不会出错
 client: 客户端的ip地址,0.0.0.0是指谁都可以访问(不加这个,下面的ui :8500无法访问)
 ui: 可以访问UI界面
-config-dir指定配置文件夹,Consul会加载其中的所有文件
-datacenter 指定数据中心名称,默认是dc1

consul常用命令:
agent Consul核心指令,运行agent来维护集群中的成员信息、注册信服务、查询响应、运行检查等功能
join 通知Consul agent 加入已存在的集群中
members 输出Consul agent 目前所有的成员及其状态,节点的状态有alive、left、failed三种
reload 重新加agent载配置文件
monnitor 连接运行的agent且显示最近的日志
leave 将agent关闭且移出所在的集群,此后agent不会再尝试加入集群中
version 打印consul版本信息


Consul agent 命令行选项:
-bootstrap-expect 在Server模式下提供数据中心内预期的Server数量。要么不设置该值,要么该值必须与集群中的其他Server一致。
                  当设置该值后,Consul一直等待到达指定的Server数目才会引导整个集群,该选项不能和-bootstrap 一起使用。

-bind 指定集群内部通信地址。群集中所有节点都可以访问该IP地址。默认是0.0.0.0时,如果主相有多个IPv4地址可用,Consul将在启动
       时并退出显示错误,这时需要指定对应的IP地址。

-config-dir 配置文件目录,该目录下所有以.json结尾的文件都会被加载生效

-dev 指定创建一个单节点的开发模式的Consule环境

-data-dir 指定一个目录用来存储agent的状态数据,所有的agent都需要该目录,特别是Server模式下更为重要,因此需要持久化集群的状态。

-dc 指定agent允许的datacenter的名称,默认是dc1

-join 启动时要加入的别一个agent地址,可以指定多个agent地址。如果consul无法加入任何指定的地址,则agent会启动失败。默认
      agent启动不会加入任何节点。

-node 节点在集群中的名称,名称在集群中必须是要唯一的。默认情况下为该计算机的主机名

-server 指定agent运行在Server模式,每个数据中心至少有一个server,官方推荐一个数据至少有3~5台Server最佳,但最多不要超过5个。



//项目结构:
mhelloworld/
├── client
│   └── client.go
├── go.mod
├── go.sum
├── main.go
└── proto
    └── hello
        ├── hello.pb.go
        ├── hello.pb.micro.go
        └── hello.proto
go.mod文件:
module "mhelloworld"

go 1.14

replace google.golang.org/grpc v1.27.0 => google.golang.org/grpc v1.26.0

require (
	github.com/golang/protobuf v1.4.3
	github.com/micro/go-micro v1.13.1  //v1.18.0 //1.18.0 registiry包默认是没有consul的定义
	google.golang.org/protobuf v1.25.0
)        
编写服务:

创建服务接口原型:

新建一个 hello 子目录,并在该 hello 子目录下创建一个 proto 目录,
然后在 proto 目录下创建一个服务接口原型文件 greeter.proto,我们通过 protobuf 定义服务接口如下:

mkdir hello && cd hello

vim hello.proto

syntax = "proto3";

package = "mhello";

service Greeter {
    rpc Hello(Request) returns (Response){};
}

message Request{
    string name = 1;
}

message Response{
    string ret = 1;
}

//通过接口原型生成代码
cd $GOPATH/src/mhelloworld
protoc --proto_path=. --micro_out=. --go_out=. proto/hello/hello.proto 



//编写服务端代码
package main

import (
	"context"
	"fmt"
	"github.com/micro/go-micro"
	//"github.com/micro/go-micro/registry"
	//"github.com/micro/go-micro/registry/consul"
	mhello "mhelloworld/proto/hello"
)

type Greeter struct{}

func (g *Greeter)Hello(ctx context.Context,req *mhello.Request, rsp *mhello.Response) error  {
	rsp.Ret = "你好,"+req.Name
	return nil
}

func main()  {

	//配置注册中心consul,如果没有配置中心的话,默认为mdns,后面探下etcd哈
	//reg := consul.NewRegistry(func(options *registry.Options) {
	//	options.Addrs = []string{"192.168.0.51:8500"}
	//})
	//创建新的服务
	service := micro.NewService(micro.Name("Greeter")) //micro.Registry(reg)

	//初始化
	service.Init()

	//注册处理器,调用Greeter服务接口处理request
	_= mhello.RegisterGreeterHandler(service.Server(),new(Greeter))

	//start service
	if err := service.Run(); err != nil {
		fmt.Println(err)
	}
}


//启动服务端
 go run main.go --registry=consul  --registry_address  192.168.0.51:8500 //指定consule集群地址
2020-12-15 09:35:08.653849 I | Transport [http] Listening on [::]:55815
2020-12-15 09:35:08.653981 I | Broker [http] Connected to [::]:55816
2020-12-15 09:35:08.654402 I | Registry [consul] Registering node: Greeter-13d1c387-b894-44f3-9c36-181f82ebae46

在这里插入图片描述

//编写客户端
mkdir client && cd client 
package main

import (
	"context"
	"fmt"
	"github.com/micro/go-micro"
	//"github.com/micro/go-micro/registry"
	//"github.com/micro/go-micro/registry/consul"
	mhello "mhelloworld/proto/hello"
)

func main()  {
	reg := consul.NewRegistry(func(options *registry.Options) {
		options.Addrs = []string{"192.168.0.51:8500"}
	})
	//make a service
	service := micro.NewService(micro.Name("Greeter.Client")) //micro.Registry(reg)

	//service init
	service.Init()

	//make a Greeter client
	greeter := mhello.NewGreeterService("Greeter",service.Client())


	//rpc remote call greeter's hello method
	rsp,err := greeter.Hello(context.Background(),&mhello.Request{Name: "柠檬君"})
	if err != nil {
		panic(err) //我这里直接panic处理了,下面没有什么业务逻辑代码
	}
	//print result
	fmt.Println("Ret",rsp.Ret)
}


//启动客户端
bogon:client JackMeng$ go run client.go  --registry=consul  --registry_address  192.168.0.51:8500
Ret 你好,柠檬君
bogon:client JackMeng$ go run client.go  --registry=consul  --registry_address  192.168.0.52:8500
Ret 你好,柠檬君
bogon:client JackMeng$ go run client.go  --registry=consul  --registry_address  192.168.0.50:8500
Ret 你好,柠檬君


基于GoMicro框架创建了第一个微服务接口完成了哈
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值