【送10本書】深入理解Spring Cloud與實戰(zhàn)
以下節(jié)選自《深入理解Spring Cloud與實戰(zhàn)》一書。

public interface DubboMetadataService {// 最核心的接口,用于獲取 Dubbo 服務的 Rest 元數(shù)據(jù)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)根據(jù)服務名得到注冊中心的Dubbo服務DubboMetadataService。 (2)使用DubboMetadataService里提供的getServiceRestMetadata方法獲取要使用的Dubbo服務和對應的Rest元數(shù)據(jù)。 (3)基于Dubbo服務和Rest元數(shù)據(jù)構造GenericService。 (4)服務調用過程中使用GenericService發(fā)起泛化調用。
<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 實例列表中根據(jù)負載均衡算法獲取一個實例。
自定義 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;}}

▼點擊閱讀原文,獲取本書詳情~
評論
圖片
表情
