From 893bfb5020a9e53861f87d20663c1ebdedfa9217 Mon Sep 17 00:00:00 2001 From: Laurence <45508533+LaurenceLiZhixin@users.noreply.github.com> Date: Sun, 27 Jun 2021 21:18:35 +0800 Subject: [PATCH] fix: add arch picture in readme and delete unused router field. (#1279) * fix * fix: delete notify --- README.md | 2 +- README_CN.md | 2 +- cluster/router/chain.go | 2 - cluster/router/chain/chain.go | 62 ++-------------- cluster/router/chain/invoker_cache.go | 78 -------------------- cluster/router/router.go | 2 +- cluster/router/rule.go | 31 -------- cluster/router/v3router/factory.go | 4 +- cluster/router/v3router/factory_test.go | 2 +- cluster/router/v3router/router_chain.go | 13 ++-- cluster/router/v3router/router_chain_test.go | 6 +- cluster/router/v3router/uniform_route.go | 4 +- 12 files changed, 21 insertions(+), 187 deletions(-) delete mode 100644 cluster/router/chain/invoker_cache.go delete mode 100644 cluster/router/rule.go diff --git a/README.md b/README.md index c3031e8fd8..7b35696dac 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Apache Dubbo-go, a Dubbo implementation written in Golang, is born to bridge the ## Architecture -![dubbo go extend](https://dubbogo.github.io/img/doc/dubbo-go-arch.png) +![dubbo go extend](https://dubbogo.github.io/img/doc/dubbo-go3.0-arch.jpg) Dubbo-go has been implemented most layers of Dubbo, like protocol layer, registry layer, etc. An extension module is applied to Dubbo-go in order to achieve a more flexible architecture. Developers are allowed to implement a customized layer conformed to the layer interface and use then in Dubbo-go via `extension.Set` method without modifying the source code. diff --git a/README_CN.md b/README_CN.md index 2f7963f203..d6b5dcb981 100644 --- a/README_CN.md +++ b/README_CN.md @@ -14,7 +14,7 @@ Apache Dubbo Go 语言实现,架起 Java 和 Golang 之间的桥梁,与 gRPC ## 架构 -![dubbo go extend](https://dubbogo.github.io/img/doc/dubbo-go-arch.png) +![dubbo go extend](https://dubbogo.github.io/img/doc/dubbo-go3.0-arch.jpg) Dubbo-go已经实现了Dubbo的大部分层级,包括协议层(protocol layer)、注册层(registry layer))等等。在Dubbo-go中使用了拓展模块(extension module)以实现更灵活的系统架构,开发者可以根据层接口实现一个自定义的层,并在不改动源代码的前提下通过`extension.Set`方法将它应用到Dubbo-go中。 diff --git a/cluster/router/chain.go b/cluster/router/chain.go index bde5aecd35..6c7c0347d8 100644 --- a/cluster/router/chain.go +++ b/cluster/router/chain.go @@ -29,6 +29,4 @@ type Chain interface { SetInvokers([]protocol.Invoker) // AddRouters Add routers AddRouters([]PriorityRouter) - // GetNotifyChan get notify channel of this chain - GetNotifyChan() chan struct{} } diff --git a/cluster/router/chain/chain.go b/cluster/router/chain/chain.go index 9268bafcaa..616909ab1e 100644 --- a/cluster/router/chain/chain.go +++ b/cluster/router/chain/chain.go @@ -20,7 +20,6 @@ package chain import ( "sort" "sync" - "time" ) import ( @@ -31,7 +30,6 @@ import ( import ( "dubbo.apache.org/dubbo-go/v3/cluster/router" "dubbo.apache.org/dubbo-go/v3/common" - "dubbo.apache.org/dubbo-go/v3/common/constant" "dubbo.apache.org/dubbo-go/v3/common/extension" "dubbo.apache.org/dubbo-go/v3/common/logger" "dubbo.apache.org/dubbo-go/v3/protocol" @@ -53,21 +51,6 @@ type RouterChain struct { builtinRouters []router.PriorityRouter mutex sync.RWMutex - - url *common.URL - - // The times of address notification since last update for address cache - count int64 - // The timestamp of last update for address cache - last time.Time - // Channel for notify to update the address cache - notify chan struct{} - // Address cache - cache atomic.Value -} - -func (c *RouterChain) GetNotifyChan() chan struct{} { - return c.notify } // Route Loop routers in RouterChain and call Route method to determine the target invokers list. @@ -91,9 +74,6 @@ func (c *RouterChain) AddRouters(routers []router.PriorityRouter) { c.mutex.Lock() defer c.mutex.Unlock() c.routers = newRouters - go func() { - c.notify <- struct{}{} - }() } // SetInvokers receives updated invokers from registry center. If the times of notification exceeds countThreshold and @@ -102,10 +82,6 @@ func (c *RouterChain) SetInvokers(invokers []protocol.Invoker) { c.mutex.Lock() c.invokers = invokers c.mutex.Unlock() - - go func() { - c.notify <- struct{}{} - }() } // copyRouters make a snapshot copy from RouterChain's router list. @@ -142,18 +118,13 @@ func NewRouterChain(url *common.URL) (*RouterChain, error) { return nil, perrors.Errorf("No routerFactory exits , create one please") } - chain := &RouterChain{ - last: time.Now(), - notify: make(chan struct{}), - } - routers := make([]router.PriorityRouter, 0, len(routerFactories)) for key, routerFactory := range routerFactories { if virtualServiceConfigByte == nil || destinationRuleConfigByte == nil { logger.Warnf("virtual Service Config or destinationRule Confi Byte may be empty, pls check your CONF_VIRTUAL_SERVICE_FILE_PATH and CONF_DEST_RULE_FILE_PATH env is correctly point to your yaml file\n") } - r, err := routerFactory().NewPriorityRouter(virtualServiceConfigByte, destinationRuleConfigByte, chain.notify) + r, err := routerFactory().NewPriorityRouter(virtualServiceConfigByte, destinationRuleConfigByte) if r == nil || err != nil { logger.Errorf("router chain build router fail! routerFactories key:%s error:%vv", key, err) continue @@ -168,36 +139,13 @@ func NewRouterChain(url *common.URL) (*RouterChain, error) { routerNeedsUpdateInit := atomic.Bool{} routerNeedsUpdateInit.Store(false) - chain.routers = newRouters - chain.builtinRouters = routers - if url != nil { - chain.url = url - } - return chain, nil -} - -// isInvokersChanged compares new invokers on the right changes, compared with the old invokers on the left. -func isInvokersChanged(left []protocol.Invoker, right []protocol.Invoker) bool { - if len(right) != len(left) { - return true + chain := &RouterChain{ + routers: newRouters, + builtinRouters: routers, } - for _, r := range right { - found := false - rurl := r.GetURL() - for _, l := range left { - lurl := l.GetURL() - if common.GetCompareURLEqualFunc()(lurl, rurl, constant.TIMESTAMP_KEY, constant.REMOTE_TIMESTAMP_KEY) { - found = true - break - } - } - if !found { - return true - } - } - return false + return chain, nil } // sortRouter Sort router instance by priority with stable algorithm diff --git a/cluster/router/chain/invoker_cache.go b/cluster/router/chain/invoker_cache.go deleted file mode 100644 index 8fde0dde1c..0000000000 --- a/cluster/router/chain/invoker_cache.go +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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 chain - -import ( - "github.com/RoaringBitmap/roaring" -) - -import ( - "dubbo.apache.org/dubbo-go/v3/cluster/router" - "dubbo.apache.org/dubbo-go/v3/protocol" -) - -// Cache caches all addresses relevant info for a snapshot of received invokers. It keeps a snapshot of the received -// address list, and also keeps address pools and address metadata from routers based on the same address snapshot, if -// the router implements Poolable. -type InvokerCache struct { - // The snapshot of invokers - invokers []protocol.Invoker - - // The bitmap representation for invokers snapshot - bitmap *roaring.Bitmap - - // Address pool from routers which implement Poolable - pools map[string]router.AddrPool - - // Address metadata from routers which implement Poolable - metadatas map[string]router.AddrMetadata -} - -// BuildCache builds address cache from the given invokers. -func BuildCache(invokers []protocol.Invoker) *InvokerCache { - return &InvokerCache{ - invokers: invokers, - pools: make(map[string]router.AddrPool, 8), - metadatas: make(map[string]router.AddrMetadata, 8), - } -} - -// GetInvokers get invokers snapshot. -func (c *InvokerCache) GetInvokers() []protocol.Invoker { - return c.invokers -} - -// FindAddrPool finds address pool for a poolable router. -func (c *InvokerCache) FindAddrPool(p router.Poolable) router.AddrPool { - return c.pools[p.Name()] -} - -// FindAddrMeta finds address metadata for a poolable router. -func (c *InvokerCache) FindAddrMeta(p router.Poolable) router.AddrMetadata { - return c.metadatas[p.Name()] -} - -// SetAddrPool sets address pool for a poolable router, for unit test only -func (c *InvokerCache) SetAddrPool(name string, pool router.AddrPool) { - c.pools[name] = pool -} - -// SetAddrMeta sets address metadata for a poolable router, for unit test only -func (c *InvokerCache) SetAddrMeta(name string, meta router.AddrMetadata) { - c.metadatas[name] = meta -} diff --git a/cluster/router/router.go b/cluster/router/router.go index 5d653cdd87..d3d2fe53d5 100644 --- a/cluster/router/router.go +++ b/cluster/router/router.go @@ -30,7 +30,7 @@ import ( // PriorityRouterFactory creates creates priority router with url type PriorityRouterFactory interface { // NewPriorityRouter creates router instance with URL - NewPriorityRouter([]byte, []byte, chan struct{}) (PriorityRouter, error) + NewPriorityRouter([]byte, []byte) (PriorityRouter, error) } // Router diff --git a/cluster/router/rule.go b/cluster/router/rule.go deleted file mode 100644 index 42c08a7009..0000000000 --- a/cluster/router/rule.go +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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 router - -// BaseRouterRule -type BaseRouterRule struct { - RawRule string - Runtime bool - Force bool - Valid bool - Enabled bool - Priority int - Dynamic bool - Scope string - Key string -} diff --git a/cluster/router/v3router/factory.go b/cluster/router/v3router/factory.go index 0b164e76ca..afd14af66d 100644 --- a/cluster/router/v3router/factory.go +++ b/cluster/router/v3router/factory.go @@ -30,6 +30,6 @@ func NewUniformRouterFactory() router.PriorityRouterFactory { } // NewPriorityRouter construct a new UniformRouteFactory as PriorityRouter -func (f *UniformRouteFactory) NewPriorityRouter(vsConfigBytes, distConfigBytes []byte, notify chan struct{}) (router.PriorityRouter, error) { - return NewUniformRouterChain(vsConfigBytes, distConfigBytes, notify) +func (f *UniformRouteFactory) NewPriorityRouter(vsConfigBytes, distConfigBytes []byte) (router.PriorityRouter, error) { + return NewUniformRouterChain(vsConfigBytes, distConfigBytes) } diff --git a/cluster/router/v3router/factory_test.go b/cluster/router/v3router/factory_test.go index 365d7552f4..a5ea41579c 100644 --- a/cluster/router/v3router/factory_test.go +++ b/cluster/router/v3router/factory_test.go @@ -29,7 +29,7 @@ import ( func TestUniformRouterFacotry(t *testing.T) { factory := NewUniformRouterFactory() assert.NotNil(t, factory) - router, err := factory.NewPriorityRouter([]byte{}, []byte{}, make(chan struct{})) + router, err := factory.NewPriorityRouter([]byte{}, []byte{}) assert.Nil(t, err) assert.NotNil(t, router) } diff --git a/cluster/router/v3router/router_chain.go b/cluster/router/v3router/router_chain.go index dc14c7325d..ce8269493d 100644 --- a/cluster/router/v3router/router_chain.go +++ b/cluster/router/v3router/router_chain.go @@ -48,9 +48,9 @@ type RouterChain struct { } // NewUniformRouterChain return -func NewUniformRouterChain(virtualServiceConfig, destinationRuleConfig []byte, notify chan struct{}) (router.PriorityRouter, error) { +func NewUniformRouterChain(virtualServiceConfig, destinationRuleConfig []byte) (router.PriorityRouter, error) { fromFileConfig := true - uniformRouters, err := parseFromConfigToRouters(virtualServiceConfig, destinationRuleConfig, notify) + uniformRouters, err := parseFromConfigToRouters(virtualServiceConfig, destinationRuleConfig) if err != nil { fromFileConfig = false logger.Warnf("parse router config form local file failed, error = %+v", err) @@ -59,7 +59,6 @@ func NewUniformRouterChain(virtualServiceConfig, destinationRuleConfig []byte, n virtualServiceConfigBytes: virtualServiceConfig, destinationRuleConfigBytes: destinationRuleConfig, routers: uniformRouters, - notify: notify, } if err := k8s_api.SetK8sEventListener(r); err != nil { logger.Warnf("try listen K8s router config failed, error = %+v", err) @@ -110,7 +109,7 @@ func (r *RouterChain) Process(event *config_center.ConfigChangeEvent) { logger.Error("Process change of virtual service: event.Value marshal error:", err) return } - r.routers, err = parseFromConfigToRouters(data, r.destinationRuleConfigBytes, r.notify) + r.routers, err = parseFromConfigToRouters(data, r.destinationRuleConfigBytes) if err != nil { logger.Error("Process change of virtual service: parseFromConfigToRouters:", err) return @@ -142,7 +141,7 @@ func (r *RouterChain) Process(event *config_center.ConfigChangeEvent) { logger.Error("Process change of dest rule: event.Value marshal error:", err) return } - r.routers, err = parseFromConfigToRouters(r.virtualServiceConfigBytes, data, r.notify) + r.routers, err = parseFromConfigToRouters(r.virtualServiceConfigBytes, data) if err != nil { logger.Error("Process change of dest rule: parseFromConfigToRouters:", err) return @@ -174,7 +173,7 @@ func (r *RouterChain) URL() *common.URL { } // parseFromConfigToRouters parse virtualService and destinationRule yaml file bytes to target router list -func parseFromConfigToRouters(virtualServiceConfig, destinationRuleConfig []byte, notify chan struct{}) ([]*UniformRouter, error) { +func parseFromConfigToRouters(virtualServiceConfig, destinationRuleConfig []byte) ([]*UniformRouter, error) { var virtualServiceConfigList []*config.VirtualServiceConfig destRuleConfigsMap := make(map[string]map[string]map[string]string) @@ -234,7 +233,7 @@ func parseFromConfigToRouters(virtualServiceConfig, destinationRuleConfig []byte logger.Error("Parse config to uniform rule err = ", err) return nil, err } - rtr, err := NewUniformRouter(newRule, notify) + rtr, err := NewUniformRouter(newRule) if err != nil { logger.Error("new uniform router err = ", err) return nil, err diff --git a/cluster/router/v3router/router_chain_test.go b/cluster/router/v3router/router_chain_test.go index 4ce4eef3b0..9e12da1eb3 100644 --- a/cluster/router/v3router/router_chain_test.go +++ b/cluster/router/v3router/router_chain_test.go @@ -51,7 +51,7 @@ const ( func TestNewUniformRouterChain(t *testing.T) { vsBytes, _ := yaml.LoadYMLConfig(mockVSConfigPath) drBytes, _ := yaml.LoadYMLConfig(mockDRConfigPath) - rc, err := NewUniformRouterChain(vsBytes, drBytes, make(chan struct{})) + rc, err := NewUniformRouterChain(vsBytes, drBytes) assert.Nil(t, err) assert.NotNil(t, rc) } @@ -72,7 +72,7 @@ type ruleTestItemStruct struct { func TestParseConfigFromFile(t *testing.T) { vsBytes, _ := yaml.LoadYMLConfig(mockVSConfigPath) drBytes, _ := yaml.LoadYMLConfig(mockDRConfigPath) - routers, err := parseFromConfigToRouters(vsBytes, drBytes, make(chan struct{}, 1)) + routers, err := parseFromConfigToRouters(vsBytes, drBytes) fmt.Println(routers, err) assert.Equal(t, len(routers), 1) assert.NotNil(t, routers[0].dubboRouter) @@ -199,7 +199,7 @@ func TestParseConfigFromFile(t *testing.T) { func TestRouterChain_Route(t *testing.T) { vsBytes, _ := yaml.LoadYMLConfig(mockVSConfigPath) drBytes, _ := yaml.LoadYMLConfig(mockDRConfigPath) - rc, err := NewUniformRouterChain(vsBytes, drBytes, make(chan struct{})) + rc, err := NewUniformRouterChain(vsBytes, drBytes) assert.Nil(t, err) assert.NotNil(t, rc) newGoodURL, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?interface=com.ikurento.user.UserProvider&group=&version=2.6.0") diff --git a/cluster/router/v3router/uniform_route.go b/cluster/router/v3router/uniform_route.go index f44eff1482..9ea12dd421 100644 --- a/cluster/router/v3router/uniform_route.go +++ b/cluster/router/v3router/uniform_route.go @@ -30,14 +30,12 @@ const ( // UniformRouter have type UniformRouter struct { dubboRouter *DubboRouterRule - notify chan struct{} } // NewUniformRouter construct an NewConnCheckRouter via url -func NewUniformRouter(dubboRouter *DubboRouterRule, notify chan struct{}) (*UniformRouter, error) { +func NewUniformRouter(dubboRouter *DubboRouterRule) (*UniformRouter, error) { r := &UniformRouter{ dubboRouter: dubboRouter, - notify: notify, } return r, nil }