- 浏览: 595004 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
当时我们说开启负载均衡很简单,只需要在RestTemplate的bean上再添加一个@LoadBalanced注解即可,所以本文我们就从这个注解开始我们的分析吧。
首先我们来看看@LoadBalanced注解的源码:
具体的配置是在哪里执行的呢?我们在LoadBalancerClient的包下面发现了一个类叫做LoadBalancerAutoConfiguration,看名字有点像是客户端负载均衡服务器的自动化配置类,我们来看看这个类的源码:
这个类的源码比较长,我们就来说一下这里的核心功能:
1.LoadBalancerAutoConfiguration类上有两个关键注解,分别是@ConditionalOnClass(RestTemplate.class)和@ConditionalOnBean(LoadBalancerClient.class),说明Ribbon如果想要实现负载均衡的自动化配置需要满足两个条件:第一个,RestTemplate类必须存在于当前工程的环境中;第二个,在Spring容器中必须有LoadBalancerClient的实现Bean。
2.ribbonInterceptor方法返回了一个拦截器叫做LoadBalancerInterceptor,这个拦截器的作用主要是在客户端发起请求时进行拦截,进而实现客户端负载均衡功能。
3.restTemplateCustomizer方法返回了一个RestTemplateCustomizer,这个方法主要用来给RestTemplate添加LoadBalancerInterceptor拦截器。
4.restTemplates是一个被@LoadBalanced注解修饰的RestTemplate对象列表,在loadBalancedRestTemplateInitializer方法中通过调用RestTemplateCustomizer中的customizef方法来给RestTemplate添加上LoadBalancerInterceptor拦截器。
从而实现了从http://服务名/hello到http://域名/hello的转换。
RestTemplate从一个简单的服务请求控件变成了具有客户端负载均衡功能的请求控件。简而言之,就是RestTemplate发起一个请求,这个请求被LoadBalancerInterceptor给拦截了,拦截后将请求的地址中的服务逻辑名转为具体的服务地址,然后继续执行请求,就是这么一个过程。
转自:http://blog.csdn.net/u012702547/article/details/77940838
/** * 使用RestTemplate实现负载均衡 * @return */ @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); }
首先我们来看看@LoadBalanced注解的源码:
/** * Annotation to mark a RestTemplate bean to be configured to use a LoadBalancerClient * @author Spencer Gibb */ @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Qualifier public @interface LoadBalanced { }
具体的配置是在哪里执行的呢?我们在LoadBalancerClient的包下面发现了一个类叫做LoadBalancerAutoConfiguration,看名字有点像是客户端负载均衡服务器的自动化配置类,我们来看看这个类的源码:
@Configuration @ConditionalOnClass(RestTemplate.class) @ConditionalOnBean(LoadBalancerClient.class) @EnableConfigurationProperties(LoadBalancerRetryProperties.class) public class LoadBalancerAutoConfiguration { @LoadBalanced @Autowired(required = false) private List<RestTemplate> restTemplates = Collections.emptyList(); @Bean public SmartInitializingSingleton loadBalancedRestTemplateInitializer( final List<RestTemplateCustomizer> customizers) { return new SmartInitializingSingleton() { @Override public void afterSingletonsInstantiated() { for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) { for (RestTemplateCustomizer customizer : customizers) { customizer.customize(restTemplate); } } } }; } @Autowired(required = false) private List<LoadBalancerRequestTransformer> transformers = Collections.emptyList(); @Bean @ConditionalOnMissingBean public LoadBalancerRequestFactory loadBalancerRequestFactory( LoadBalancerClient loadBalancerClient) { return new LoadBalancerRequestFactory(loadBalancerClient, transformers); } @Configuration @ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate") static class LoadBalancerInterceptorConfig { @Bean public LoadBalancerInterceptor ribbonInterceptor( LoadBalancerClient loadBalancerClient, LoadBalancerRequestFactory requestFactory) { return new LoadBalancerInterceptor(loadBalancerClient, requestFactory); } @Bean @ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer( final LoadBalancerInterceptor loadBalancerInterceptor) { return new RestTemplateCustomizer() { @Override public void customize(RestTemplate restTemplate) { List<ClientHttpRequestInterceptor> list = new ArrayList<>( restTemplate.getInterceptors()); list.add(loadBalancerInterceptor); restTemplate.setInterceptors(list); } }; } } @Configuration @ConditionalOnClass(RetryTemplate.class) public static class RetryAutoConfiguration { @Bean public RetryTemplate retryTemplate() { RetryTemplate template = new RetryTemplate(); template.setThrowLastExceptionOnExhausted(true); return template; } @Bean @ConditionalOnMissingBean public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory() { return new LoadBalancedRetryPolicyFactory.NeverRetryFactory(); } } @Configuration @ConditionalOnClass(RetryTemplate.class) public static class RetryInterceptorAutoConfiguration { @Bean @ConditionalOnMissingBean public RetryLoadBalancerInterceptor ribbonInterceptor( LoadBalancerClient loadBalancerClient, LoadBalancerRetryProperties properties, LoadBalancedRetryPolicyFactory lbRetryPolicyFactory, LoadBalancerRequestFactory requestFactory) { return new RetryLoadBalancerInterceptor(loadBalancerClient, properties, lbRetryPolicyFactory, requestFactory); } @Bean @ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer( final RetryLoadBalancerInterceptor loadBalancerInterceptor) { return new RestTemplateCustomizer() { @Override public void customize(RestTemplate restTemplate) { List<ClientHttpRequestInterceptor> list = new ArrayList<>( restTemplate.getInterceptors()); list.add(loadBalancerInterceptor); restTemplate.setInterceptors(list); } }; } } }
这个类的源码比较长,我们就来说一下这里的核心功能:
1.LoadBalancerAutoConfiguration类上有两个关键注解,分别是@ConditionalOnClass(RestTemplate.class)和@ConditionalOnBean(LoadBalancerClient.class),说明Ribbon如果想要实现负载均衡的自动化配置需要满足两个条件:第一个,RestTemplate类必须存在于当前工程的环境中;第二个,在Spring容器中必须有LoadBalancerClient的实现Bean。
2.ribbonInterceptor方法返回了一个拦截器叫做LoadBalancerInterceptor,这个拦截器的作用主要是在客户端发起请求时进行拦截,进而实现客户端负载均衡功能。
3.restTemplateCustomizer方法返回了一个RestTemplateCustomizer,这个方法主要用来给RestTemplate添加LoadBalancerInterceptor拦截器。
4.restTemplates是一个被@LoadBalanced注解修饰的RestTemplate对象列表,在loadBalancedRestTemplateInitializer方法中通过调用RestTemplateCustomizer中的customizef方法来给RestTemplate添加上LoadBalancerInterceptor拦截器。
从而实现了从http://服务名/hello到http://域名/hello的转换。
RestTemplate从一个简单的服务请求控件变成了具有客户端负载均衡功能的请求控件。简而言之,就是RestTemplate发起一个请求,这个请求被LoadBalancerInterceptor给拦截了,拦截后将请求的地址中的服务逻辑名转为具体的服务地址,然后继续执行请求,就是这么一个过程。
转自:http://blog.csdn.net/u012702547/article/details/77940838
发表评论
文章已被作者锁定,不允许评论。
-
Spring BeanFactoryPostProcessor和BeanPostProcessor的区别
2018-11-14 15:40 701链接:https://blog.csdn.net/caihai ... -
spring BeanPostProcessor理解
2018-11-14 11:31 317链接:https://blog.csdn.net/ginkgo ... -
Spring 源码解析之Initializer
2018-11-14 11:27 449链接:https://blog.csdn.net/ktlife ... -
spring transaction同一个类不回滚解决方法
2018-10-11 10:59 7661.修改配置文件 <aop:aspectj-autopr ... -
Spring @Transaction学习
2018-10-08 10:36 2881.考虑有下面这么一个类 public class Foo ... -
spring mvc i18n国际化学习(spring:message)
2018-06-09 09:35 636spring.xml文件中配置: <!-- 存储区域 ... -
Spring Boot Oauth2.0授权服务器
2018-05-11 14:19 1644什么是OAuth? OAuth(Open Authoriza ... -
Spring Boot @Import注解(将指定类实例注入到IOC容器中)
2018-05-09 10:20 1593SpringBoot 的 @Import 用于将指定的类实例注 ... -
Spring Boot @Conditional注解
2018-05-09 10:15 1810Spring Boot的强大之处在于使用了Spring 4框架 ... -
Spring Boot自定义starter pom实例(/META-INFO/spring.factory文件)
2018-05-09 09:48 1129自定义starter pom 自己实现一个简单的例子,当某个类 ... -
Spring Boot自动配置原理(@Conditional @Import)
2018-04-26 14:45 1323Springboot的自动配置是SpringBoot的关键,主 ... -
Spring Boot优缺点总结
2018-04-16 10:25 1531优点: 1.去除了大量的xml配置文件 2.简化 ... -
SpringBoot JPA @Transaction 知识学习
2018-03-16 09:09 754一、事务相关概念 1、事务的特点 原子性:事务是一个原子操 ... -
Sprint @Query注解的用法(nativeQuery=true/false)(Spring Data JPA)
2018-03-15 16:33 37811. 一个使用@Query注解的简单例子 @Query(val ... -
Spring Boot JpaRepository知识学习(Spring Data JPA)
2018-03-14 11:17 17791.Spring Data所解决的问题 Spring Dat ... -
SpringCloud Hystrix知识学习(防止雪崩效应)
2018-03-13 14:57 923一、Hystrix说明 1.服务雪崩效应:是一种因服务提供者的 ... -
Spring Boot配置方式(java配置和注解配置)
2018-03-12 15:09 1102Java配置 从Spring 3.x开始,Spring提供了J ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1610REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
SpringCloud | 第七篇: 高可用的服务注册中心
2018-02-26 14:31 472文章 第一篇: 服务的注册与发现(Eureka) 介绍了服务注 ... -
SringCloud | 第六篇: 分布式配置中心(Spring Cloud Config)
2018-02-26 09:13 399一、简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文 ...
相关推荐
- 使用 @LoadBalanced 注解:当在 RestTemplate 上添加 @LoadBalanced 注解后,SpringCloud 会自动处理负载均衡,可以直接使用服务名来发起请求,简化了编码,如: ```java @Component public class ...
在初学SpringCloud的过程中,与Oracle数据库的连接是构建分布式系统的一个重要环节。SpringCloud作为一个微服务框架,提供了丰富的服务治理功能,而数据库作为数据存储的核心,与SpringBoot的集成使得我们可以轻松...
- **@LoadBalanced注解**:在RestTemplate或Feign客户端上添加@LoadBalanced注解,使每次请求都能自动选择不同的服务实例。 - **IRibbonClientConfiguration**:自定义Ribbon客户端配置,可以设置连接超时、重试...
SpringCloud提供了`@LoadBalanced`注解,可以配合`RestTemplate`或`Feign`实现负载均衡的远程调用。例如,对于`RestTemplate`,只需如下配置: ```java @Autowired private LoadBalancerClient loadBalancer; @...
在Spring Cloud中,@LoadBalanced注解用于RestTemplate,使其具有客户端负载均衡的能力。这样的设计使得服务调用可以根据一定策略进行负载均衡,提高系统的稳定性和可用性。 8. 微服务RPC远程服务调用的核心: ...
创建RestTemplateConfig配置类,标注@LoadBalanced注解,默认使用的ReactiveLoadBalancer实现是RoundRobinLoadBalancer。 package cn.itxs.ecom.order.config; import org.springframework.cloud.client.load...
同时,其他服务可以通过SpringCloud的DiscoveryClient或@LoadBalanced注解来实现对注册服务的发现和负载均衡。DiscoveryClient允许你查询注册中心中的服务信息,而@LoadBalanced则能自动在多个服务实例间进行请求...
`@LoadBalanced`是Spring Cloud的一个注解,主要用于实现服务消费者端的负载均衡。在微服务架构中,每个服务可能有多个实例运行,为了能够有效地分发请求,避免单一实例过载,我们需要在调用其他服务时自动地选择...
Springcloud ribbon负载均衡算法实现 Springcloud ribbon负载均衡算法实现是基于Springcloud框架下的一个负载均衡器,主要用于客户端负载均衡。该算法实现了负载均衡的核心功能,能够整合不同的协议工具进行web ...
在Spring Cloud生态系统中,"springcloud-负载均衡,服务注册demo"是一个典型的示例,它展示了如何在微服务架构中实现服务发现和服务间的负载均衡。本文将深入探讨这两个关键概念及其在Spring Cloud中的实现。 首先...
《SpringCloud与Nacos深度整合实战指南》 在微服务架构中,SpringCloud以其强大的功能和易用性,...通过学习和实践这个项目,开发者可以更好地理解SpringCloud生态中的Nacos集成,提升微服务系统的构建和运维能力。
这个“SpringCloud入门教程系列源码.rar”压缩包显然包含了用于学习 SpringCloud 的一系列示例源代码,旨在帮助初学者理解并掌握如何在实际项目中应用这些核心组件。 1. **Ribbon**: Ribbon 是 Netflix 提供的一个...
在本篇学习笔记中,我们将深入探讨如何在Spring Cloud框架下使用RestTemplate和Ribbon来消费服务。Spring Cloud是基于Spring Boot实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、...
Spring Cloud是构建微服务架构的一套工具集,其中Ribbon是它提供的一个客户端负载均衡器,可以帮助我们实现服务间的智能路由。本篇文章将详细探讨如何在Spring Cloud中使用Ribbon实现负载均衡。 首先,我们要理解...
服务消费者(Consumer)端,同样引入@EnableDiscoveryClient,并使用@LoadBalanced注解的RestTemplate或者Feign Client来调用服务提供者的接口。这样,通过Eureka,消费者就能动态地发现服务提供者的位置并进行负载...
然后,通过SpringCloud的@LoadBalanced注解启用Ribbon的负载均衡能力,使服务消费者能自动选择服务提供者中的一个实例进行调用。对于服务提供者,我们需要在启动时向Nacos注册服务,并在服务消费者中使用@...
在这个"SpringCloud入门案例 nacos dubbo"中,我们可能要学习以下内容: 1. **Spring Cloud Nacos的安装与配置**:首先,你需要了解如何下载并部署Nacos服务器,配置服务器的基本参数,如端口号、数据存储路径等。 ...
SpringCloud是微服务架构中的一个流行框架,它包含多个子项目,用于解决分布式系统中的服务发现、配置管理、熔断机制等问题。Eureka是SpringCloud生态中的一个关键组件,主要负责服务注册与发现。本教程将详细介绍...
Spring Cloud Nacos是阿里巴巴提供的一款云原生应用的配置管理和服务发现工具,它结合了Spring Cloud Eureka和Zookeeper的功能,使得在微服务架构中进行服务注册与发现变得更加简单。本示例将深入探讨如何使用Nacos...
在Spring Cloud中,我们可以使用`@EnableDubbo`注解来启用Dubbo支持,同时结合Spring Cloud的`@LoadBalanced`注解实现调用时的负载均衡。 在源码中,我们还可以学习到如何定义服务接口和服务实现,以及如何在Spring...