![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=1738831932-tof0SbuJESbUOTDif51geFOfQRJNDTQL-0-fabfd20828f4bb1705e195e47636ce6d)
让我们通过调用/follow端点添加几个关注/被关注关系。我将使用优秀的HTTPie工具(https://httpie.org/),说实话我认为它是curl的高级版本。但是,如果你愿意,也可以使用curl:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/053-3-i.jpg?sign=1738831932-Ah0sCqYPth1yFCq4cZ93N7qw31EjwfdG-0-937812415fad0387904c9884b2ee9658)
这两个调用使gigi用户关注了liat和guy用户,让我们使用/following端点进行验证:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/054-i.jpg?sign=1738831932-f6TWG6wjXgyi37NxRFLunQEHB57ZPYSG-0-370288dad3056f1ee27d7d2932d0b99f)
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=1738831932-u0WkIbQz4iT48OBG47074NR6Z3agRrFs-0-41310cc5d910fa2d5b00bd0aee81a010)
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/055-i.jpg?sign=1738831932-fh2ll1Cnmtz0t46INh9hzR5ycjJa1uGZ-0-0b2f7283280c161309e2b85a4fc33502)
在endpoints.go文件中定义了EndpointSet结构体。它包含端点本身(即函数),并且实现了SocialGraphManager方法,并将工作委托给端点的函数:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/055-2-i.jpg?sign=1738831932-tVk3NhGl6LPmO8fZzE2dKiklIMrPwr4V-0-a2c7eab49094ab5016127032cd443fd6)
让我们看一下EndpointSet结构体中的GetFollowing()方法。它接受用户名作为字符串,然后使用填充了用户名的getByUserNameRequest调用端点。如果调用端点函数返回错误,它将退出执行。否则,它会进行类型断言以将泛型响应转换为getFollowing-Response结构体。如果错误字符串不为空,则会从中创建一个Go错误。最终,它会按照映射的形式返回以下用户:
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/055-3-i.jpg?sign=1738831932-BvE7ZI7ksYvY9C04mKNeKcyPyJWMSTT2-0-aa9089d76709c1a5b1ade87190c3d4bb)
![](https://epubservercos.yuewen.com/0B378C/17517093206689306/epubprivate/OEBPS/Images/056-i.jpg?sign=1738831932-TNQR4GDX2irRnpYFWk3mXph3PgWxn0sa-0-a09c6a53be58c92b91ada6c563998377)