springcloud feign 服务调用其他服务_《SpringCloud微服务之Feign组件》

fa6f5417ce3b7dd1ec5d224f2ac35ec6.png

项目版本: 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项目工程

c6fa108dbf947fd4b74dd4133ea7ef12.png

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

bd08b2ac9b9a86b8803c919c5947620b.png

启动类

387f0de087892f5df06dbed44f9030dd.png

6.在消费者服务工程的controller类中注入feginservice接口,通过接口去调用提供者服务接口

@AutowiredDeptFeignService deptFeignService;  //注入feginservice接口

7.在消费者服务工程的yml配置文件中配置

#开启服务熔断降级机制

feign:

hystrix:

enabled: true

c7d6378b2b4c31aafdeff1007fbbf58e.png

总结:

当用户请求访问消费者服务中的一个方法,

该方法中有代码 deptFeignService接口去调用提供者服务接口,

比如deptFeignService.setRedisExpire(arg0,arg1,arg2)

服务会根据@FeignClient(value = "prodiver-service" ,fallbackFactory = DeptFeignServiceFallBackFactoy.class) 找到对应的服务,执行对应的方法

如果在执行方法过程中发生异常,会自动快速执行DeptFeignServiceFallBackFactoy中的对应方法,返回一个有好的提示给用户客户端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值