Feign

Feign 是一个声明式 WebService 客户端。使用 Feign 能让编写的 WebService 客户端更加简洁,它的使用方法式定义一个接口,然后在上面添加注解。Spring Cloud 对 Feign 进行了封装,使其支持了 Spring MVC 标准注解和 HttpMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡

 

前面(Ribbon负载均衡)在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。
Feign 在此基础上做了进一步的封装,由它来帮助我们定义和实现依赖服务接口的定义。使用 Feign 只需要创建一个接口并使用一个注解来配置它即可。这就类似于我们在 dao 层的接口上标注 @Mapper 注解一样。这样的话,即完成了对服务提供方的接口绑定,简化了使用 Spring Cloud Ribbon 时的开发量。
 

 

使用Feign

新建consumer 消费者module 创建方法参照前面的(springcloud搭建)

1.导入Fergn依赖包 ,需要导入common公共模块,feign客户端存放位置

<dependencies>
        <!-- 引入自己定义的 microservice-common 通用包,可以使用common模块中的Order类 -->
        <dependency>
            <groupId>com.demo</groupId>
            <artifactId>microservice-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- spring boot web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--eureka Client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- feign的支持 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

2.添加启动类

在consumer的中新建一个OrederConsumer2,前面已经有OrederConsumer服务

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrederConsumer2 {

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

启动类需要添加注解 @EnableFeignClients,表示启用 Feign 客户端 

 

3.在common中搭建Feign客户端

新建一个OrderClientService接口 加上FergnClient注解

@FeignClient(value = "MICROSERVICE-ORDER")
public interface OrderClientService {

    @GetMapping("provider/order/get/{id}")
    TOrder getOrder(@PathVariable(value = "id") Long id);

    @GetMapping("/provider/order/get/list")
    List<TOrder> getAll();

}

4.Fergn客户端使用

在consumer中创建订单消费者接口

/**
 * 订单消费服务
 * @author shengwu ni
 */
@RestController
@RequestMapping("/consumer/order")
public class OrderConsumerController {

    /**
     * 上面定义的 Feign Client
     */
    @Resource
    private OrderClientService orderClientService;

    @GetMapping("/get/{id}")
    public TOrder getOrder(@PathVariable Long id) {
        return orderClientService.getOrder(id);
    }

    @GetMapping("/get/list")
    public List<TOrder> getAll() {
        return orderClientService.getAll();
    }
}

 

启动 eureka 集群、三个订单提供服务和这个带有 Feign 的服务消费方(端口 9001)。通过在浏览器中访问:http://localhost:9001//consumer/order/get/1 可以看到,轮流访问三个订单服务。说明 Feign 默认是集成了 Ribbon 的轮询方案。

 

 Feign 结合 Ribbon 切换均衡算法

# feign和ribbon结合,指定策略。feign默认的是轮询的策略,这里的配置可以自定义
MICROSERVICE-ORDER:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

MICROSERVICE-ORDER 表示作用到哪个微服务,com.netflix.loadbalancer.RandomRule 即前面介绍 Ribbon 时里面的随机策略,当然,我们也可以指定为其他策略,包括我们自己定义的,只要把相应的包路径写到这即可,很方便。