【送10本书】深入理解Spring Cloud与实战
以下节选自《深入理解Spring Cloud与实战》一书。
public interface DubboMetadataService {
// 最核心的接口,用于获取 Dubbo 服务的 Rest 元数据
String getServiceRestMetadata();
// 返回所有 Dubbo 服务的 ServiceKey 集合
Set<String> getAllServiceKeys();
// 返回所有对外暴露的Dubbo服务。key为ServiceKey,value为URL的json格式
Map<String, String> getAllExportedURLs();
// 基于接口名分组及版本获取到 URL 的 json 格式
String getExportedURLs(String serviceInterface, String group, String version);
}
public class SpringRestService implements RestService {
"/param") (
public String param( String param) {
return param;
}
}
RestMethodMetadata{method=MethodMetadata{name='param',
returnType='java.lang.String', params=[MethodParameterMetadata{index=0,
name='param', type='java.lang.String'}], method=public java.lang.String
com.alibaba.cloud.dubbo.service.SpringRestService.param(java.lang.String)},
request=RequestMetadata{method='GET', path='/param', params={param=[{param}]},
headers=[], consumes=[], produces=[]}, urlIndex=null, bodyIndex=null,
headerMapIndex=null, queryMapIndex=null, queryMapEncoded=false,
returnType='java.lang.String', bodyType='null', indexToName={0=[param]},
formParams=[], indexToEncoded={}}
public class StandardRestService implements RestService {
public String param( String param) {
return param;
}
}
RestMethodMetadata{method=MethodMetadata{name='param', returnType='java.lang.String', params=[MethodParameterMetadata{index=0, name='param', type='java.lang.String'}], method=public java.lang.String com.alibaba.cloud.dubbo.service.SpringRestService.param(java.lang.String)}, request=RequestMetadata{method='GET', path='/param', params={param=[{param}]}, headers=[], consumes=[], produces=[]}, urlIndex=null, bodyIndex=null, headerMapIndex=null, queryMapIndex=null, queryMapEncoded=false, returnType='java.lang.String', bodyType='null', indexToName={0=[param]}, formParams=[], indexToEncoded={}}
(1)根据服务名得到注册中心的Dubbo服务DubboMetadataService。 (2)使用DubboMetadataService里提供的getServiceRestMetadata方法获取要使用的Dubbo服务和对应的Rest元数据。 (3)基于Dubbo服务和Rest元数据构造GenericService。 (4)服务调用过程中使用GenericService发起泛化调用。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
dubbo.registry.address=spring-cloud://localhost
class SpringRestService implements RestService { public String param( String param) { log("/param", param); return param; } public String params( int a, String b) { log("/params", a + b); return a + b; }}
dubbo.protocols.rest.name=rest
dubbo.protocols.rest.port=9090
dubbo.protocols.rest.server=netty
public class StandardRestService implements RestService { public String param( String param) { log("/param", param); return param; } public String params( int a, String b) { log("/params", a + b); return a + b; }}
public RestTemplate restTemplate() {
return new RestTemplate();
}
public interface DubboFeignRestService {
String param( String param);
String params( String paramB, int paramA);
}
restTemplate.getForEntity(“http://dubbo-provider-service/param?param=deepinspringcloud”, String.class);
dubboFeignRestService.param(“deepinspringcloud”);
基于Netflix Ribbon的Spring Cloud 负载均衡设计了以下两个核心接口:
路由对应的ILoadBalancer 接口,获取服务的 Server 实例列表。
负载均衡对应的 IRule 接口,从服务的 Server 实例列表中根据负载均衡算法获取一个实例。
自定义 ILoadBalancer 接口,重写获取 Server 列表的逻辑(找出与当前请求匹配的 Server 列表)。
自定义 IRule 接口,从所有的 Server 列表里找出与当前请求匹配的 Server。
public interface Router extends Comparable<Router> {
<T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;
}
public class RouterChain<T> {
public List<Invoker<T>> route(URL url, Invocation invocation) {
List<Invoker<T>> finalInvokers = invokers;
for (Router router : routers) {
finalInvokers = router.route(finalInvokers, url, invocation);
}
return finalInvokers;
}
}
▼点击阅读原文,获取本书详情~
评论