项目版本: spring cloud版本为Greenwich.SR3 spring-boot版本为2.1.9.RELEASE
什么是feigin?
Feign:用于远程调用,让服务之间的调用变得更加简单
类似于控制层的service,Fegin的底层使用了rabbon作为负载均衡的客户端
它的优点是什么?
1.feign采用的是基于接口注解
2.feign整合了ribbon,具有负载均衡的能力
3.整合了Hystrix,具有熔断的能力
feign的使用:
1.添加pom依赖。
2.启动类添加@EnableFeignClients
3.定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务
feign具体实现步骤
一般来说,SpringCloud分布式项目,都会有一个API项目工程
1.在API项目工程的pom.xml文件引入依赖
/** * 该类实现FallbackFactory接口 * 一定要记得在该类加上@Component注解 */@Componentpublic class DeptFeignServiceFallBackFactoy implements FallbackFactory { @Override public DeptFeignService create(Throwable throwable) { /** * 返回一个接口匿名内部类,该接口内部类重写并实现所有接口,业务实现一般用于处理异常 */ return new DeptFeignService() @Override public R setRedisExpire(String key, String value, Long expire) { return R.error().data("写入redis缓存(设置expire存活时间)失败"); } }; }}
2.在API项目工程的service包中新建一个用于处理异常的类,即DeptFeignServiceFallBackFactoy类
该类需要实现FallbackFactory接口,记得在该类加上@Component注解
/** * 该类实现FallbackFactory接口 * 一定要记得在该类加上@Component注解 */@Componentpublic class DeptFeignServiceFallBackFactoy implements FallbackFactory { @Override public DeptFeignService create(Throwable throwable) { /** * 返回一个接口匿名内部类,该接口内部类重写并实现所有接口,业务实现一般用于处理异常 */ return new DeptFeignService() { @Override public R setRedisExpire(String key, String value, Long expire) { return R.error().data("写入redis缓存(设置expire存活时间)失败"); } }; }}
3.在API项目工程的service包中新建一个feginservice接口 即DeptFeignService接口
/** * 该接口的所有方法名和返回类型和方法参数都prodiver-service服务的Controller中的要一致 *当调用服务失败的情况下,会去DeptFeignServiceFallBackFactoy类中寻找相应的方法将结果返回 *从而达到服务不会由于调用失败而导致服务崩溃 *///@FeignClient(value = "prodiver-service")@FeignClient(value = "prodiver-service" ,fallbackFactory = DeptFeignServiceFallBackFactoy.class)public interface DeptFeignService { @ResponseBody @RequestMapping("/Prodiver/setRedisExpire") public R setRedisExpire( @RequestParam(value = "key",required = true)String key, @RequestParam(value = "value",required = true)String value, @RequestParam(value = "expire",required = true)Long expire);}
这是prodiver-service服务Controller中的一个方法,它们两是不是类似于一个接口,一个实现接口类
@Controller@RefreshScope@RequestMapping("/Prodiver")public class ProdiverServiceController { /** * 写入redis缓存(设置expire存活时间) * @return */ @ResponseBody @RequestMapping("/setRedisExpire") public R setRedisExpire( @RequestParam(value = "key",required = true)String key, @RequestParam(value = "value",required = true)String value, @RequestParam(value = "expire",required = true)Long expire) { redisService.set(key,value,expire); return R.ok().data("写入redis缓存(设置expire存活时间)成功"); }}
4.在消费者服务工程的pom.xml文件引入依赖(如果你引入了API项目依赖,可以不用再引入)
org.springframework.cloud spring-cloud-starter-openfeigncom.fasterxml.jackson.core jackson-annotations 2.9.0
5.在消费者服务工程的启动类上加上(注意更改成你自己的包路径哦)
@EnableFeignClients("com.zy.cwy")
和
@ComponentScan("com.zy.cwy")
pom.xml
启动类
6.在消费者服务工程的controller类中注入feginservice接口,通过接口去调用提供者服务接口
@AutowiredDeptFeignService deptFeignService; //注入feginservice接口
7.在消费者服务工程的yml配置文件中配置
#开启服务熔断降级机制
feign:
hystrix:
enabled: true
总结:
当用户请求访问消费者服务中的一个方法,
该方法中有代码 deptFeignService接口去调用提供者服务接口,
比如deptFeignService.setRedisExpire(arg0,arg1,arg2)
服务会根据@FeignClient(value = "prodiver-service" ,fallbackFactory = DeptFeignServiceFallBackFactoy.class) 找到对应的服务,执行对应的方法
如果在执行方法过程中发生异常,会自动快速执行DeptFeignServiceFallBackFactoy中的对应方法,返回一个有好的提示给用户客户端