【送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.Stringcom.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=restdubbo.protocols.rest.port=9090dubbo.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;}}

▼点击阅读原文,获取本书详情~
评论
