Spring Cloud (六):声明式 REST 请求 Feign

调用 Rest 接口可以使用 RestTemplate 比如

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/query/{id}")
    public String qurey(@PathVariable Long id) {
        String forObject = restTemplate.getForObject("http://consul-service-1/product/" + id, String.class);
        return forObject;
    }

可以看到需要拼接 URL,而 Feign 则提供了便捷优雅的方式

Feign 是 Netflix 开发的声明式、模板化的 HTTP 客户端

Feign 需要使用服务发现 Eureka 或 Consul,以及负载均衡 Robbin,这里使用 Consul

因为 Consul 已经包含了 Robbin 依赖,所以不用再添加 Robbin 依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

需要配置 Consul 信息

server:
  port: 9000

spring:
  application:
    name: spring-cloud-feign-example
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        # 设置不需要注册到 consul 中
        register: false

主程序通过 @EnableFeignClients 注解开启 Spring Cloud Feign 功能

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

Feign 接口

@FeignClient(name="consul-service-1")
public interface DemoFeignClient {
    // 这个函数会自动从 Consul 获取 producer consul-service-1 的信息,然后发送请求到相应的 URL
    @RequestMapping(value="/product/{id}", method = RequestMethod.GET)
    public String findProductById(@PathVariable("id") Long id);
}

在 consul producer 项目加入

    @GetMapping("/product/{id}")
    public String product(@PathVariable("id") String id) {
        return "price of product " + id + " is 100";
    }

添加 consumer 的 controller

@RestController
public class Controller {
    @Autowired
    private DemoFeignClient demoFeignClient;
    
    @RequestMapping("/query/{id}")
    public String qurey(@PathVariable Long id) {
        // 调用 Feign Client,本质上还是调用 RestTemplate 的方式,Feign 会进行转化
        return demoFeignClient.findProductById(id);
    }
}

访问 http://localhost:9000/query/123
返回 price of product 123 is 100


Feign 的一些配置

feign:
  client:
    config:
      feignName:      ## 定义 FeginClient 的名称,可以是任意名字
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full
  compression:
    request:
      enabled: true      ## 开启请求压缩
    response:
      enabled: true      ## 开启响应压缩

也可以通过代码的方式配置



原文地址:https://www.cnblogs.com/moonlight-lin/p/14221457.html