Spring Cloud Netflix Ribbon

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
  1. request=ServiceRequestWrapper 通过匿名内部类创建

  2. request.apply()

  3. InterceotinaAsvncClientHttoRequest.executeAsync()

    • 重构URL

      1. reguest.getURI()
      2. ServiceRequestWraoper.getURI()
      3. RibbonLoadBalancerClient.reconstructURI()
    • 发起异步远程调用

      AbstractAsvncClientHttoReguest.executeAsync()

未完…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值