1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-23 20:02:22 +00:00

ch4-01 fix typo

This commit is contained in:
sfw 2019-08-27 21:40:00 +08:00
parent 9c475a3c17
commit c7ec446cb7
2 changed files with 4 additions and 4 deletions

View File

@ -60,13 +60,13 @@ func main() {
}
```
是通过rpc.Dial拨号RPC服务然后通过client.Call调用具体的RPC方法。在调用client.Call时第一个参数是用点号链接的RPC服务名字和方法名字第二和第三个参数分别我们定义RPC方法的两个参数。
是通过rpc.Dial拨号RPC服务然后通过client.Call调用具体的RPC方法。在调用client.Call时第一个参数是用点号链接的RPC服务名字和方法名字第二和第三个参数分别我们定义RPC方法的两个参数。
由这个例子可以看出RPC的使用其实非常简单。
## 4.1.2 更安全的RPC接口
在涉及RPC的应用中作为开发人员一般至少有三种角色是服务端实现RPC方法的开发人员其次是客户端调用RPC方法的人员最后也是最重要的是制定服务端和客户端RPC接口规范的设计人员。在前面的例子中我们为了简化将以上几种角色的工作全部放到了一起虽然看似实现简单但是不利于后期的维护和工作的切割。
在涉及RPC的应用中作为开发人员一般至少有三种角色是服务端实现RPC方法的开发人员其次是客户端调用RPC方法的人员最后也是最重要的是制定服务端和客户端RPC接口规范的设计人员。在前面的例子中我们为了简化将以上几种角色的工作全部放到了一起虽然看似实现简单但是不利于后期的维护和工作的切割。
如果要重构HelloService服务第一步需要明确服务的名字和接口
@ -101,7 +101,7 @@ func main() {
}
```
其中唯一的变化是client.Call的第一个参数用`HelloServiceName+".Hello"代替了"HelloService.Hello"。然而通过client.Call函数调用RPC方法依然比较繁琐同时参数的类型依然无法得到编译器提供的安全保障。
其中唯一的变化是client.Call的第一个参数用HelloServiceName+".Hello"代替了"HelloService.Hello"。然而通过client.Call函数调用RPC方法依然比较繁琐同时参数的类型依然无法得到编译器提供的安全保障。
为了简化客户端用户调用RPC函数我们在可以在接口规范部分增加对客户端的简单包装

View File

@ -93,7 +93,7 @@ Transfer/sec: 5.51MB
这里的`hello world`服务没有任何业务逻辑。真实环境的程序要复杂得多有些程序偏网络IO瓶颈例如一些CDN服务、Proxy服务有些程序偏CPU/GPU瓶颈例如登陆校验服务、图像处理服务有些程序瓶颈偏磁盘例如专门的存储系统数据库。不同的程序瓶颈会体现在不同的地方这里提到的这些功能单一的服务相对来说还算容易分析。如果碰到业务逻辑复杂代码量巨大的模块其瓶颈并不是三下五除二可以推测出来的还是需要从压力测试中得到更为精确的结论。
对于IO/Network瓶颈类的程序其表现是网卡/磁盘IO会先于CPU打满这种情况即使优化CPU的使用也不能提高整个系统的吞吐量只能提高磁盘的读写速度增加内存大小提升网卡的带宽来提升整体性能。而CPU瓶颈类的程序则是在存储和网卡未打满之前CPU占用率提前到达100%CPU忙于各种计算任务IO设备相对则较闲。
对于IO/Network瓶颈类的程序其表现是网卡/磁盘IO会先于CPU打满这种情况即使优化CPU的使用也不能提高整个系统的吞吐量只能提高磁盘的读写速度增加内存大小提升网卡的带宽来提升整体性能。而CPU瓶颈类的程序则是在存储和网卡未打满之前CPU占用率到达100%CPU忙于各种计算任务IO设备相对则较闲。
无论哪种类型的服务在资源使用到极限的时候都会导致请求堆积超时系统hang死最终伤害到终端用户。对于分布式的Web服务来说瓶颈还不一定总在系统内部也有可能在外部。非计算密集型的系统往往会在关系型数据库环节失守而这时候Web模块本身还远远未达到瓶颈。