为什么架构设计要禁用ip直连

一 什么是ip直连?

ip直连就是指我们的项目系统中,直接通过ip的方式去连接数据库等实例,如下图:

![image](images/Q08OHLpiOoJhXjoWXgkW8FDOISdrDA0ZNFN2cTxMms8.png)

这在我们开发的过程中是非常常见的,也是没有什么问题的,但是项目到达了线上,必然会产生很多的问题。

接下来我们看一个正确的用法:

![image](images/0cPA7Y9qUd_z27zQf9OnzJHY2s9kmQLdH5ZcOgEDeo0.png)

可以看到上图,之前的ip地址,都被替换成了域名或者字符串。

看了上述的描述,那么为什么我们要使用下面的方式呢?其实主要是为了解耦,使用ip的方式相当于为我们每一个项目绑定了对应的mysql服务器,如下图:

![image](images/2ygeWGdqU-qwNCz_5QhMEdDtApYrmX_O7GymljGhjmM.png)

假设我们现在有新的需求,原来这台sql服务器因为性能太差了,我们需要切换到一台更好的服务器,我们需要怎么做?

如果是之前ip直连的方式配置,我们只能将服务下线,更新代码,再打包重新发布(没有在线注册中心的时候),如下图:

这样显然是不科学的,那么我们要怎么去实现不需要重新修改也可以实现呢?主要有两种方式:

一 引入内部的DNS(域名解析服务器)

![image](images/ATVGt3gNOv6zz0do58aRkED6sKLgSpWSVJjejdSfDBc.png)

讲一下这里的流程:

  1. 将102绑定到mydb.com
  2. 切换新机器,只需要在DNS服务器将mydb.com解析的ip重新绑定为103
  3. tomcat访问此域名就会重定向到103服务器
    备注: 一个域名可以绑定多个ip,默认是轮询的机制访问

优点: 简单粗暴,安装简单

缺点: 无法做漂移,也就是当103挂掉了,请求是无法感知的,还会持续的发送请求到已经死掉的103服务器,多个ip只能做轮询的操作

二 加入注册中心 Nacos / Eureka / consoul

了解微服务的应该都知道注册中心,我们可以根据如下的图来设计:

![image](images/6L2zvnEw3C1xlkOmx6KrD606PYyxUtvXBM5vMrnmreA.png)

我们将数据库的各个实例注册到注册中心,这样当我们请求到达的时候,其流程如下:

  1. 将mysql集群注册到注册中心
  2. 请求根据配置的规则去请求获取当前负载均衡的节点
  3. 如果有新的加入或者旧的移除,只需要在注册中心移除或者重新注册即可(注册中心自带心跳可以判活,时间根据不同框架不同)

优点:

  1. 支持故障发现与故障转移
  2. 多种负载均衡规则

缺点:

  1. 架构复杂度增加
Last modification:July 5, 2022
If you think my article is useful to you, please feel free to appreciate