Spring Cloud Netflix Ribbon
微服务架构下的服务通信需求
通信实现
- RPC框架 如:dubbo
- 手写RPC模块
- HTTPClient调用
- RestTemplate
- OkHttp
- JDK HttpUrlConnection
RESTful HTTP协议通行
规范了HTTP通信协议的标准
- HTTP METHOD 约束资源操作类型 GET POST PUT DELETE
- REST是面向资源的 uri
- GET /order/${id}
- POST /order
- PUT /order
- DELETE /order/${id}
- 名词 uri是一个名词而不是动词
- HTTP返回码 2xx,3xx,4xx,5xx
服务的拆分
拆分背景
-
系统已经长时间运行 -
以微服务架构开始
架构始终跟随需求变化
拆分的前提
拆分的准备
- 基础设施
- 业务模型和整体架构的规划(数据库的拆分、应用层的优化)
微服务拆分
<<拆分边界>>
- 功能维度
- 业务维度
- 康威定律(考虑团队结构)
- 拆分粒度(如:商品服务(商品库存、商品目标、商品评价、商品图片))
- PerfMa(JVM调优)
RestTemplate
负载均衡
微服务中服务集群如何访问
Ribbon
客户端负载均衡
- 解析配置中的服务器列表
- 基于负载均衡算法实现请求分发
通过LoadBalanceIntorceptor拦截RestTemplate,解析url
装饰器模式
@Quelifier标记
List list = Collections.emptyList();
Ribbon源码分析
初始化
LoadBalancerAutoConfiguration
@LoadBalanced
@Autowired(required = false)
private List<RestTemplate> restTemplates = Collections.emptyList();
-
@LoadBalanced @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}
-
LoadbalancerInterceptor @Bean
public LoadBalancerInterceptor loadBalancerInterceptor(
LoadBalancerClient loadBalancerClient,
LoadBalancerRequestFactory requestFactory) {
return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
}
-
RestTemplateCustomizer @Bean
@ConditionalOnMissingBean
public RestTemplateCustomizer restTemplateCustomizer(
final RetryLoadBalancerInterceptor loadBalancerInterceptor) {
return restTemplate -> {
List<ClientHttpRequestInterceptor> list = new ArrayList<>(
restTemplate.getInterceptors());
list.add(loadBalancerInterceptor);
restTemplate.setInterceptors(list);
};
}
-
SmartInitilizingSingleton @Bean
public SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(
final ObjectProvider<List<RestTemplateCustomizer>> restTemplateCustomizers) {
return () -> restTemplateCustomizers.ifAvailable(customizers -> {
for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {
for (RestTemplateCustomizer customizer : customizers) {
customizer.customize(restTemplate);
}
}
});
}
使用RestTemplateCustomizer定制所有被@Loadbalanced注解的RestTemplate实例
调用链路
RibbonLoadBalancerClient.execute
-
request=ServiceRequestWrapper 通过匿名内部类创建 -
request.apply() -
InterceotinaAsvncClientHttoRequest.executeAsync()
未完…
|