3.5.4 通过客户端库调用API
现在可以通过HTTP REST API访问社交图谱服务了。以下是一个快速的本地演示。首先,我将启动Postgres DB(我有一个名为postgres的Docker镜像),该数据库将被用作数据存储,然后在service目录中运行服务本身,即delinkcious/svc/social_graph_service:
让我们通过调用/follow端点添加几个关注/被关注关系。我将使用优秀的HTTPie工具(https://httpie.org/),说实话我认为它是curl的高级版本。但是,如果你愿意,也可以使用curl:
这两个调用使gigi用户关注了liat和guy用户,让我们使用/following端点进行验证:
JSON响应中错误为空,并且following映射按照预期列出了用户guy和liat。
尽管REST API很棒,但我们可以做得更好。与其强迫调用者了解服务的URL模式并对JSON负载编码和解码外,为什么不提供一个可以完成所有这些工作的客户端库呢?对于内部微服务来说尤其需要如此,因为内部微服务都使用少量语言(在许多情况下仅使用一种语言)相互通信。服务和客户端可以共享相同的接口,甚至可以共享某些通用类型。此外,Go kit包还支持与服务端端点非常相似的客户端端点,这可以直接转化为非常精简的端到端开发人员体验,你只需停留在编程语言空间即可。在大多数情况下,所有端点、传输、编码和解码都可以作为实现细节隐藏起来。
社交图谱服务提供了一个位于pkg/social_graph_client包中的客户端库。client.go文件类似于social_graph_service.go文件,负责在NewClient()函数中创建一组端点并返回SocialGraphManager接口。NewClient()函数将基本URL作为参数,然后使用Go kit的HTTP传输的NewClient()函数构造一组客户端端点。每个端点都需要一个URL、一个方法(这里是GET或POST)、一个request编码器和一个response解码器,这就像是服务的镜像。然后它将客户端端点分配给EndpointSet结构体,该端点可以通过SocialGraphManager接口公开:
在endpoints.go文件中定义了EndpointSet结构体。它包含端点本身(即函数),并且实现了SocialGraphManager方法,并将工作委托给端点的函数:
让我们看一下EndpointSet结构体中的GetFollowing()方法。它接受用户名作为字符串,然后使用填充了用户名的getByUserNameRequest调用端点。如果调用端点函数返回错误,它将退出执行。否则,它会进行类型断言以将泛型响应转换为getFollowing-Response结构体。如果错误字符串不为空,则会从中创建一个Go错误。最终,它会按照映射的形式返回以下用户: