@@ -71,7 +71,7 @@ bool RuleRouterCluster::CalculateRouteResult(std::vector<RuleRouterSet*>& result
71
71
if (!result.empty ()) { // 找不到了不用降级
72
72
break ;
73
73
}
74
- // 已经降级寻找了一次,不需要再找了
74
+ // 已经降级寻找了一次,不需要再找了
75
75
if (downgrade) {
76
76
break ;
77
77
}
@@ -85,21 +85,21 @@ bool RuleRouterCluster::CalculateRouteResult(std::vector<RuleRouterSet*>& result
85
85
}
86
86
87
87
void RuleRouterCluster::CalculateSubset (ServiceInstances* service_instances, Labels& labels) {
88
- // 检查最高优先级的subset,状态健康则返回其中实例,如果同优先级的有多个subset,则根据权重计算返回实例
89
- // 如果最高优先级subset不健康,那么按照优先级遍历检查其他subset,如果有健康的,返回其中实例,如有多个同优先级的subset则按权重计算
90
- // 若无健康的低优先级subset,则无论最高优先级subset健康与否,都返回其中实例
91
- // 如果是熔断半开状态,要支持按比例放量
92
- // PRESERVED:熔断器维持,节点处于保守状态,此时只能正常接收自身流量,不可接受别的集群降级流量
93
-
94
- // 为空,直接返回
95
- // 剔除不健康的subset
88
+ // 检查最高优先级的subset,状态健康则返回其中实例,如果同优先级的有多个subset,则根据权重计算返回实例
89
+ // 如果最高优先级subset不健康,那么按照优先级遍历检查其他subset,如果有健康的,返回其中实例,如有多个同优先级的subset则按权重计算
90
+ // 若无健康的低优先级subset,则无论最高优先级subset健康与否,都返回其中实例
91
+ // 如果是熔断半开状态,要支持按比例放量
92
+ // PRESERVED:熔断器维持,节点处于保守状态,此时只能正常接收自身流量,不可接受别的集群降级流量
93
+
94
+ // 为空,直接返回
95
+ // 剔除不健康的subset
96
96
if (data_.empty ()) {
97
97
return ;
98
98
}
99
99
std::map<uint32_t , std::vector<RuleRouterSet*> >::iterator data_it = data_.begin ();
100
100
std::vector<RuleRouterSet*>& cluster_highest_priority = data_it->second ;
101
101
102
- // 通过service_instances直接获取熔断set信息
102
+ // 通过service_instances直接获取熔断set信息
103
103
std::map<std::string, SetCircuitBreakerUnhealthyInfo> circuit_breaker_sets;
104
104
if (service_instances->GetService () == nullptr ) {
105
105
POLARIS_LOG (LOG_ERROR, " Service member is null" );
@@ -109,20 +109,20 @@ void RuleRouterCluster::CalculateSubset(ServiceInstances* service_instances, Lab
109
109
110
110
std::vector<RuleRouterSet*> cluster_halfopen;
111
111
if (GetHealthyAndHalfOpenSubSet (cluster_highest_priority, circuit_breaker_sets, cluster_halfopen, labels)) {
112
- // 如果有半开的,考虑降级
112
+ // 如果有半开的,考虑降级
113
113
for (std::vector<RuleRouterSet*>::iterator set_it = cluster_halfopen.begin (); set_it != cluster_halfopen.end ();
114
114
++set_it) {
115
115
RuleRouterSet* downgrade = GetDownGradeSubset (circuit_breaker_sets, labels);
116
116
if (downgrade) {
117
- // 根据半开放量率计算比例
117
+ // 根据半开放量率计算比例
118
118
float pass_rate = 1.0 ;
119
119
SetCircuitBreakerUnhealthyInfo* breaker_info = nullptr ;
120
120
GetSetBreakerInfo (circuit_breaker_sets, (*set_it)->subset , labels, &breaker_info);
121
121
if (breaker_info != nullptr ) {
122
122
pass_rate = breaker_info->half_open_release_percent ;
123
123
}
124
124
125
- // 修改权重
125
+ // 修改权重
126
126
(*set_it)->weight_ *= pass_rate;
127
127
downgrade->weight_ *= (1 - pass_rate);
128
128
cluster_highest_priority.push_back (*set_it);
@@ -133,8 +133,8 @@ void RuleRouterCluster::CalculateSubset(ServiceInstances* service_instances, Lab
133
133
}
134
134
return ;
135
135
}
136
- // 没有
137
- // 降级寻找,只找健康的set,否则返回最高优先级set
136
+ // 没有
137
+ // 降级寻找,只找健康的set,否则返回最高优先级set
138
138
++data_it;
139
139
for (; data_it != data_.end (); ++data_it) {
140
140
if (GetHealthySubSet (data_it->second , circuit_breaker_sets, labels)) {
@@ -143,14 +143,14 @@ void RuleRouterCluster::CalculateSubset(ServiceInstances* service_instances, Lab
143
143
}
144
144
145
145
if (data_it == data_.end ()) {
146
- // 依旧取最高优先级的实例,此处什么也不用做
146
+ // 依旧取最高优先级的实例,此处什么也不用做
147
147
return ;
148
148
} else {
149
- // 找到一个可替换的优先级subset组
149
+ // 找到一个可替换的优先级subset组
150
150
std::map<uint32_t , std::vector<RuleRouterSet*> > data_tmp;
151
151
data_tmp[data_it->first ].swap (data_it->second );
152
152
data_.swap (data_tmp);
153
- // 释放Set指针的内存
153
+ // 释放Set指针的内存
154
154
for (std::map<uint32_t , std::vector<RuleRouterSet*> >::iterator tmp_it = data_tmp.begin (); tmp_it != data_tmp.end ();
155
155
++tmp_it) {
156
156
const std::vector<RuleRouterSet*>& set_data = tmp_it->second ;
@@ -174,15 +174,15 @@ void RuleRouterCluster::GetSetBreakerInfo(std::map<std::string, SetCircuitBreake
174
174
std::string subset_key = subset.GetSubInfoStrId () + " #" + labels.GetLabelStr ();
175
175
std::map<std::string, SetCircuitBreakerUnhealthyInfo>::iterator subset_it = circuit_breaker_sets.find (subset_key);
176
176
if (subset_it != circuit_breaker_sets.end ()) {
177
- // 接口级熔断
177
+ // 接口级熔断
178
178
*breaker_info = &subset_it->second ;
179
179
}
180
180
}
181
181
182
182
RuleRouterSet* RuleRouterCluster::GetDownGradeSubset (
183
183
std::map<std::string, SetCircuitBreakerUnhealthyInfo>& circuit_breaker_sets, Labels& labels) {
184
- // 为空或者只有一个优先级组,都直接返回
185
- // 寻找一个健康的降级subset
184
+ // 为空或者只有一个优先级组,都直接返回
185
+ // 寻找一个健康的降级subset
186
186
if (data_.size () <= 1 ) {
187
187
return nullptr ;
188
188
}
@@ -197,7 +197,7 @@ RuleRouterSet* RuleRouterCluster::GetDownGradeSubset(
197
197
cbs = breaker_info->status ;
198
198
}
199
199
if (!(*it)->isolated_ && cbs == kCircuitBreakerClose ) {
200
- // 要从vector中移除,免得重复释放,用sharedptr比较好
200
+ // 要从vector中移除,免得重复释放,用sharedptr比较好
201
201
RuleRouterSet* result = *it;
202
202
data_it->second .erase (it);
203
203
return result;
@@ -213,7 +213,7 @@ bool RuleRouterCluster::GetHealthyAndHalfOpenSubSet(
213
213
if (cluster.empty ()) {
214
214
return false ;
215
215
}
216
- // 判断subset状态是否健康,剔除不健康的set
216
+ // 判断subset状态是否健康,剔除不健康的set
217
217
std::vector<RuleRouterSet*> cluster_healthy;
218
218
std::vector<RuleRouterSet*> cluster_unhealthy;
219
219
std::vector<RuleRouterSet*> cluster_isolated;
@@ -236,22 +236,22 @@ bool RuleRouterCluster::GetHealthyAndHalfOpenSubSet(
236
236
cluster_unhealthy.push_back (*it);
237
237
}
238
238
}
239
- // 移除隔离的set
239
+ // 移除隔离的set
240
240
for (std::vector<RuleRouterSet*>::iterator it = cluster_isolated.begin (); it != cluster_isolated.end (); ++it) {
241
241
delete *it;
242
242
}
243
243
244
244
if (!cluster_healthy.empty () || !cluster_halfopen.empty ()) {
245
- // 只保留健康和半开的set
246
- // 注意内存释放!
245
+ // 只保留健康和半开的set
246
+ // 注意内存释放!
247
247
cluster.swap (cluster_healthy);
248
248
for (std::vector<RuleRouterSet*>::iterator it = cluster_unhealthy.begin (); it != cluster_unhealthy.end (); ++it) {
249
249
delete *it;
250
250
}
251
251
return true ;
252
252
}
253
- // 没有健康的set
254
- // 隔离的set已经被释放
253
+ // 没有健康的set
254
+ // 隔离的set已经被释放
255
255
cluster.swap (cluster_unhealthy);
256
256
return false ;
257
257
}
@@ -317,6 +317,8 @@ ReturnCode RuleServiceRouter::Init(Config* config, Context* context) {
317
317
return kReturnOk ;
318
318
}
319
319
320
+ std::string RuleServiceRouter::Name () { return " RuleServiceRouter" ; }
321
+
320
322
ReturnCode RuleServiceRouter::DoRoute (RouteInfo& route_info, RouteResult* route_result) {
321
323
ServiceRouteRule* route_rule = route_info.GetServiceRouteRule ();
322
324
POLARIS_CHECK_ARGUMENT (route_rule != nullptr );
0 commit comments