![Kubernetes微服务实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/59/32436059/b_32436059.jpg)
3.5.4 通过客户端库调用API
现在可以通过HTTP REST API访问社交图谱服务了。以下是一个快速的本地演示。首先,我将启动Postgres DB(我有一个名为postgres的Docker镜像),该数据库将被用作数据存储,然后在service目录中运行服务本身,即delinkcious/svc/social_graph_service:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/053-2-i.jpg?sign=1738837433-PyxRuq0TX6WMvKSnB2sncLgk3h9bgNG8-0-ea0c6239ebc851b9844a942c0de17976)
让我们通过调用/follow端点添加几个关注/被关注关系。我将使用优秀的HTTPie工具(https://httpie.org/),说实话我认为它是curl的高级版本。但是,如果你愿意,也可以使用curl:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/053-3-i.jpg?sign=1738837433-yVb8kmoseGJfVVPQIklVtF7oXFKzCRPb-0-db3543fc441770c8961ce19be473be3a)
这两个调用使gigi用户关注了liat和guy用户,让我们使用/following端点进行验证:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/054-i.jpg?sign=1738837433-Gs1SXzNHCDaEV4jx4hFQ9TwELQNycMru-0-636f65e454970aed5366625e8d9ecc09)
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接口公开:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/054-2-i.jpg?sign=1738837433-NiUEa4k74LYHwpMWtDEhbCwfvrOVFTTw-0-7c13903a73bf5f3349514406a34fe392)
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/055-i.jpg?sign=1738837433-atI2g8E9XkyzBrEe2JT8aK6x4xtrUznO-0-9f8b036cc6a79cfc7e92b48e4e4c3e83)
在endpoints.go文件中定义了EndpointSet结构体。它包含端点本身(即函数),并且实现了SocialGraphManager方法,并将工作委托给端点的函数:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/055-2-i.jpg?sign=1738837433-aqpPEbUbNvp4d8aDlBWiVou6cFvSC6OT-0-261952f7e70fd704bc78c7798ca168db)
让我们看一下EndpointSet结构体中的GetFollowing()方法。它接受用户名作为字符串,然后使用填充了用户名的getByUserNameRequest调用端点。如果调用端点函数返回错误,它将退出执行。否则,它会进行类型断言以将泛型响应转换为getFollowing-Response结构体。如果错误字符串不为空,则会从中创建一个Go错误。最终,它会按照映射的形式返回以下用户:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/055-3-i.jpg?sign=1738837433-NsSDOf0vOOQlrUGpIqYV7ZpBlPTej7VT-0-a91b358ea69b0a4bb2dd845c584cd699)
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/056-i.jpg?sign=1738837433-jKLJRZpI9UgrfwP0ehKJlJ36OAcDdf2O-0-5d6e112c04dc19cbd8b417a6c3f986e8)