IClient Ribbon发送请求的抽象接口,我们先来看看接口定义
传入一个 ClientRequest
和 一个 IClientConfig
返回一个 IResponse
很简单.
再来看看UML
ClientRequest
表示适用于所有通信协议的通用客户端请求对象。该对象是immutable不可变的。
public class ClientRequest implements Cloneable {
// 请求的URI
protected URI uri;
protected Object loadBalancerKey = null;
// 是否是可重试。true:该请求可重试 false:该请求不可重试
protected Boolean isRetriable = null;
// 外部传进来的配置,可以覆盖内置的IClientConfig配置哦
protected IClientConfig overrideConfig;
... // 省略各种构造器
... // 生路各种get方法。注意:没有set方法,因为该实例不可变
// 判断该请求是否可以重试(重要)
public boolean isRetriable() {
return (Boolean.TRUE.equals(isRetriable));
}
...
// 使用新的URI创建一个**新的**ClientRequest
// 它会先用clone方法去克隆一个,若抛错那就new ClientRequest(this) new一个实例
// 推荐子类复写此方法,提供更多、更有效的实施。
public ClientRequest replaceUri(URI newURI) {
ClientRequest req;
try {
req = (ClientRequest) this.clone();
} catch (CloneNotSupportedException e) {
req = new ClientRequest(this);
}
req.uri = newURI;
return req;
}
}
我们看看 ClientRequest UML 图
IResponse
public interface IResponse extends Closeable {
// 从响应中获得实体。若是Http协议,那就是Body体
// 因为和协议无关,所以这里只能取名叫Payload
public Object getPayload() throws ClientException;
public boolean hasPayload();
// 如果认为响应成功,则为真,例如,http协议的200个响应代码。
public boolean isSuccess();
public URI getRequestedURI();
// 响应头们
public Map<String, ?> getHeaders();
}
最简单的demo
- IResponse
- IClient
- 测试