背景

go-micro给我们提供了一个非常便捷的方式来快速搭建微服务,而且并不需要提前系统了解micro,下面用一个简单的示例来快速实现一个服务。

创建Proto文件

因为我们要做微服务,那么就一定有服务端和客户端,这两个端通过什么格式进行内容传输,就涉及到了序列化,比较主流的序列化协议就是JSON和Protobuf,因为Protobuf是以二进制传输的,体积比较小,所以传输速度也相对较快,今天就以protobuf来进行演示。

下面使用Proto3的语法在protos目录创建文件greeter.proto,该文件定义一个名为Greeter的服务,以及对应的入参和出参。

syntax = "proto3";
package protos; service Greeter {
rpc Hello (Request) returns (Response) {
};
} message Request {
string name = 1;
} message Response {
string greeting = 2;
}

生成Go文件

生成Go文件之前,要先确保本机安装了protobuf,如果在终端输入protoc没有打印出帮助文档,那么就是未安装。

$ protoc
Usage: protoc [OPTION] PROTO_FILES
Parse PROTO_FILES and generate output based on the options given:
-IPATH, --proto_path=PATH Specify the directory in which to search for
imports. May be specified multiple times;
directories will be searched in order. If not
……

可以通过官方文档提示的命令进行安装。

go get github.com/micro/protoc-gen-micro/v2

安装成功之后,通过protoc命令将greeter.proto文件生成出对应的Go文件。

protoc --proto_path=./protos --micro_out=./protos --go_out=./protos ./protos/greeter.proto
  • --proto_path是greeter.proto文件所在的路径

  • --micro_out是生成.go文件的所在目录,该文件被用于创建服务

  • --go_out是生成.go文件的所在目录,该文件被用于做数据序列化传输

可以根据需求自定义输出目录,我这边输出到了protos目录,现在可以看到protos目录中生成了两个文件。

greeter.pb.go
greeter.pb.micro.go

实现服务

因为刚才已经通过protobuf定义了服务的接口,所以接下来需要实现对应的服务。

第一步,实现定义的服务接口

在生成的greeter.pb.micro.go文件中,可以看到我们greeter.proto文件中一个名为GreeterHandler的接口。

type GreeterHandler interface {
Hello(context.Context, *Request, *Response) error
}

我们需要先实现该接口,接下来创建server.go文件,定义结构体Greeter,并实现Hello方法。

type Greeter struct {
} func (g *Greeter) Hello(context context.Context, req *protos.Request, rsp *protos.Response) error {
rsp.Greeting = "Hello " + req.Name
return nil
}

Hello方法的后两个参数刚好就是我们前面所生成的greeter.bp.go文件中定义的Request和Response结构体。在方法内部,将请求参数的Name前面拼接上了Hello字符串,并且赋值给了Response的Greeting变量。

第二步,初始化服务

我们创建一个名为greeter的服务。

func main() {
service := micro.NewService(
micro.Name("greeter"),
)
service.Init()
}

调用micro.NewService方法来创建一个新的服务,该方法的参数是可变参数,可以通过micro中的一系列方法来设置服务的参数,本次示例中只配置服务的名称,记得在创建完服务后执行service.Init方法来初始化,micro版本建议使用v2。

第三步,注册服务到handler

func main() {
service := micro.NewService(
micro.Name("greeter"),
)
service.Init()
err := protos.RegisterGreeterHandler(service.Server(), new(Greeter))
if err != nil {
fmt.Println(err)
}
}

第四步,将服务跑起来

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

完整代码如下

package main

import (
"context"
"fmt" "github.com/micro/go-micro/v2"
) type Greeter struct {
} func (g *Greeter) Hello(context context.Context, req *Request, rsp *Response) error {
rsp.Greeting = "Hello " + req.Name
return nil
} func main() {
service := micro.NewService(
micro.Name("greeter"),
)
service.Init() err := protos.RegisterGreeterHandler(service.Server(), new(Greeter))
if err != nil {
fmt.Println(err)
} if err := service.Run(); err != nil {
fmt.Println(err)
}
}

现在将服务端跑起来。

$ go run server.go
2020-03-27 11:28:20 Starting [service] greeter
2020-03-27 11:28:20 Server [grpc] Listening on [::]:63763
2020-03-27 11:28:20 Registry [mdns] Registering node: greeter-8afc1183-a159-4473-a567-c13b83d1d75c

实现客户端

创建client.go文件

func main() {
service := micro.NewService(micro.Name("greeter.client"))
service.Init() greeter := protos.NewGreeterService("greeter", service.Client())
rsp, err := greeter.Hello(context.TODO(), &protos.Request{Name: "pingye"})
if err != nil {
fmt.Println(err)
}
fmt.Println(rsp.Greeting)
}

执行客户端文件,输出Hello pingye,执行成功。

$ go run client.go
Hello pingye

服务注册到了哪里?

在启动服务端的时候从终端输出的信息可以看出,有一个名为greeter的服务注册到了Registry

2020-03-27 11:28:20 Starting [service] greeter
2020-03-27 11:28:20 Server [grpc] Listening on [::]:63763
2020-03-27 11:28:20 Registry [mdns] Registering node: greeter-8afc1183-a159-4473-a567-c13b83d1d75c

Registry是go-micro的注册模块,作用是将服务注册到某个介质,以方便客户端使用。注册模块默认支持cache、consul、etcd、k8s、mdns、memory等多种介质,默认使用的是mdns。

var (
DefaultRegistry = NewRegistry() // Not found error when GetService is called
ErrNotFound = errors.New("service not found")
// Watcher stopped error when watcher is stopped
ErrWatcherStopped = errors.New("watcher stopped")
)

mdns主要用于在没有传统DNS服务器的情况下,在局域网中实现主机之间的发现与通讯,它遵从DNS协议。

Go语言组件示例开源库,欢迎star

https://github.com/EnochZg/golang-examples

go micro实战01:快速搭建服务的更多相关文章

  1. maven实战(01)_搭建开发环境

    一 下载maven 在maven官网上可下载maven:http://maven.apache.org/download.cgi 下载好后,解压.我的解压到了:D:\maven\apache-mave ...

  2. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-2.快速搭建SpringBoot项目,采用IDEA

    笔记 2.快速搭建SpringBoot项目,采用IDEA     简介:使用SpringBoot start在线生成项目基本框架并导入到IDEA中 参考资料:         IDEA使用文档    ...

  3. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-1.快速搭建SpringBoot项目,采用Eclipse

    笔记 1.快速搭建SpringBoot项目,采用Eclipse     简介:使用SpringBoot start在线生成项目基本框架并导入到eclipse中 1.站点地址:http://start. ...

  4. live-server 快速搭建服务

    原因: 在2018年3月2日偶然情况下听到一个大佬提起“live-server”这东西, 我就研究一下,用过的人才知道live-server多么方便... 功能: 当启动live-server服务的文 ...

  5. webservice - 使用JAX-WS注解的方式快速搭建服务端和客户端

    1.Define the interface import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebRe ...

  6. 实战丨快速搭建实时 Todo List 应用

    技术背景 借助云开发数据库的实时推送能力和云开发官方出品的前后端一体化部署工具CloudBase Framework,可以轻松搭建一个完整应用. 效果展示 示例地址:http://cloud.qinm ...

  7. 使用json-Server与postman快速模拟服务环境搭建

    在前后端分离的这种工作模式下,分工明确,各司其职.前端负责展示数据,后端提供数据.然而,在这种过程中对于接口的规范 需要提前制定好.例如根据规范提前模拟数据,这个时候就比较麻烦的.JsonServer ...

  8. Go语言micro之快速搭建微服务

    背景 go-micro给我们提供了一个非常便捷的方式来快速搭建微服务,而且并不需要提前系统了解micro,下面用一个简单的示例来快速实现一个服务. 创建Proto文件 因为我们要做微服务,那么就一定有 ...

  9. Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建

    Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建  作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Gerrit版本选择 1>.查看Gerrit官网 ...

随机推荐

  1. 数位dp对于状态描述与发现的一些感悟

    今天刷的数位dp 第一题看了题解以后知道了数位dp的基本板子,写数位dp的方式(运用记忆化递归的方法)已经基本固定. 那么接下来的难点主要还是对于题目描述的问题,如何抽象成dp中的状态.就今天刷的题来 ...

  2. runR

    Linux下使用R 运行linux下的R脚本 编写R文件 新建后缀名为R的文件 写入R程序 在脚本首行加入 1 运行R文件 这里有两种方式 大专栏  runR进入R的环境">进入R的环 ...

  3. MyEclipse下Spring+Hibernate整合

    目前,SSH(Struts+Spring+Hibernate)是Web开发的一种常用框架组合,Struts实现了MVC,Hibernate实现了关系对象映射,Spring实现了基于Bean的配置管理. ...

  4. Mybatis调用存储过程报错

    Mybatis调用存储过程 贴码 123456 Error querying database. Cause: java.sql.SQLException: User does not have ac ...

  5. PS4游戏将登陆PC:一曲属于主机的悲歌

    ​​ ​ 曾经,红白机.PS游戏机等成为一代人难以磨灭的记忆.而随后的索尼PS3.微软Xbox 360.任天堂Wii U等,也称霸了次时代主机时代,成为家庭娱乐的中心.但面对着依托于PC和智能移动终端 ...

  6. React Native Build Apk

    1 React Native安卓项目打包APK 1.1 产生签名的key 先通过keytool生成key 1 keytool -genkey -v -keystore demo-release-key ...

  7. Spring aop(1)--- 寻找切面和代理对象执行流程源码分析

    1.基于注解,首先我们是通过@EnableAspectJAutoProxy()这个注解开起AOP功能,这个注解会导入AspectJAutoProxyRegistrar组件从而将AnnotationAw ...

  8. sql服务器第5级事务日志管理的阶梯:完全恢复模式下的日志管理

    sql服务器第5级事务日志管理的阶梯:完全恢复模式下的日志管理 原文链接http://www.sqlservercentral.com/articles/Stairway+Series/73785/ ...

  9. PyCharm+git+码云实现project版本控制

    1.安装git https://git-scm.com/downloads 2.PyCharm中配置 3.申请码云 4.PyCharm中安装码云插件 右键选择,重启Pycharm. 重新打开PyCha ...

  10. CSS单位计算总结

    CSS单位总结 公共部分css body { background-color: #000; color: skyblue; margin: 0; padding: 0; } body>div& ...