1. Feign概述

1.1是什么

官网解释:
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign

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

综合说明:
Feign,假装,伪装。
OpenFeign 可以将提供者提供的 Restful 服务伪装为接口进行消费,消费者只需使用“feign 接口 + 注解”的方式即可直接调用提供者提供的 Restful 服务,而无需再使用 RestTemplate。
需要注意:
该伪装的Feign接口是由消费者调用,与提供者没有任何关系。
Feign仅是一个伪客户端,其不会对请求做任何处理。
Feign是通过注解的方式实现RESTful请求的。

1.2 官网

参考官网:https://spring.io/projects/spring-cloud-openfeign

1.3 Feign与OpenFeign

Spring Cloud D 版及之前的版本使用的是 Feign,而该项目现已更新为了 OpenFeign。所 以后续使用的依赖也发生了变化。

1.4 Feign能干什么

Feign旨在使编写Java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

2. Feign使用步骤

2.1 复制msc-consumer8080工程重命名为msc-consumer-feign7070工程

2.2 pom.xml修改

主要添加对feign的支持

<!--feign 依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.3 新建Feign接口并新增注解@FeignClient

package com.jd.service;

import com.jd.bean.Depart;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@FeignClient("msc-provider")
@RequestMapping("/provider/depart")
public interface DepartService {

    @PostMapping("/save")
    boolean saveDepart(@RequestBody Depart depart);

    @DeleteMapping("/del/{id}")
    boolean removeDepartById(@PathVariable("id") Integer id);

    @PutMapping("/update")
    boolean modifyDepart(@RequestBody Depart depart);

    @GetMapping("/get/{id}")
    Depart getDepartById(@PathVariable("id") int id);

    @GetMapping("/list")
    List<Depart> listAllDeparts();
}

2.4 修改JavaConfig类

将JavaConfig中的RestTemplate的创建方法注释

//@Configuration
public class DepartConfigure {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2.5 修改控制器

package com.jd.controller;

import com.jd.bean.Depart;
import com.jd.service.DepartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/consumer/depart")
public class SomeController {

    @Autowired
    private DepartService departService;

    @PostMapping("/save")
    public boolean saveHandler(@RequestBody Depart depart){
        return departService.saveDepart(depart);
    }

    @DeleteMapping("/del/{id}")
    public boolean delHandler(@PathVariable("id") int id){
        return departService.removeDepartById(id);
    }

    @PutMapping("/update")
    public boolean updateHandler(@RequestBody Depart depart){
        return departService.modifyDepart(depart);
    }

    @GetMapping("/get/{id}")
    public Depart getByIdHandler(@PathVariable("id") int id){
        return departService.getDepartById(id);
    }

    @GetMapping("/list")
    public List<Depart> listHandler(){
        return departService.listAllDeparts();
    }
}

2.6 修改启动类

在启动类上添加@EnableFeignClients注解

package com.jd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableFeignClients
@SpringBootApplication
public class MscConsumerFeignApplication {

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

2.7 超时设置

Feign 连接提供者、对于提供者的调用均可设置超时时限。

修改配置文件在msc-consumer-feign7070工程的配置文件中添加如下内容:

feign:
  client:
    config:
      default:
        connectTimeout: 5000 #指定Feign客户端连接提供者的超时时限
        readTimeout: 5000 #指定Feign客户端连接上提供者后,向提供者提交请求,从提交时刻开始到接收到响应这段时间的超时时间

3. k8s部署Feign

参考msc-consumer8080工程的部署

代码下载地址:
https://github.com/coderTomato/microservicecloud.git

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐