Spring Cloud Netflix Ribbon

Spring Cloud Netflix Ribbon,第1张

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 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 list = new ArrayList<>(
    						restTemplate.getInterceptors());
    				list.add(loadBalancerInterceptor);
    				restTemplate.setInterceptors(list);
    			};
    		}
    
  • SmartInitilizingSingleton

    @Bean
    	public SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(
    			final ObjectProvider> 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()

未完…

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5672823.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存