负载均衡组件Ribbon核心-@LoadBalanced-上
创始人
2024-03-07 17:15:01
0

引言

书接上篇 微服务负载均衡小能手-Ribbon 使用RIbion实现负载均衡远程调用

@Bean
@LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}

都知道没有@LoadBalanced注解前,RestTemplate就是一个简单的http请求工具类,贴上该注解,却能山鸡变凤凰,成为具有负载均衡的小能手,为啥呢?本篇就跟你讲讲为啥,开讲之前需要铺垫四个知识储备:

1>@Qualifier  2>SmartInitializingSingleton接口  3>ClientHttpRequestInterceptor拦截器 4>SpringBoot 自动配置

@Qualifier注解详解

Spring 给@Qualifier注解赋予2个功能

1:根据Bean名字注入属性

熟悉的Spring的小伙伴应该能看懂下面的代码:

@Service
public class OrderServiceImpl implements IOrderService {@Autowiredprivate IDiscountService discountService ;  //折扣服务
}

order业务层需要引入折扣业务逻辑,其中的@Autowired 能让Spring将容器中有且唯一的IDiscountService 接口实现类注入到OrderServiceImpl 中。很理想,真实情况是电商项目中的商品折扣种类很多,IDiscountService 接口实现类不会唯一,当spring容器中存在多个IDiscountService 接口实例时,上面代码执行肯定会报错

Field discountService in xxxx.OrderServiceImpl required a single bean, but n were found:

怎么办呢?此时@Qualifier注解就起作用啦。

public interface IDiscountService  {
}@Service("discount1Service")
public class Discount1ServiceImpl  implements IDiscountService  {
}@Service("discount2Service")
public class Discount2ServiceImpl implements IDiscountService  {
}

在定义IDiscountService 接口实现类时,给这些实现类指定Bean名:discount1Service  discount2Service 后续使用时,使用@Qualifier("bean名称")直接指定

@Service
public class OrderServiceImpl implements IOrderService {@Qualifier("discount2Service")  //根据bean名字指定@Autowiredprivate IDiscountService discountService ;  //折扣服务
}

 @Qualifier("xxx") xxx是 Bean 的名称,@Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了,完美解决了接口多实现问题。

2:Bean筛选标记符

@Qualifier 注解的这个功能,开发中用途算广,但是Ribbon 负载均衡功能@LoadBalanced 注解刚好用到。

还是上面的接口案例,现在有个需求:将所有IDiscountService接口实现类添加到List集合中

    @Autowiredprivate List list= Collections.emptyList();@Testpublic void testList() {for (IDiscountService discountService : list) {System.out.println(discountService.getClass());}}

执行后,会打印出所有的IDiscountService接口实现类

class com.langfeiyes.demo.Discount1ServiceImpl
class com.langfeiyes.demo.Discount2ServiceImpl

ok,没问题,我们升级一下需求:只需要Discount1ServiceImpl实现类添加到List集合中
此时就需要使用@Qualifier 注解的筛选功能了。

public interface IDiscountService  {
}//不贴,没有筛选标记
@Service("discount1Service")
public class Discount1ServiceImpl  implements IDiscountService  {
}@Qualifier  //贴,筛选标记
@Service("discount2Service")
public class Discount2ServiceImpl implements IDiscountService  {
}

2个接口实现类,只有Discount2ServiceImpl 贴上@Qualifier 标记,集合收集时,配合@Autowired可以实现自动筛选功能

    @Qualifier@Autowired(required = false)private List list= Collections.emptyList();@Testpublic void testList() {for (IDiscountService discountService : list) {System.out.println(discountService.getClass());}}

执行后,会打印出所有的IDiscountService接口实现类

class com.langfeiyes.demo.Discount2ServiceImpl

到这,@Qualifier 注解知识点铺垫算介绍啦,下面看SmartInitializingSingleton 接口

SmartInitializingSingleton 接口

先看下该SmartInitializingSingleton源码

public interface SmartInitializingSingleton {void afterSingletonsInstantiated();
}

SmartInitializingSingleton接口里面只有一个方法:afterSingletonsInstantiated  从方法名也大概看出作用。SmartInitializingSingleton是Spring提供的钩子接口,实现该接口的Bean会在Spring容器初始化所有Bean之后,由容器直接回调afterSingletonsInstantiated  方法。注意:回调的是所有单例Bean。

来一个例子演示一下

public class SomeBean  implements SmartInitializingSingleton {public SomeBean(){System.out.println("我被构建了...");}@Overridepublic void afterSingletonsInstantiated() {System.out.println("我被回调了....");}
}------------------@SpringBoot
class DemoApplication {@Beanpublic SomeBean someBean(){return new SomeBean();}}

查看打印返回值:

我被构建了...
我被回调了....

到这,SmartInitializingSingleton 接口知识点铺垫算介绍啦,下面看 ClientHttpRequestInterceptor拦截器

ClientHttpRequestInterceptor拦截器

截止目前,Spring支持3种http请求拦截器器,分别是

HandlerInterceptor :SpringMVC中组件,拦截普通客户端发起请求,比如:浏览器 ,使用最广的http请求拦截器

ClientHttpRequestInterceptor:spring-web组件,拦截是RestTemplate工具getForEntry/getForObject 发起的http请求,所以常被称之RestTemplate拦截器

RequestInterceptor:spring-cloud-feign组件,拦截是feign发起的远程调用请求,所以称之为Feign拦截器。

本篇重点讲ClientHttpRequestInterceptor拦截器,其他拦截有机会我们再深入。

先看下ClientHttpRequestInterceptor接口源码

@FunctionalInterface
public interface ClientHttpRequestInterceptor {ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)throws IOException;}

ClientHttpRequestInterceptor 接口为函数接口,只有一个intercept拦截方法,在定制拦截器时我们可以根据业务需求为getForEntry/getForObject 方法请求添加额外参数。

需求:getForEntry/getForObject 发起的请求都需要带上身份令牌token

public class RestTokenInterceptor implements ClientHttpRequestInterceptor {@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {HttpHeaders headers = request.getHeaders();headers.add("token","xxxx");return execution.execute(request,body);}
}

到这,ClientHttpRequestInterceptor拦截器知识点铺垫算介绍啦,下面看:SpringBoot自动配置

SpringBoot自动配置

SpringBoot自动配置之前也写过来,有兴趣的朋友,可以看浅谈SpringBoot 入门合集。

SpringBoot自动配置用下图就可以讲清楚啦:

到这,@LoadBalanced 注解需要的知识储备算准备齐活了,下一篇就是@LoadBalanced注解的源码介绍啦。

相关内容

热门资讯

中秋晚会主持稿 中秋晚会主持稿(精选5篇)  又到了一个激动人心的好日子!中秋合家团圆,是中华民族的传统习俗。下面是...
男孩满月酒主持词 男孩满月酒主持词  主持词要注意活动对象,针对活动对象写相应的主持词。在各种集会、活动不断增多的社会...
婚礼司仪主持词简短版 婚礼司仪主持词简短版  借鉴诗词和散文诗是主持词的一种写作手法。在人们积极参与各种活动的今天,各种集...
培训主持词 【精华】培训主持词八篇  借鉴诗词和散文诗是主持词的一种写作手法。在当今不断发展的世界,很多晚会、集...
婚礼主持词完整版 2017婚礼主持词(完整版)  无论新人举行什么样形式的婚礼,婚礼主持人是必不能少的。那么婚礼司仪全...
《哈利波特》的经典语录台词 《哈利波特》的经典语录台词  “就看你的了,哈利,要使他们看到,作为一名找球手,单靠一个有钱的爸爸是...
前任2备胎反击战经典台词 前任2备胎反击战经典台词  1、一见钟情太肤浅,日久生情才是真。  2、再深的感情也敌不过缘分的交错...
生日宴会主持词开场白 生日宴会主持词开场白(精选19篇)  【导语】一个好的活动开展,主持人的开场一定要和活动的主题相契合...
大学军训汇报表演主持词 大学军训汇报表演主持词  军训汇演是必不可少的,下面unjs小编整理了大学军训汇报表演主持词,欢迎阅...
闭幕词 闭幕词(通用10篇)  闭幕词,是会议的主要领导人代表会议举办单位,在会议闭幕时的讲话。其内容一般是...
班歌串词 班歌串词尊敬的领导、亲爱的同学们:大家上午好!(合)请全体起来,齐唱《美佛儿校歌》请坐!今天我们隆重...
幼儿园元旦活动主持词开场白   一、主持人开场白:  (亲爱的爸爸妈妈,小朋友们,大家新年好!因为您的孩子,我们走到了一起,形成...
生日主持主持词 精选生日主持主持词4篇  主持词要尽量增加文化内涵、寓教于乐,不断提高观众的文化知识和素养。在如今这...
开业庆典主持词 开业庆典主持词  什么是主持词?  主持词是主持人对各种晚会背诵已经准备好的稿子,或眼看提示器说出,...
新职工欢迎会主持词 新职工欢迎会主持词  主持词已成为各种演出活动和集会中不可或缺的一部分。在当下的中国社会,主持人的需...
颁奖晚会主持词 颁奖晚会主持词集合7篇  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵。随着社会...
最新员工激励大会主持词 最新员工激励大会主持词  根据活动对象的不同,需要设置不同的主持词。在现今人们越来越重视活动氛围的社...
七十大寿主持词 精选七十大寿主持词3篇  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在当今社会中,...
老年大学太极专业联欢会主持词 老年大学太极专业联欢会主持词  老年大学太极专业联欢会主持词    尊敬的校领导,尊敬的*老师,亲爱...
公司年会主持词、活动内容 公司年会主持词、活动内容女:歌声袅袅辞旧岁男:舞姿翩翩贺新春 尊敬的各位来宾女:亲爱的同事们合:大家...