| /* |
| * 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. |
| */ |
| |
| use crate::{cluster::router::BoxRouter, invocation::RpcInvocation}; |
| use url::Url; |
| use std::{collections::HashMap, sync::Arc}; |
| |
| #[derive(Debug, Default)] |
| pub struct RouterChain { |
| pub routers: HashMap<String, BoxRouter>, |
| pub self_url: Url, |
| } |
| |
| impl RouterChain { |
| pub fn new() -> Self { |
| RouterChain { |
| routers: HashMap::new(), |
| self_url: Url::new(), |
| } |
| } |
| |
| pub fn route(&self, mut invokers: Vec<Url>, invocation: Arc<RpcInvocation>) -> Vec<Url> { |
| for (_, value) in self.routers.iter() { |
| invokers = value.route(invokers, self.self_url.clone(), invocation.clone()) |
| } |
| invokers |
| } |
| |
| pub fn add_router(&mut self, key: String, router: BoxRouter) { |
| self.routers.insert(key, router); |
| } |
| } |
| |
| #[test] |
| fn test() { |
| use crate::cluster::router::manager::router_manager::get_global_router_manager; |
| |
| let u1 = Url::from_url("tri://127.0.0.1:8888/org.apache.dubbo.sample.tri.Greeter").unwrap(); |
| let u2 = Url::from_url("tri://127.0.0.1:8889/org.apache.dubbo.sample.tri.Greeter").unwrap(); |
| let u3 = Url::from_url("tri://127.0.0.1:8800/org.apache.dubbo.sample.tri.Greeter").unwrap(); |
| let u4 = Url::from_url("tri://127.0.2.1:8880/org.apache.dubbo.sample.tri.Greeter").unwrap(); |
| let u5 = Url::from_url("tri://127.0.1.1:8882/org.apache.dubbo.sample.tri.Greeter").unwrap(); |
| let u6 = Url::from_url("tri://213.0.1.1:8888/org.apache.dubbo.sample.tri.Greeter").unwrap(); |
| let u7 = Url::from_url("tri://169.0.1.1:8887/org.apache.dubbo.sample.tri.Greeter").unwrap(); |
| let invs = vec![u1, u2, u3, u4, u5, u6, u7]; |
| let len = invs.len().clone(); |
| let inv = Arc::new( |
| RpcInvocation::default() |
| .with_method_name("greet".to_string()) |
| .with_service_unique_name("org.apache.dubbo.sample.tri.Greeter".to_string()), |
| ); |
| let x = get_global_router_manager() |
| .read() |
| .unwrap() |
| .get_router_chain(inv.get_target_service_unique_name()); |
| let result = x.route(invs, inv.clone()); |
| println!("total:{},result:{}", len, result.len().clone()); |
| dbg!(result); |
| } |