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注解的RestTemplate实例
-
@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); } } }); } //定制所有被@Loadbalanced注解的RestTemplate实例
使用RestTemplateCustomizer定制所有被@Loadbalanced注解的RestTemplate实例
调用链路
RibbonLoadBalancerClient.execute
-
request=ServiceRequestWrapper 通过匿名内部类创建
-
request.apply()
-
InterceotinaAsvncClientHttoRequest.executeAsync()
-
重构URL
- reguest.getURI()
- ServiceRequestWraoper.getURI()
- RibbonLoadBalancerClient.reconstructURI()
-
发起异步远程调用
AbstractAsvncClientHttoReguest.executeAsync()
-
未完…