TagRouter extends AbstractRouter { @Override public <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException { List<Invoker<T>> result = new ArrayList<Invoker<T>>(); String tag = RpcContext.getContext().getAttachment(Constants.TAG_KEY); if (!StringUtils.isEmpty(tag)) { for (Invoker<T> invoker : invokers) { if (tag.equals(invoker.getUrl().getParameter(Constants.TAG_KEY))) { result.add(invoker); } } } if (result.isEmpty()) { String forceTag = RpcContext.getContext().getAttachment(Constants.FORCE_USE_TAG); if (StringUtils.isEmpty(forceTag) || "false".equals(forceTag)) { for (Invoker<T> invoker : invokers) { if (StringUtils.isEmpty(invoker.getUrl().getParameter(Constants.TAG_KEY))) { result.add(invoker); } } } } return result; } TagRouter(); @Override URL getUrl(); @Override List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation);  }
@Test public void testRoute_matchTag() { RpcContext.getContext().setAttachment(Constants.TAG_KEY, "red"); List<Invoker<String>> invokers = new ArrayList<Invoker<String>>(); Invoker<String> redInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> yellowInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> blueInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> defaultInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: invokers.add(redInvoker); invokers.add(yellowInvoker); invokers.add(blueInvoker); invokers.add(defaultInvoker); Router tagRouter = new TagRouter(); List<Invoker<String>> filteredInvokers = tagRouter.route(invokers, URL.valueOf("consumer: Assert.assertTrue(filteredInvokers.contains(redInvoker)); Assert.assertFalse(filteredInvokers.contains(yellowInvoker)); Assert.assertFalse(filteredInvokers.contains(blueInvoker)); Assert.assertFalse(filteredInvokers.contains(defaultInvoker)); }
@Test public void testRoute_matchDefault() { RpcContext.getContext().setAttachment(Constants.TAG_KEY, ""); List<Invoker<String>> invokers = new ArrayList<Invoker<String>>(); Invoker<String> redInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> yellowInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> blueInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> defaultInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: invokers.add(redInvoker); invokers.add(yellowInvoker); invokers.add(blueInvoker); invokers.add(defaultInvoker); Router tagRouter = new TagRouter(); List<Invoker<String>> filteredInvokers = tagRouter.route(invokers, URL.valueOf("consumer: Assert.assertTrue(filteredInvokers.contains(defaultInvoker)); Assert.assertFalse(filteredInvokers.contains(yellowInvoker)); Assert.assertFalse(filteredInvokers.contains(blueInvoker)); Assert.assertFalse(filteredInvokers.contains(redInvoker)); }
@Test public void testRoute_requestWithTag_shouldDowngrade() { RpcContext.getContext().setAttachment(Constants.TAG_KEY, "black"); List<Invoker<String>> invokers = new ArrayList<Invoker<String>>(); Invoker<String> redInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> yellowInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> blueInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> defaultInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: invokers.add(redInvoker); invokers.add(yellowInvoker); invokers.add(blueInvoker); invokers.add(defaultInvoker); Router tagRouter = new TagRouter(); List<Invoker<String>> filteredInvokers = tagRouter.route(invokers, URL.valueOf("consumer: Assert.assertTrue(filteredInvokers.contains(defaultInvoker)); Assert.assertFalse(filteredInvokers.contains(yellowInvoker)); Assert.assertFalse(filteredInvokers.contains(blueInvoker)); Assert.assertFalse(filteredInvokers.contains(redInvoker)); }
@Test public void testRoute_requestWithoutTag_shouldNotDowngrade() { RpcContext.getContext().setAttachment(Constants.TAG_KEY, ""); List<Invoker<String>> invokers = new ArrayList<Invoker<String>>(); Invoker<String> redInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> yellowInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: Invoker<String> blueInvoker = new MockInvoker<String>(URL.valueOf( "dubbo: invokers.add(redInvoker); invokers.add(yellowInvoker); invokers.add(blueInvoker); Router tagRouter = new TagRouter(); List<Invoker<String>> filteredInvokers = tagRouter.route(invokers, URL.valueOf("consumer: Assert.assertEquals(0, filteredInvokers.size()); }