-
Notifications
You must be signed in to change notification settings - Fork 929
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
make cluster interceptor a chain (#1211)
- Loading branch information
Showing
15 changed files
with
210 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
/* | ||
* Licensed to the Apache Software Foundation (ASF) under one or more | ||
* contributor license agreements. See the NOTICE file distributed with | ||
* this work for additional information regarding copyright ownership. | ||
* The ASF licenses this file to You under the Apache License, Version 2.0 | ||
* (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package cluster_impl | ||
|
||
import ( | ||
"context" | ||
) | ||
|
||
import ( | ||
"dubbo.apache.org/dubbo-go/v3/cluster" | ||
"dubbo.apache.org/dubbo-go/v3/common" | ||
"dubbo.apache.org/dubbo-go/v3/common/extension" | ||
"dubbo.apache.org/dubbo-go/v3/protocol" | ||
) | ||
|
||
// InterceptorInvoker mocks cluster interceptor as an invoker | ||
type InterceptorInvoker struct { | ||
next protocol.Invoker | ||
interceptor cluster.Interceptor | ||
} | ||
|
||
// GetURL is used to get url from InterceptorInvoker | ||
func (i *InterceptorInvoker) GetURL() *common.URL { | ||
return i.next.GetURL() | ||
} | ||
|
||
// IsAvailable is used to get available status | ||
func (i *InterceptorInvoker) IsAvailable() bool { | ||
return i.next.IsAvailable() | ||
} | ||
|
||
// Invoke is used to call service method by invocation | ||
func (i *InterceptorInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result { | ||
return i.interceptor.Invoke(ctx, i.next, invocation) | ||
} | ||
|
||
// Destroy will destroy invoker | ||
func (i *InterceptorInvoker) Destroy() { | ||
i.next.Destroy() | ||
} | ||
|
||
func buildInterceptorChain(invoker protocol.Invoker, builtins ...cluster.Interceptor) protocol.Invoker { | ||
// The order of interceptors is from left to right, so loading from right to left | ||
next := invoker | ||
interceptors := extension.GetClusterInterceptors() | ||
if len(interceptors) != 0 { | ||
for i := len(interceptors) - 1; i >= 0; i-- { | ||
v := &InterceptorInvoker{next: next, interceptor: interceptors[i]} | ||
next = v | ||
} | ||
} | ||
|
||
if builtins != nil && len(builtins) > 0 { | ||
for i := len(builtins) - 1; i >= 0; i-- { | ||
v := &InterceptorInvoker{next: next, interceptor: builtins[i]} | ||
next = v | ||
} | ||
} | ||
|
||
return next | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/* | ||
* Licensed to the Apache Software Foundation (ASF) under one or more | ||
* contributor license agreements. See the NOTICE file distributed with | ||
* this work for additional information regarding copyright ownership. | ||
* The ASF licenses this file to You under the Apache License, Version 2.0 | ||
* (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package cluster_impl | ||
|
||
import ( | ||
"context" | ||
) | ||
|
||
import ( | ||
"dubbo.apache.org/dubbo-go/v3/cluster" | ||
"dubbo.apache.org/dubbo-go/v3/common/constant" | ||
"dubbo.apache.org/dubbo-go/v3/protocol" | ||
) | ||
|
||
type zoneAwareInterceptor struct { | ||
} | ||
|
||
func (z *zoneAwareInterceptor) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result { | ||
key := constant.REGISTRY_KEY + "." + constant.ZONE_FORCE_KEY | ||
force := ctx.Value(key) | ||
|
||
if force != nil { | ||
switch value := force.(type) { | ||
case bool: | ||
if value { | ||
invocation.SetAttachments(key, "true") | ||
} | ||
case string: | ||
if "true" == value { | ||
invocation.SetAttachments(key, "true") | ||
} | ||
default: | ||
// ignore | ||
} | ||
} | ||
|
||
return invoker.Invoke(ctx, invocation) | ||
} | ||
|
||
func getZoneAwareInterceptor() cluster.Interceptor { | ||
return &zoneAwareInterceptor{} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/* | ||
* Licensed to the Apache Software Foundation (ASF) under one or more | ||
* contributor license agreements. See the NOTICE file distributed with | ||
* this work for additional information regarding copyright ownership. | ||
* The ASF licenses this file to You under the Apache License, Version 2.0 | ||
* (the "License"); you may not use this file except in compliance with | ||
* the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package extension | ||
|
||
import ( | ||
"sync" | ||
) | ||
|
||
import ( | ||
"dubbo.apache.org/dubbo-go/v3/cluster" | ||
) | ||
|
||
var ( | ||
lock sync.RWMutex | ||
interceptors = make(map[string]func() cluster.Interceptor) | ||
) | ||
|
||
// SetClusterInterceptor sets cluster interceptor so that user has chance to inject extra logics before and after | ||
// cluster invoker | ||
func SetClusterInterceptor(name string, fun func() cluster.Interceptor) { | ||
lock.Lock() | ||
defer lock.Unlock() | ||
interceptors[name] = fun | ||
} | ||
|
||
// GetClusterInterceptor returns the cluster interceptor instance with the given name | ||
func GetClusterInterceptor(name string) cluster.Interceptor { | ||
lock.RLock() | ||
defer lock.RUnlock() | ||
if interceptors[name] == nil { | ||
panic("cluster_interceptor for " + name + " doesn't exist, make sure the corresponding package is imported") | ||
} | ||
return interceptors[name]() | ||
} | ||
|
||
// GetClusterInterceptors returns all instances of registered cluster interceptors | ||
func GetClusterInterceptors() []cluster.Interceptor { | ||
lock.RLock() | ||
defer lock.RUnlock() | ||
ret := make([]cluster.Interceptor, 0, len(interceptors)) | ||
for _, f := range interceptors { | ||
ret = append(ret, f()) | ||
} | ||
return ret | ||
} |