与Fegin相遇之前 在我们平时的工作中,我们经常会遇到要调用内部API或者其他第三方服务的API,在遇到Fegin之前我们基本会使用以下几种方式。 因为我已经迫不及待的想和Fegin来一个美丽的邂逅了。 与Fegin的美丽邂逅 什么是Fegin? Fegin 的执行过程 与Fegin的缠绵悱恻 Fegin的原生API的使用 public interface GitHub { @RequestLine("GET /repos/{owner}/ primary: 是否将此Feign代理标记为一个Primary Bean,默认为ture Fegin的核心配置 Fegin的配置方式有两种。 从Fegin的简介和作用,Fegin九大核心组件,Fegin的执行过程,Fegin的核心注解@FeignClient的详解,Fegin原生Api的使用,Fegin结合Spring Cloud使用,Fegin
一. fegin的基本使用 1.添加fegin依赖 <! 启动类上开启fegin @EnableFeignClients 3.创建fegin接口 @FeignClient("userservice") public interface userClient { @RequestMapping("/user/{id}") User findById(@PathVariable("id") long id); } 4.总结 fegin自到负载均衡 二.fegin性能调优 Feign底层的客户端实现: URLConnection:默认实现,不支持连接池 Apache Httpclient:支持连接池 OKHttp:支持连接池 因此优化Feign
我们都知道fegin 是一个很好用的远程调用工具, 底层就是restTemplate 实现的。但是具体他是怎么工作的,这里我们我们今天来自己实现一下, 仿写一个feign。
那么是否有更高层次的封装来整合这两个基础工具,有就是Spring Cloud Fegin。 一、是什么 ---- Fegin 是一个声明式 WebService客户端。 使用 Fegin能让编写 Web Service 客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解即可,同时支持 JAX-RS标准的注解。Feign 也支持可拔插式的编码器和解码器。 所以就出现了Feign,它就可以满足上面的需求 二、能干什么 ---- Fegin 指在使编写 Java Http客户端变的容易。 所以 Fegin 在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。
我们开始吧 首先我们需要在配置文件中配置Fegin的相关规则 #开启fegin对sentinel支持 feign: sentinel: enabled: true 然后我们创建容错实现类 [ image.png] 其次就是在Fegin调用接口的时候加上fallback [image.png] 我们在controller中编写相关逻辑 if (product.getPid()==-1){
Fegin简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。 继续用上节的工程, 启动eureka-server,端口为8761;启动service-hi 两次,端口分别为8762 、8863 简单使用 继续使用上节的eureka-client工程 1.加入Fegin
在启动类中增加了@EnableFeignClients 注解,就可以在项目中使用Fegin 啦,那我们怎么使用呢? 前面我们调用服务提供者的接口需要写url,参数,返回类型等等非常的繁琐,所以Fegin 就帮我们进行了简化,让我们调用服务提供者的接口,可以像自身调用一样,非常放方便。 分别输入如下地址来看看效果: http://localhost:9003/fegin http://localhost:9003/fegin2 http://localhost:9003/fegin3 http://localhost:9003/fegin4 ? 番外 总算是写完了,算是对ribbon 和fegin 有了一些了解,最起码现在可以使用他们,并将其使用到到项目中没有什么问题啦。
Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。 4.1.2 Feign的使用 1 加入Fegin的依赖 12345 <! </artifactId></dependency> 2 在主类上添加Fegin的注解 1234 @SpringBootApplication@EnableDiscoveryClient@EnableFeignClients //开启Feginpublic class OrderApplication {} 3 创建一个service, 并使用Fegin实现微服务调用 1234567 @FeignClient("service-product PathVariable("pid") Integer pid) { log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", pid); //通过fegin
chenkailing"); System.err.println(remoteService.getPostLoanList(object)); } 4.关于spring cloud fegin 来指定调用失败的补偿策略 fallback,和fallbackFactory的用法大同小异,只是fallbackFactory可以根据异常的不同来定制我们的补偿逻辑 fallback的方式定义很简单,直接实现我们的fegin PathVariable("salesId") String salesId) { return null; } }; } } 网上有些人反馈fegin 中fallback配置无效,原因如下 在老的spring cloud fegin中hystrix默认是开启的,不知从哪个版本开始hystrix默认是关闭的,不过不要紧,我们可以通过如下配置,显示开启or
依赖 实现: 开始之前首先你要是一个Fegin的环境: 可以参考这里:拉到最后Fegin服务调用 和之前相比加了一个 Fegin服务调用的接口实现, 专门为其做熔断的类 OrderFeginRD 加入Fegin 开启服务熔断的配置: 虽然 Fegin 的内部集成了 hystrix的依赖~不需要加入什么依赖 但, 还是要pom.xml 开启属性配置的~ pom.xml #fegin 就是最顶层! 本人就返回一个 List:Order Fegin熔断! System.out.println("Fegin熔断降级!!") Fegin熔断总结: 首先在一个Fegin服务调用的环境下 因为Fegin的内部实现了 hystrix 所以不需要在引入什么依赖~ Fegin的服务调用是创建一个和 调用方的Controller中要掉方法 Fegin的底层对其做了实现!给Service直接调用!
springcloud对应的版本为Finchley,且springboot2.0相比于springboot1.5.x来说,maven依赖变化较大,这个问题在搭建分布式项目时我会做出说明) 中间件:eureka、fegin 不同点:@EnableEurekaClient只适用于Eureka作为注册中心,而@EnableDiscoveryClient可以是其他注册中心; @EnableEurekaClient //表示开启Fegin -- fegin客户端依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> args) { SpringApplication.run(SpringbootdemoConsumerApplication.class, args); } } – 整合fegin 调用服务的接口了; 至此,springboot2.1.13(官网最新版本)+springcloud+eureka+fegin进行远程调用的功能已经完成;欢迎各位留言; 重点中的重点:鉴于好多朋友的
--fegin客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId >spring-cloud-starter-openfeign</artifactId> </dependency> [image.png] 然后我们在主类开启fegin客户端。 [image.png] 然后我们就可以自定义一个相关接口,设置我们的Fegin了 [image.png] 然后我们再controller在像这样调用接口就OK了 这就是比较优雅的方式了。
看了一下Hystrix ,其实有很多东西,我们就先来看看Hystrix 的简单使用,由于上节我们也说了Fegin 中集成了Hystrix 和ribbon .所以我们就直接使用Fegin 来实现一个简单的熔断处理的操作 pom文件引入fegin 的依赖 <dependency> <groupId>org.springframework.cloud</groupId> 然后我们在界面输入 http://localhost:9006/fegin 然后关闭服务提供者,再调接口试试。 ? 可以看到服务提供者的接口断掉之前和之后返回的结果是不一样的。
服务提供者只需要启动多个服务实例并且注册到一个注册中心或是多个相关联的服务注册中心 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用 三、Spring Cloud核心组件:Fegin Fegin的关键机制是使用了动态代理 1)、首先,对某个接口定义了@FeginClient注解,Fegin就会针对这个接口创建一个动态代理 2)、接着调用接口的时候,本质就是调用Fegin创建的动态代理 3)、Fegin的动态代理会根据在接口上的@RequestMapping等注解,来动态构造要请求的服务的地址 4)、针对这个地址,发起请求、解析响应 Fegin是和Ribbon以及Eureka紧密协作的 Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口 2)、然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器 3)、Fegin
Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负 载均衡的效果。 Feign的使用 1 加入Fegin的依赖 <! --fegin组件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign </artifactId> </dependency> 2 在主类上添加Fegin的注解 @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients //开启Fegin public class OrderApplication {} 3 创建一个service, 并使用Fegin实现微服务调用 package com.zking.service; order(@PathVariable("pid") Integer pid) { log.info(">>客户下单,这时候要调用商品微服务查询商品信息"); //通过fegin
构建开始 创建一个用户fegin模块:common_userService_fegin 实现采用fegin的调用方式,调用 订单模块(provide) 添加 fegin 依赖组件:pom.xml pom.xml </version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>common_userService_fegin -- fegin依赖!! spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> </project> 添加 fegin fegin服务调用总结: 导入依赖pom.xml fegin的.yml 并没有什么必须的配置… 创建主程序类的时候, 要添加@EnableFeignClients启动类添加Feign的支持 fegin是面向接口编程
通俗的说: Fegin是一个声明式的Web服务客户端,使得开发web客户端变的更加简单. ? 使用:只需要创建一个接口,然后在上面添加注解就可以了。 ? 以往使用调用Rest Api: 之前我们使用Ribbon+RestTemlate对Http进行请求封装访问,我们需要写入服务的地址等信息,实际开发中会有很多微服务接口,我们就得定义好多微服务的地址.Fegin 如何使用 第一步:新创建一个模块; 名称:msc-consumer-department-80-feign 内容与msc-consumer-department-80相同; pom中加入fegin的GAV
Token透传(不推荐) Fegin内部调用方式 Dubbo内部调用方式 Spring Boot Web + Dubbo内部调用方式 常规模式 与K8S集成 Token透传(不推荐) 刚开始接触微服务时网上给的方案大都数是通过透传 统一授权 统一授权是指:将API鉴权集中在应用网关上 Fegin内部调用方式 Spring Cloud Gateway + Fegin内部调用,集中在Gateway上做统一认证鉴权,鉴权后在请求头中添加鉴权后的信息转发给后续服务 缺点:A服务调用B服务时,B服务需要写一个内部调用的Controller接口A服务才能通过Fegin调用到B服务,增加了代码量(这里的设计方案是内部调用与外部调用Controller是分开的) Dubbo
、查看GateWay配置(如果单体项目没有使用网关忽略) 首先要查看网关中的过滤器链里边所有的自定义过滤器有没有对请求头进行了修改,如果有修改的话请根据当前业务进行适当的修改 3、查看是否调用了Fegin 接口 如果调用了Fegin接口的话,他默认是不携带多余请求头的,所以我们要对齐进行配置 @Configuration public class FeignAuthRequestInterceptor
Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均 衡的效果。 Feign的使用 加入Fegin的依赖 <! --fegin组件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign </artifactId> </dependency> 在主类上添加Fegin的注解 @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients //开启Fegin public class OrderApplication {} 创建一个service @FeignClient("service-product") //声明调用的提供者的name public Order order(@PathVariable("pid") Integer pid) { log.info(">>客户下单,这时候要调用商品微服务查询商品信息"); //通过fegin