指定Ip Port调用Provider
对于Provider集群中注册的多个实例,指定Ip:Port进行调用
当多个Provider注册到注册中心时,可以通过在RpcContext中动态的指定其中一个实例的Ip,Port进行Dubbo调用。
提示
支持版本:2.7.12
之后
用法示例
- provider demo
假定提供2个provider注册于注册中心,分别为10.220.47.253:20880;10.220.47.253:20881;
// 10.220.47.253:20880
@Service(interfaceClass = TestService.class)
public class TestServiceImpl implements TestService {
@Override
public String sayHello(String name) {
return "Hello "+name+" i am provider1";
}
}
// 10.220.47.253:20881
@Service(interfaceClass = TestService.class)
public class TestServiceImpl implements TestService {
@Override
public String sayHello(String name) {
return "Hello "+name+" i am provider2";
}
}
- consumer demo
@DubboReference引入provider,其中设定parameters = {“router”,“address”},指定address路由方式。
对于要调用的实例,指定Ip,Port构造Address对象,并设置RpcContext键为"address",value为该对象。
// 需要依赖的class
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 {
// 根据provider的ip,port创建Address实例
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端口所在实例。
>curl http://localhost:8081/invokeByIpPortSpecified
>Hello Tom i am provider1
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.
最后修改 July 23, 2021: update metadata doc, add application level metadata info. (#876) (e71a2ba)