栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Cloud Netflix Ribbon

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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()

未完…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667563.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号