|
| 1 | +# 服务发现的背景 |
| 2 | + |
| 3 | + |
| 4 | +## 从单体到微服务 |
| 5 | + |
| 6 | +现在基本上已经没有单体应用的,基本上都是微服务架构。 |
| 7 | + |
| 8 | + |
| 9 | + |
| 10 | +## 微服务架构的根本问题 |
| 11 | + |
| 12 | +微服务架构有着两个根本的问题。 |
| 13 | + |
| 14 | +在微服务架构中,又着两个角色,服务的提供者:**服务端**,服务的使用者:**消费端/客户端** |
| 15 | + |
| 16 | +第一个问题:一个服务可能部署了多个节点,那么客户端如何得知都有哪些节点呢? |
| 17 | + |
| 18 | +第二个问题:一个请求最终肯定是由一个服务端处理的,那个多个服务端的情况下,客户的请求到底由谁处理呢? |
| 19 | + |
| 20 | + |
| 21 | + |
| 22 | +由此引出两个技术: **服务发现** 和 **负载均衡** |
| 23 | + |
| 24 | +> 这里的负载均衡值得是客户端的负载均衡 |
| 25 | +
|
| 26 | + |
| 27 | +## 解决办法 |
| 28 | + |
| 29 | +通过代理的方式,客户端可以找到服务端。 |
| 30 | + |
| 31 | + |
| 32 | + |
| 33 | +根据代理组件存放的位置不同,衍生出很多不同的模式 |
| 34 | + |
| 35 | + |
| 36 | +### 传统集中式代理 |
| 37 | + |
| 38 | +代理放到消费者和服务端中间,集中独立部署的。 |
| 39 | + |
| 40 | + |
| 41 | + |
| 42 | +这种模式下如何进行服务端的发现呢? |
| 43 | + |
| 44 | +一般的情况下,是由专门的人员比如专门的运维团队来进行管理,当后端微服务上线的时,将服务的信息添加到Nginx中。 |
| 45 | + |
| 46 | +客户端如何发现服务呢? |
| 47 | + |
| 48 | +通过DNS域名解析,客户端首先找到代理,然后在解析运维人员之前配置的信息,路由到服务器上 |
| 49 | + |
| 50 | +> 比如user.com分配到UserServer上面。 |
| 51 | +
|
| 52 | +中间的代理有两种,一种是硬件的代理F5,另一种是软件的代理,比如Nginx |
| 53 | + |
| 54 | + |
| 55 | +### 服务注册中心+客户端嵌入式代理 |
| 56 | + |
| 57 | +代理挪到客户端。一般需要注册中心配合使用。 |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | +后端的服务自注册到注册中心上面,客户端可以自发现有哪些服务,然后通过负载均衡的策略,把请求路由到正确的服务上。 |
| 62 | + |
| 63 | +这种方式会受客户端语言的影响。 |
| 64 | + |
| 65 | +### 主机独立进程代理 |
| 66 | + |
| 67 | +代理即不放在服务端也不放在客户端的代码里,而是在每个客户端的主机上,部署一个进程。 |
| 68 | + |
| 69 | +当前主机的多个客户端,通过代理进程,可以访问服务端。 |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | + |
| 74 | +### 上面三种模式比对 |
| 75 | + |
| 76 | + |
| 77 | + |
| 78 | + |
| 79 | + |
| 80 | +## 集中代理模式的两个变体 |
| 81 | + |
| 82 | +代理模式是目前比较主流也是非常好用的模式。 |
| 83 | + |
| 84 | +### 变体1 |
| 85 | + |
| 86 | +服务的注册不用运维人员注册,而是通过注册中心实现自注册和自发现。 |
| 87 | + |
| 88 | + |
| 89 | + |
| 90 | +### 变体2 |
| 91 | + |
| 92 | +同样使用注册中心,但是不适用自注册的功能。因为自注册的话需要服务进程引入注册中心的客户端,这样才能实现自注册。 |
| 93 | + |
| 94 | + |
| 95 | + |
| 96 | +这种方式,不需要引入每个服务进程都引入注册中心的客户端程序。 |
| 97 | + |
| 98 | +而是在注册中心上面提供一个页面或者接口,可以手动的添加注册后端服务。注册中心可以定期检查后端服务。 |
0 commit comments