负载均衡是微服务远程调用里绕不开的问题。注册中心告诉你"有哪些服务实例",但真正每次调用哪个实例,需要负载均衡组件来决定。
一句话概括:Ribbon 是客户端负载均衡组件,Feign 发起远程调用时,底层可以通过 Ribbon 从注册中心拉到的实例列表中选择一个服务实例。

#mermaid-svg-EeExnBgBycbFvZM4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EeExnBgBycbFvZM4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EeExnBgBycbFvZM4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EeExnBgBycbFvZM4 .error-icon{fill:#552222;}#mermaid-svg-EeExnBgBycbFvZM4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EeExnBgBycbFvZM4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EeExnBgBycbFvZM4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EeExnBgBycbFvZM4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EeExnBgBycbFvZM4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EeExnBgBycbFvZM4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EeExnBgBycbFvZM4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EeExnBgBycbFvZM4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EeExnBgBycbFvZM4 .marker.cross{stroke:#333333;}#mermaid-svg-EeExnBgBycbFvZM4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EeExnBgBycbFvZM4 p{margin:0;}#mermaid-svg-EeExnBgBycbFvZM4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EeExnBgBycbFvZM4 .cluster-label text{fill:#333;}#mermaid-svg-EeExnBgBycbFvZM4 .cluster-label span{color:#333;}#mermaid-svg-EeExnBgBycbFvZM4 .cluster-label span p{background-color:transparent;}#mermaid-svg-EeExnBgBycbFvZM4 .label text,#mermaid-svg-EeExnBgBycbFvZM4 span{fill:#333;color:#333;}#mermaid-svg-EeExnBgBycbFvZM4 .node rect,#mermaid-svg-EeExnBgBycbFvZM4 .node circle,#mermaid-svg-EeExnBgBycbFvZM4 .node ellipse,#mermaid-svg-EeExnBgBycbFvZM4 .node polygon,#mermaid-svg-EeExnBgBycbFvZM4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EeExnBgBycbFvZM4 .rough-node .label text,#mermaid-svg-EeExnBgBycbFvZM4 .node .label text,#mermaid-svg-EeExnBgBycbFvZM4 .image-shape .label,#mermaid-svg-EeExnBgBycbFvZM4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-EeExnBgBycbFvZM4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EeExnBgBycbFvZM4 .rough-node .label,#mermaid-svg-EeExnBgBycbFvZM4 .node .label,#mermaid-svg-EeExnBgBycbFvZM4 .image-shape .label,#mermaid-svg-EeExnBgBycbFvZM4 .icon-shape .label{text-align:center;}#mermaid-svg-EeExnBgBycbFvZM4 .node.clickable{cursor:pointer;}#mermaid-svg-EeExnBgBycbFvZM4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EeExnBgBycbFvZM4 .arrowheadPath{fill:#333333;}#mermaid-svg-EeExnBgBycbFvZM4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EeExnBgBycbFvZM4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EeExnBgBycbFvZM4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EeExnBgBycbFvZM4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EeExnBgBycbFvZM4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EeExnBgBycbFvZM4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EeExnBgBycbFvZM4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EeExnBgBycbFvZM4 .cluster text{fill:#333;}#mermaid-svg-EeExnBgBycbFvZM4 .cluster span{color:#333;}#mermaid-svg-EeExnBgBycbFvZM4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EeExnBgBycbFvZM4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EeExnBgBycbFvZM4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-EeExnBgBycbFvZM4 .icon-shape,#mermaid-svg-EeExnBgBycbFvZM4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EeExnBgBycbFvZM4 .icon-shape p,#mermaid-svg-EeExnBgBycbFvZM4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EeExnBgBycbFvZM4 .icon-shape .label rect,#mermaid-svg-EeExnBgBycbFvZM4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EeExnBgBycbFvZM4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EeExnBgBycbFvZM4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EeExnBgBycbFvZM4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} order-service
发起远程调用
Feign 生成代理请求
Ribbon 获取服务名
向注册中心拉取
userservice 实例列表
本地缓存实例列表
根据负载均衡规则
选择一个实例
拼接真实 IP 和端口
发起 HTTP 调用
Ribbon 是服务端负载均衡还是客户端负载均衡
Ribbon 是客户端负载均衡。
这句话的意思是:不是由一个独立的负载均衡服务器统一转发请求,而是调用方自己拿到服务列表,然后在本地选择一个实例。
| 类型 | 选择实例的位置 | 例子 |
|---|---|---|
| 服务端负载均衡 | 请求先到负载均衡器,由负载均衡器转发 | Nginx、SLB |
| 客户端负载均衡 | 调用方本地拿实例列表并选择实例 | Ribbon |
微服务内部调用通常更适合客户端负载均衡,因为消费者本身就能通过注册中心拿到服务列表。
#mermaid-svg-NXHa1fuD8YnKJbLb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NXHa1fuD8YnKJbLb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NXHa1fuD8YnKJbLb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NXHa1fuD8YnKJbLb .error-icon{fill:#552222;}#mermaid-svg-NXHa1fuD8YnKJbLb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NXHa1fuD8YnKJbLb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NXHa1fuD8YnKJbLb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NXHa1fuD8YnKJbLb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NXHa1fuD8YnKJbLb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NXHa1fuD8YnKJbLb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NXHa1fuD8YnKJbLb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NXHa1fuD8YnKJbLb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NXHa1fuD8YnKJbLb .marker.cross{stroke:#333333;}#mermaid-svg-NXHa1fuD8YnKJbLb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NXHa1fuD8YnKJbLb p{margin:0;}#mermaid-svg-NXHa1fuD8YnKJbLb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NXHa1fuD8YnKJbLb .cluster-label text{fill:#333;}#mermaid-svg-NXHa1fuD8YnKJbLb .cluster-label span{color:#333;}#mermaid-svg-NXHa1fuD8YnKJbLb .cluster-label span p{background-color:transparent;}#mermaid-svg-NXHa1fuD8YnKJbLb .label text,#mermaid-svg-NXHa1fuD8YnKJbLb span{fill:#333;color:#333;}#mermaid-svg-NXHa1fuD8YnKJbLb .node rect,#mermaid-svg-NXHa1fuD8YnKJbLb .node circle,#mermaid-svg-NXHa1fuD8YnKJbLb .node ellipse,#mermaid-svg-NXHa1fuD8YnKJbLb .node polygon,#mermaid-svg-NXHa1fuD8YnKJbLb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NXHa1fuD8YnKJbLb .rough-node .label text,#mermaid-svg-NXHa1fuD8YnKJbLb .node .label text,#mermaid-svg-NXHa1fuD8YnKJbLb .image-shape .label,#mermaid-svg-NXHa1fuD8YnKJbLb .icon-shape .label{text-anchor:middle;}#mermaid-svg-NXHa1fuD8YnKJbLb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NXHa1fuD8YnKJbLb .rough-node .label,#mermaid-svg-NXHa1fuD8YnKJbLb .node .label,#mermaid-svg-NXHa1fuD8YnKJbLb .image-shape .label,#mermaid-svg-NXHa1fuD8YnKJbLb .icon-shape .label{text-align:center;}#mermaid-svg-NXHa1fuD8YnKJbLb .node.clickable{cursor:pointer;}#mermaid-svg-NXHa1fuD8YnKJbLb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NXHa1fuD8YnKJbLb .arrowheadPath{fill:#333333;}#mermaid-svg-NXHa1fuD8YnKJbLb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NXHa1fuD8YnKJbLb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NXHa1fuD8YnKJbLb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NXHa1fuD8YnKJbLb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NXHa1fuD8YnKJbLb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NXHa1fuD8YnKJbLb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NXHa1fuD8YnKJbLb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NXHa1fuD8YnKJbLb .cluster text{fill:#333;}#mermaid-svg-NXHa1fuD8YnKJbLb .cluster span{color:#333;}#mermaid-svg-NXHa1fuD8YnKJbLb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NXHa1fuD8YnKJbLb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NXHa1fuD8YnKJbLb rect.text{fill:none;stroke-width:0;}#mermaid-svg-NXHa1fuD8YnKJbLb .icon-shape,#mermaid-svg-NXHa1fuD8YnKJbLb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NXHa1fuD8YnKJbLb .icon-shape p,#mermaid-svg-NXHa1fuD8YnKJbLb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NXHa1fuD8YnKJbLb .icon-shape .label rect,#mermaid-svg-NXHa1fuD8YnKJbLb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NXHa1fuD8YnKJbLb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NXHa1fuD8YnKJbLb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NXHa1fuD8YnKJbLb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 服务端负载均衡
请求先到 Nginx / SLB
负载均衡器选择后端实例
转发请求
客户端负载均衡
消费者从注册中心拿实例列表
消费者本地选择实例
直接调用目标服务
两者的区别不在"有没有负载均衡",而在谁负责选择实例。服务端负载均衡由中间层选择;客户端负载均衡由调用方自己选择。
Ribbon 常见负载均衡策略
Ribbon 提供了不少规则,面试里不用每个都展开,但常见的要能说出差异。
| 策略 | 含义 |
|---|---|
RoundRobinRule |
轮询选择服务实例 |
RandomRule |
随机选择一个可用实例 |
WeightedResponseTimeRule |
根据响应时间计算权重,响应越慢权重越低 |
BestAvailableRule |
忽略短路实例,选择并发数较低的实例 |
RetryRule |
在指定时间内重试选择可用实例 |
AvailabilityFilteringRule |
过滤不健康实例,再选择连接数较小的实例 |
ZoneAvoidanceRule |
默认策略,综合区域可用性和实例可用性选择 |
项目里最常提的是轮询、随机、响应时间权重、区域敏感策略。
自定义负载均衡怎么做
常见有两种方式:全局配置和局部配置。
#mermaid-svg-0750uDFS9mMYexD7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0750uDFS9mMYexD7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0750uDFS9mMYexD7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0750uDFS9mMYexD7 .error-icon{fill:#552222;}#mermaid-svg-0750uDFS9mMYexD7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0750uDFS9mMYexD7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0750uDFS9mMYexD7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0750uDFS9mMYexD7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0750uDFS9mMYexD7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0750uDFS9mMYexD7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0750uDFS9mMYexD7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0750uDFS9mMYexD7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0750uDFS9mMYexD7 .marker.cross{stroke:#333333;}#mermaid-svg-0750uDFS9mMYexD7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0750uDFS9mMYexD7 p{margin:0;}#mermaid-svg-0750uDFS9mMYexD7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0750uDFS9mMYexD7 .cluster-label text{fill:#333;}#mermaid-svg-0750uDFS9mMYexD7 .cluster-label span{color:#333;}#mermaid-svg-0750uDFS9mMYexD7 .cluster-label span p{background-color:transparent;}#mermaid-svg-0750uDFS9mMYexD7 .label text,#mermaid-svg-0750uDFS9mMYexD7 span{fill:#333;color:#333;}#mermaid-svg-0750uDFS9mMYexD7 .node rect,#mermaid-svg-0750uDFS9mMYexD7 .node circle,#mermaid-svg-0750uDFS9mMYexD7 .node ellipse,#mermaid-svg-0750uDFS9mMYexD7 .node polygon,#mermaid-svg-0750uDFS9mMYexD7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0750uDFS9mMYexD7 .rough-node .label text,#mermaid-svg-0750uDFS9mMYexD7 .node .label text,#mermaid-svg-0750uDFS9mMYexD7 .image-shape .label,#mermaid-svg-0750uDFS9mMYexD7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-0750uDFS9mMYexD7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0750uDFS9mMYexD7 .rough-node .label,#mermaid-svg-0750uDFS9mMYexD7 .node .label,#mermaid-svg-0750uDFS9mMYexD7 .image-shape .label,#mermaid-svg-0750uDFS9mMYexD7 .icon-shape .label{text-align:center;}#mermaid-svg-0750uDFS9mMYexD7 .node.clickable{cursor:pointer;}#mermaid-svg-0750uDFS9mMYexD7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0750uDFS9mMYexD7 .arrowheadPath{fill:#333333;}#mermaid-svg-0750uDFS9mMYexD7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0750uDFS9mMYexD7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0750uDFS9mMYexD7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0750uDFS9mMYexD7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0750uDFS9mMYexD7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0750uDFS9mMYexD7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0750uDFS9mMYexD7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0750uDFS9mMYexD7 .cluster text{fill:#333;}#mermaid-svg-0750uDFS9mMYexD7 .cluster span{color:#333;}#mermaid-svg-0750uDFS9mMYexD7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0750uDFS9mMYexD7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0750uDFS9mMYexD7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-0750uDFS9mMYexD7 .icon-shape,#mermaid-svg-0750uDFS9mMYexD7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0750uDFS9mMYexD7 .icon-shape p,#mermaid-svg-0750uDFS9mMYexD7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0750uDFS9mMYexD7 .icon-shape .label rect,#mermaid-svg-0750uDFS9mMYexD7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0750uDFS9mMYexD7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0750uDFS9mMYexD7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0750uDFS9mMYexD7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 自定义负载均衡策略
全局生效
局部生效
定义 IRule 类型 Bean
所有服务调用使用该规则
在配置文件中指定
某个服务的规则类
只影响指定服务调用
方式一:定义 IRule Bean
java
@Bean
public IRule randomRule() {
return new RandomRule();
}
这种方式通常是全局生效,要小心影响范围。
方式二:配置某个服务的规则
yaml
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
这种方式是局部生效,只影响调用 userservice 时的负载均衡策略。
面试回答模板
可以这样答:
我们项目里的服务调用使用 Feign,Feign 底层会结合 Ribbon 做客户端负载均衡。消费者先从注册中心拉取服务实例列表,比如
user-service有多个实例,Ribbon 会根据负载均衡策略选择一个实例发起调用。常见策略有轮询、随机、按响应时间权重、区域敏感策略等。自定义策略可以实现IRule接口并配置成 Bean,也可以在配置文件里针对某一个服务单独指定规则。
小结
Ribbon 的重点不在"背策略名",而在理解调用链:
Feign 发起调用 -> Ribbon 获取服务列表 -> 负载均衡规则选实例 -> 拼真实地址 -> 发送请求。
把这条线讲清楚,策略名只是补充。