分布式系统如何寻址

分布式系统如何寻址?通过 RPC 框架 , 能够解决服务之间的跨网络通信问题 , 是微服务改造的基础 。
服务拆分之后 , 需要维护更多细粒度的服务 , 这样就涉及到 RPC 客户端服到服务端的 部署地址问题 , 如何维护? 这个时候就需要服务注册和发现 。
什么叫服务发现?所谓的服务发现 , 就是让服务调用方知道服务提供方的地址是啥? 比如 Ngnix 作为反向代理器 , 可以这样当请求到来时 , 可以通过 Nginx 知道应用服务器的地址是什么 。这个就叫:服务发现 。
Nginx 是怎么做服务发现的?答案:Nginx 是将应用服务器的地址放在配置文件中 。
vi nginx.conflocation/ {proxy_pass http://39.107.125.254:8080/springwebdemo/loginaction.do?op=tologin;proxy_set_header Host $host:8080;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Via "nginx";}#刷新配置./nginx -s reloadproxy_pass 配置的就是对应的 url .
配置proxy_pass代理转发时 , 如果在proxy_pass后面的url加/ , 表示绝对根路径;如果没有/ , 表示相对路径 , 把匹配的路径部分也给代理走 。
但是这样存在一些问题:

  • 需要扩容的时候 , 需要修改客户端配置 , 重启客户端进程 , 操作起来比较麻烦 。
  • 一旦一个服务器出故障 , 需要修改配置 , 然后重启 , 无法自动修复
  • RPC 服务端上线无法提前摘除流量 , 也就是说 , 发往服务端的请求流量依然会存在 , 客户端被重启服务端的请求还没有返回 , 会造成客户端请求失败 。
注册中心是怎么解决这些问题的?【分布式系统如何寻址】注册中心两点功能:
  • 提供服务地址的存储
  • 当存储内容发生变化时 , 可以将变更的内容推送给客户端
有了第二个内容 , 当需要紧急扩容时 , 当服务器发生故障时 , 需要快速摘除节点 , 都不用重启就可以实现 。
使用注册中心后,RPC 的通信:
分布式系统如何寻址

文章插图
 
  • 客户端与注册中心建立连接 , 告诉注册中心 。
  • 服务端向注册中心注册服务后 , 注册中心会将最新的服务注册信息通知给客户端 。
  • 客户端拿到服务端的地址之后 , 就可以向服务端发起调用请求 。
服务端的增加减少对于客户端来说是透明的 , 这样可以实现不重启客户端 , 就可以动态地变更服务节点 , 并且实现优雅关机 。
什么是优雅关机优雅关机的相对面是暴力关机 , 暴力停止服务 , 已经发送的请求还没有来得及处理 , 就被杀掉 , 这样会造成部分请求失败 。因此需要在服务端退出的时候 , 先停止掉流量 , 不再受理新的请求 , 当服务处理完之后再关闭 。




    推荐阅读