SpringCloud中的OpenFeign以及与Feign的区别_易柏州Innovation
SpringCloud中的OpenFeign以及与Feign的区别
?
?
为什么要学这个?你不想面试的时候多装两个逼多拿两千块钱?
先回眸一段时间.我前一天跳转功能的的工作原理SpringCloud中的Ribbon电动机扭矩多样化教育。实用RestTemplate换成@loadBalance注解就可以进行功能名换成电动机扭矩多样化教育管理策略去跳转远距离的功能。首先这样的写法没有什么问题,工作中也有不少公司是这样干。但我们想一下
1.如果远程服务很多,要维护的服务名也就很多,很容易引起调用的问题。
2.再一点来说,有没有觉得RestTemplate这样的写法很傻逼呢?总感觉不符合我们编码的规范。
OpenFeign组件就解决了我们的问题,面向接口编程。也就是说,咱们把注册中心中每一个服务都以一个接口的形式体现,我们服务的消费者只需要调用这个接口中的方法,配合Ribbon使用,那么底层就会自动的调用远方的服务。 下面我展示用法和原理。咱们不单要会用,也要了解一点原理。
?
那OpenFeign和Feign的区别:
Feign是SpringCloud中的一个轻量级RestFul的Http客户端,内置了Ribbon,用于客户端负载均衡,使用方法是使用Feign的注解去修饰一个接口,客户端调用这个接口那么久是调用远程的微服务了。
OpenFeign在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeigenClient注解可以解析SpringMvc的@RequestMapping注解下的接口,通过动态代理的方式产生实现类,实现类中进行负载均衡的微服务远程调用!
1.这里我们学习一下OpenFeign的用法(注意OpenFeign是用在服务消费端)。
@SpringBootApplication
@EnableFeignClients 在消费端的主启动类上加上@EnableFeignClients 注解,
表示此服务开启的Feign组件
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class, args);
}
}
这里是消费端的代码!
定义一个接口 用@FeignClient修饰,@FeignClient注解的value属性值
填写当前我这个接口对应的哪个微服务,也就是微服务在注册中心中的名称。
可以理解为这一个接口就对应一个微服务了。
那这个接口中对应的方法是什么呢?可以他妈的乱定义吗?
不行,方法必须对应消费端的Controller层的暴露出来的接口以及URL地址。
@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface MyTestOpenFeign01 {
@GetMapping("/testOpenFeign01")
String testOpenFeign01();
@GetMapping("/testOpenFeign02")
String testOpenFeign02();
}
这里是服务端的代码!
这是服务端暴露出来的两个接口 URL分别是/testOpenFeign01,/testOpenFeign02。
如果我们在上面的消费端Feign接口中想调用到这两个接口,那上面的MyTestOpenFeign01 接口中
的两个方法也必须打上@GetMapping注解,Url也要一一对应!
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping("/testOpenFeign01")
public String testOpenFeign01(){
return deptService.testOpenFeign01();
}
@GetMapping("/testOpenFeign02")
public String testOpenFeign02(){
return deptService.testOpenFeign02();
}
最后是消费端的Controller层,我们把我们刚刚定义的MyTestOpenFeign01注入进来
调用接口中的方法,他就会自动的默认的以负载均衡的方式远程调用到了服务端的"/testOpenFeign01"
和"/testOpenFeign02"接口
@RestController
public class OpenFeignController {
@Autowired
private MyTestOpenFeign01 myTestOpenFeign01;
@RequestMapping("/consumer/testOpenFeign01")
public String testOpenFeign01(){
return myTestOpenFeign01.testOpenFeign01();
}
@RequestMapping("/consumer/testOpenFeign02")
public String testOpenFeign02(){
return myTestOpenFeign01.testOpenFeign02();
}
}
}
以上是简单的OpenFeign使用。一句话,@FeignClient注解把一个庞大的微服务抽象成了一个接口,@FeignClient(value = “xxxxx”)中的value 属性具体指定是哪个微服务。那么OpenFeign底层会帮我们通过微服务的服务名去获取到我们最关心的服务IP+Port。
但是光有IP+Port是不够的,我们需要定位到这个IP+Port旗下具体的资源路径。例如
192.168.22.50:8080/xxxx/xxxx。
那么这个资源路径就是通过接口中的方法脑袋上顶着的@GetMapping("/xxx/xxx")来表示
这个资源路径就和目标服务的资源路径一一对应!
2.简单了解一下OpenFeign以及负载均衡的实现原理
这个神奇的@FeignClient注解和@EnableFeignClients注解是怎么实现这样强大的远程调用功能的呢。
OpenFeign声明的接口,例如上面例子中的
@GetMapping("/testOpenFeign01")
String testOpenFeign01();
@GetMapping("/testOpenFeign02")
String testOpenFeign02();
项目启动的时候,会用LoadBalancerFeignClient注册一个feign.Client到ioc容器中。
@Configuration
class DefaultFeignLoadBalancedConfiguration {
DefaultFeignLoadBalancedConfiguration() {
}
@Bean
@ConditionalOnMissingBean
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) {
return new LoadBalancerFeignClient(new Default((SSLSocketFactory)null, (HostnameVerifier)null), cachingFactory, clientFactory);
}
}
FeignClientFactoryBean会生成一个@FeignClient注解的对应的service实例。
下面的源码我就不继续解读了,太麻烦。一句话总结一下吧!
一切都是由动态代理实现的,项目启动的时候由@FeignClient修饰的接口都会被生成一个代理实现类,负载均衡以及发送请求一系列操作都是在代理类中实现的!并且负载均衡策略默认使用的是Ribbon中的轮询机制。
那么怎么更改默认的这个负载均衡机制呢?很简单,和之前讲Ribbon那篇文章中的方式一样,看下面的代码
@Configuration
public class RibbonRules01 {
@Bean
public IRule rule01(){
return new RandomRule();
}
}
如此就界定一个js随机数的装载均等化性策略了。 这是因为在Feign的代理商类中,它下层选定装载均等化性百度算法的情况下的结构是如此的:但如果金属罐中无装载均等化性人,那小编就选择默认要求的轮询策略。到现在我们大家往金属罐里倒入一个装载均等化性人,那小编就用倒入的这位。正是这么多简短!
对于Feign的任何性能下面为您详细介绍一下我的另一个说的是篇:SpringCloud中的OpenFeign的超时保持和记录不断增强。
好了 基本已经讲完,欢迎大家评论区指出不足,一起学习进步!
我们看弄完点个赞,码字决不能易啊。。。皇冠新体育APP相关的文章
- 皇冠新体育APP:【网页开发】css关于网页端transform的scale()缩放白边问题_小孙仗剑走天涯
- 【02】 PC端网页布局之CSS3-pink老师-2022/03_鬼扯子
- css鼠标变成小手(css中鼠标悬停是为小手)_yetaoseo
- 15、Gantt 修改样式部分_你在说啥-Lynn
- sas字符数字转_weixin_45271076_sas字符型转换成数值型
- 通过使用简单的JavaScript的效果实现密码输入框显示与隐藏的效果_小杨要努力哇_完成pwdvisible网页的登录界面密码可视化界面的js代码,使得网页密码输入框可
- 皇冠新体育APP:HTML+CSS之背景图片的设置_cloudOnSkyline_html添加背景图片css
- 皇冠新体育APP:HTML5和CSS3新特性_四季奶青全糖去冰@_html5和css3新特性
- 浅谈html5和css3_EriczBW22_html5和css3
- 皇冠新体育APP:黑马程序员:移动web_要月薪过万的小白_移动web素材黑马程序员
- 皇冠新体育APP:H5中当页面滚动_-阿大头_h5页面滚动
- JS 仿淘宝固定右侧侧边栏(可返回顶部)案例_YinJie…_右侧返回顶部
- 皇冠新体育APP:网页设计实验三(超链接与多媒体文件应用)_阿斯卡码_实训3 超链接与多媒体文件应用
- 练习动画最好的方式:用GSAP实现可滚动和可拖动的时间轴_前端仙人_scrubgsaptimeline
- css表单单选框、复选框、上传文字和隐藏字段、下拉菜单、文本域、字段集_陌一一_css单选框和复选框
- 皇冠新体育APP:网页自适应布局_梦诺七棠_网页自适应