负载均衡组件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注解的源码介绍啦。

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...