记一次对 ping 微服务的优化与改进

某产品的ping微服务由作者负责,该服务通过JSON接收信息进行ping操作,但返回的RTT值常比正常大。经分析,问题出在实现方式上。作者提出两个改进方案,一是提取Linux ping程序代码,二是使用DPDK,权衡后采用前者,使产品界面可显示RTT数值。

某产品采用微服务架构,而其中的一个 ping 微服务归我负责。

这个程序的功能很简单,提供一个 REST API,调用者把一些 IP 或域名还有一些其他必要的信息通过 JSON 的格式发给程序,程序通过发送、接收 ICMP 报文进行 ping 操作,将结果(RTT 等)返回给调用者。

它的问题在于,得到的 RTT 有时会明显比正常的值大一些。例如,客户拿自己电脑 ping 一个机器,得到 30 ms,但 ping 服务返回的 RTT 是 1029 ms。所以,在界面上,我们只给客户显示一个设备是否 ping 通,而不显示 RTT。

经过分析,问题出现在 ping 服务的实现上。在最开始,它的实现方式如下:

先在用户态记下一个时刻 t1,然后发送 ICMP,然后接收 ICMP,然后在用户态记下一个时刻 t2,求得 t1 和 t2 的差 dt,就得到 RTT。

这样做的问题在于,dt 并非真正的 RTT,而是真正的 RTT 加上用户态与内核态复制数据的时间,而且多出来的这段时间会随着所在机器的压力的增大而增大。

上司决定改进它。

我采取了两个独立的方案。

一是把 Linux 的 ping 程序(开源)的代码拿出来,提取出相关的部分,塞到我的程序中。Linux 自带的 ping 是可以获取到真实的 RTT的。尽管这样获取到的结果也会随着机器压力的增大而稍稍增大,但这是由计算机本身的特性决定的,任何程序都这样,而且,这样的差异程度是可以向客户解释的(就说这个机器负载压力大即可,还可以 SSH 到这个机器上让客户“眼见为实”)。

一是使用 DPDK。这样获取到的 RTT 更精确,但:
1)开发代价过大(相对这个功能而言),得不偿失;
2)有的客户用的服务器的 CPU 不是 Intel 的(DPDK 要求 Intel CPU);
3)上一种方案已经可以得到可解释的结果。

权衡一下,我采用第一种办法。

这样一来,产品界面就可以直接把 RTT 数值显示出来了。

转载于:https://my.oschina.net/jthmath/blog/3023906

### Golang 实现微服务架构的最佳实践 #### 选择合适的框架和支持库 为了高效地开发基于 Go 的微服务,开发者通常会选择一些成熟的框架来加速开发进程并提高代码质量。常见的框架有 `gin` 和 `echo` 这样的 Web 框架用于快速搭建 HTTP API 接口;还有像 `kit` 或者 `go-micro` 提供更全面的支持,包括但不限于服务发现、负载均衡等功能[^2]。 ```go package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run(":8080") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") } ``` #### 设计良好的API和服务契约 定义明确且稳定的 API 是确保不同微服务之间能够顺利协作的关键因素之一。应当遵循 RESTful 原则设计资源导向型接口,并保持版本控制以便于后续迭代更新而不会破坏现有客户端的应用程序逻辑[^3]。 #### 使用依赖注入模式管理组件关系 通过引入依赖注入容器可以有效降低模块间的耦合度,使得各个部分更加独立可测试。这不仅有助于提升系统的灵活性也方便后期维护工作。例如,在 Go 中可以通过第三方包如 `wire` 来实现自动化的依赖解析初始化操作。 #### 集成 Service Mesh 技术增强网络层能力 采用 Istio 等 service mesh 解决方案可以在不修改应用程序内部的情况下为整个分布式系统带来诸如流量治理、安全认证以及可观测性等方面的改进措施。这种方式让应用本身只需关心核心业务功能而不必过多涉及复杂的跨服调用细节。 #### 关注性能优化扩展性考量 考虑到高并发场景下的响应速度需求,合理利用 Goroutine 并发模型处理请求的同时也要注意避免过度创建线程造成资源浪费。另外还需重视数据库连接池配置、缓存机制设置等方面的工作以保障整体效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值