有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
对于 Provider 集群中注册的多个实例,指定 Ip:Port 进行调用
背景
当多个 Provider 注册到注册中心时,可以通过在 RpcContext 中动态的指定其中一个实例的 Ip,Port 进行 Dubbo 调用。
示例
假定提供 2 个 provider 注册于注册中心,分别为 10.220.47.253:20880;10.220.47.253:20881;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Service(interfaceClass = TestService.class) public class TestServiceImpl implements TestService { @Override public String sayHello(String name) { return "Hello "+name+" i am provider1"; } }
@Service(interfaceClass = TestService.class) public class TestServiceImpl implements TestService { @Override public String sayHello(String name) { return "Hello "+name+" i am provider2"; } }
|
@DubboReference 引入 provider,其中设定 parameters = {“router”,”address”}, 指定 address 路由方式。
对于要调用的实例,指定 Ip,Port 构造 Address 对象,并设置 RpcContext 键为 “address”,value 为该对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.cluster.router.address.Address; @RestController public class TestServiceConsumer { @DubboReference(interfaceClass = TestService.class,group = "dev",parameters = {"router","address"}) private TestService testService;
@GetMapping("/invokeByIpPortSpecified") public String invokeByIp(){ try { Address address = new Address("10.220.47.253", 20880); RpcContext.getContext().setObjectAttachment("address", address); return testService.sayHello("Tom"); }catch (Throwable ex){ return ex.getMessage(); } } }
|
可以看到,多次执行,始终返回 “Hello Tom i am provider1”, 即始终路由到 20880 端口所在实例。
1 2 3
| >curl http://localhost:8081/invokeByIpPortSpecified >Hello Tom i am provider1
|