什么是Feign

    Feign是微服务架构中的一种服务调用方式,通过声明方式进行微服务调用,Feign可以帮助我们更加便捷编写接口。

 

Feign的使用

    由三个部分组成:服务提供者,服务消费者,Feign客户端

    服务提供者:

服务接口,接口定义需要加上@RequestMapping注解

public interface IFeignService {

    @RequestMapping("/getMember")
    String getMember();
}

    服务的具体实现,因为微服务是RPC远程调用,客户端是通过http方式进行调用的,所以实现累要加上@RestController暴露出来,跟controller写法一样

@RestController
public class FeignServiceImpl  implements IFeignService{

    @Override
    @RequestMapping("/getMember")
    public String getMember() {
        return "i am member";
    }
}

服务启动类,加上@EnableFeignClients表示开启Feign功能

@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class ClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class,args);
    }
}

Feign客户端

     Feign客户端实际上就是一个接口,但是这个接口继承了服务提供者的接口,通过@FeignClient注解声明需要调用的服务别名,由于是继承了提供者的接口,这里就不需要将getMember重新定义,减少了重复代码

@FeignClient(name = "eureka-client")
public interface IFeignClient extends IFeignService{
}

服务消费者

服务接口,定义消费者服务的接口,同样要加上RequestMapping(因为同样是服务,也有可能被其他服务调用)

public interface ICustomerService {

    @RequestMapping("/toGetMember")
    String toGetMember();
}

 服务实现类,与提供者的实现累类似的,需要加上@RestController暴露出来,但这里是通过Feign调用提供者的服务,所以要创建Feign客户端实例,通过该实例进行调用。

    这里注意一个坑,因为通过IFeignClient调用的时候实际上最终是调用到FeignServiceImpl实现类的方法,所以CustomerServiceImpl和FeignServiceImpl的RequestMapping不能有重复,否则启动的时候会存在两个相同的RequestMapping而导致路径匹配冲突而无法启动。

@RestController
public class CustomerServiceImpl implements  ICustomerService{

    @Autowired
    IFeignClient iFeignClient;

    @Override
    @RequestMapping("/toGetMember")
    public String toGetMember() {
        return iFeignClient.getMember();
    }
}

启动类,同样加上EnableFeignClients

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class FeignClientApplication {

    public static void main(String[] args){
        SpringApplication.run(FeignClientApplication.class,args);
    }

}

如何传参

     上面的是无参形式的服务调用,有参数的话跟我们平时发送web请求类似的,通过@RequestParam和@RequestBody注解传参,不同的是,这里的注解需要是接口和实现类都需要加上

 

使用Feign的好处

1.接口编写更加便捷。使用RestTemplate调用接口需要将url拼好进行调用,而Feign客户端只需要声明调用的服务id,不需要人工去拼接,无论是哪里需要调用直接调用客户端即可。

2.Feign内置ribbon负载均衡,如果是使用RestTemplate则需要通过@LoadBalanced注解开启

3.Feign内置Hystrix,但是默认关闭,毕竟如果都开启的话,那对性能消耗很大