A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 播妞 程序媛   /  2018-6-13 17:10  /  2169 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本次我们将要分享的是Go语言构建微服务一站式解决方案(下),具体会讲到什么内容呢?跟着播妞一起来看看吧~Consul(基于Go的服务发现工具)

Consul简介Consul是什么
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。它具备以下特性 :
l service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
l health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
l key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
l multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
什么是服务发现
微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:
图中,客户端的一个接口,需要调用服务A-N。客户端必须要知道所有服务的网络位置的,以往的做法是配置是配置文件中,或者有些配置在数据库中。这里就带出几个问题:
· 需要配置N个服务的网络位置,加大配置的复杂性
· 服务的网络位置变化,都需要改变每个调用者的配置
· 集群的情况下,难以做负载(反向代理的方式除外)
与之前一张不同的是,加了个服务发现模块。图比较简单,这边文字描述下。服务A-N把当前自己的网络位置注册到服务发现模块(这里注册的意思就是告诉),服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问的了(这就是健康检查)。客户端在调用服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式是不是就可以解决上面的问题了呢?客户端完全不需要记录这些服务网络位置,客户端和服务端完全解耦!
下面的例子有可能更有助于我们理解服务发现的形式:
例如邮递员去某公司一栋大楼投递快件,向门卫询问员工甲在哪一个房间,门卫拿起桌上的通讯录查询,告知邮递员员工甲在具体什么位置。假如公司来了一个员工乙,他想让邮递员送过来,就要先让门卫知道自己在哪一个房间,需要去门卫那边登记,员工乙登记后,当邮递员向门卫询问时,门卫就可以告诉邮递员员工乙的具体位置。门卫知道员工乙的具体位置的过程就是服务发现,员工乙的位置信息可以被看作服务信息,门卫的通讯录就是上文中提到的数据交换格式,此例中员工乙就是上文的已方,门卫就是服务发现的提供者。
以调试模式启动consul:
[AppleScript] 纯文本查看 复制代码
$ conusl agent –dev –bind=0.0.0.0
go_micro(基于Go的微服务框架)依赖

我们需要一个发现服务器,这里 micro默认使用的 Consul,我们这里用之前安装部署好的 consul,用来做 go的micro服务发现
protoBuf作为Server端和Client端的数据交换格式。
下载 micro

go get github.com/micro/micro
hello micro

赶紧完成一个go_micro的微服务吧 ~
micro为我们提供的微服务框架如下

这里面有很多角色, Micro API, Customer API, Customer Service等等 ...
其中 Micro API是micro给我们提供的一个工具,是通过 RPC调用我们模块的 API和做一些负载均衡的作用,实际上 Customer API, Customer Service是一组微服务, Customer API收到 Micro API转发的请求后,将 RESTful转换成 protobuf通过 gRPC调用发送给 Customer Service做服务处理,然后又将返回 protobuf数据转换成 RESTful返回给用户。
在微服务架构中一般称 API为RPC GateWay

GRPC Gateway

此指南帮助我们使用 go-micro微服务中的 grpc gateway。

grpc-gateway是一个 protoc的一个插件。它基于 gRPC服务定义,并且提供一

个将 RESTful JSON API转换成 gRPC协议的反响代理服务。

我们使用 go-grpc去完成后台服务, go-grpc是一个为 client/server将go-micro

和gRPC结合的一个包裹。

代码案例

examples/grpc.

Create service proto-创建服务端protobuf

这里,我们的proto文件定义如下:
[AppleScript] 纯文本查看 复制代码
syntax = "proto3";[/size][/font][/align][font=微软雅黑][size=3]
[align=left]service Greeter {[/align]
[align=left]rpc Hello(HelloRequest) returns (HelloResponse) {}[/align]
[align=left]}[/align]
[align=left]message HelloRequest {[/align]
[align=left]string name = 1;[/align]
[align=left]}[/align]
[align=left]message HelloResponse {[/align]
[align=left]string greeting = 2;[/align]
[align=left]}
Write the service

1、 实现自定义接口
2、 初始化一个微服务
3、 注册Greeter 句柄
4、 启动服务
[AppleScript] 纯文本查看 复制代码
package main[/size][/font][/align][font=微软雅黑][size=3][align=left]import ([/align]
[align=left]"context"[/align]
[align=left]"fmt"[/align]
[align=left]micro "github.com/micro/go-micro"[/align]
[align=left]proto "github.com/micro/examples/service/proto"[/align]
[align=left])[/align]

[align=left]type Greeter struct{}[/align]

[align=left]func (g *Greeter) Hello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {[/align]
[align=left]rsp.Greeting = "Hello " + req.Name[/align]
[align=left]return nil[/align]
[align=left]}[/align]

[align=left]func main() {[/align]
[align=left]// Create a new service. Optionally include some options here.[/align]
[align=left]service := micro.NewService([/align]
[align=left]micro.Name("greeter"),[/align]
[align=left])[/align]

[align=left]// Init will parse the command line flags.[/align]
[align=left]service.Init()[/align]

[align=left]// Register handler[/align]
[align=left]proto.RegisterGreeterHandler(service.Server(), new(Greeter))[/align]

[align=left]// Run the server[/align]
[align=left]if err := service.Run(); err != nil {[/align]
[align=left]fmt.Println(err)[/align]
[align=left]}[/align]
[align=left]}

Run service

[AppleScript] 纯文本查看 复制代码
go run examples/service/main.go

Output
[AppleScript] 纯文本查看 复制代码
2016/03/14 10:59:14 Listening on [::]:50137[/size][/font][/color][/align]
[color=#24292e][size=3][align=left]2016/03/14 10:59:14 Broker Listening on [::]:50138[/align]
[font=微软雅黑][align=left]2016/03/14 10:59:14 Registering node: greeter-ca62b017-e9d3-11e5-9bbb-68a86d0d36b6

Define a client-编写客户端

下面是客户端访问微服务的代码:
[AppleScript] 纯文本查看 复制代码
package main[/size][/font][/align]
[font=微软雅黑][size=3]
[align=left]import ([/align]
[align=left]"context"[/align]
[align=left]"fmt"[/align]

[align=left]micro "github.com/micro/go-micro"[/align]
[align=left]proto "github.com/micro/examples/service/proto"[/align]
[align=left])[/align]


[align=left]func main() {[/align]
[align=left]// Create a new service. Optionally include some options here.[/align]
[align=left]service := micro.NewService(micro.Name("greeter.client"))[/align]
[align=left]service.Init()[/align]

[align=left]// Create new greeter client[/align]
[align=left]greeter := proto.NewGreeterClient("greeter", service.Client())[/align]

[align=left]// Call the greeter[/align]
[align=left]rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})[/align]
[align=left]if err != nil {[/align]
[align=left]fmt.Println(err)[/align]
[align=left]}[/align]

[align=left]// Print response[/align]
[align=left]fmt.Println(rsp.Greeting)[/align]
[align=left]}
Run the client

[AppleScript] 纯文本查看 复制代码
go run client.go
Output
[AppleScript] 纯文本查看 复制代码
Hello John
QA
1 Go语言除了能开发区块链还能开发哪些领域
Go语言作为一个开发效率高,天生支持高并发,同时又具备媲美C语言性能的语言,在未来一定是后端开发语言的最具有潜力的编程语言。目前很多企业的服务器架构也逐步在用Go语言重构。
Go语言目前主要涉及的领域有:高并发服务器开发、分布式开发、微服务开发、Web框架及应用开发、和区块链开发。
高并发服务器开发:
不用解释了,Go天生语法的并发支持和Goroutine协程的轻量级与调度器的优化,目前很多游戏公司主要服务开发语言最优选择一定是Golang.
分布式开发:
我们知道的两个分布式虚拟化明星:Docker、Kubernetes他们的开发实现语言都是Go语言。有人说是Docker捧红了分布式,实际上很多人并不知道,是Go捧红了Docker生态。
微服务开发:
Go的微服务框架居多,加上Docker对go的支持最好,所以go也是微服务开发的首选语言。
go的微服务框架有go-micro,go-kit。服务发现有go实现的Consul。微服务通信的RPC机制有google实现的gRPC,其中通信协议protobuf也是对go无缝衔接的。
Web框架及应用开发:
对于web,大家可能会想到java的Spring、python的Django。但是可能并不知道Go的Beego和Gin、Echo等web框架正在逐步侵蚀大型互联网公司。很多公司已经通过Beego来搭建web后台服务,因为Go的天生网络处理的流畅,让开发者在构建大型web的时候,更加喜欢了Go语言。
区块链开发:
我们所遇见的区块链应用项目或者相关框架几乎都是Go语言实现,或者对Go的支持最好。主流的Hyperledger Fabric 和以太坊也是目前企业正在大规模使用的开发框架。go的这种开发效率高和高性能,对于区块链这种注重网络通信和信息安全的技术,更是不可或缺的。
2 Go语言难易程度如何

Go语言学习起来完全可以零基础入门。Google在创建Go语言的最初定义为:简单快乐的开发高性能系统语言。可见go语言并不是很难。
本次关于【Go语言构建微服务一站式解决方案】已经讲解完毕,感兴趣的大家可以随时关注论坛和咱们的版块,会不定时更新内容哦~另外关于Go语言与区块链如果大家想要了解的话,也可加添加播妞QQ3414556270进行详询。

1 个回复

倒序浏览
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马