[笔记]SpringCloud学习09: OpenFeign服务调用

Feign 简介

Feign是一个声明式的WebService客户端。它的出现使开发WebService客户端变得很简单。使用Feign只需要创建一个接口加上对应的注解。

Feign 是一种声明式、模板化的HTTP 客户端。在SpringCloud 中使用Feign,可以做到使用HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP 请求。

Feign 和 OpenFeign

OpenFeignFeign的基础上支持了SpringMVC的注解。

OpenFeign中,除了自身提供的注解之外,还支持使用JAX-RS注解,或者SpringMVC注解。

OpenFeign@FeignClient注解可以解析SpringMVC@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

OpenFeign同样使用声明式方式定义Web服务客户端,其次,OpenFeign还可以通过集成RibbonEureka来实现负载均衡的HTTP 客户端。

OpenFeign 的使用

在服务消费方的pom.xml中,引入以下依赖

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

创建相应的Service接口

package com.ilirus.springcloud.service;

import com.ilirus.springcloud.entities.CommonResult;
import com.ilirus.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

// value为服务提供方在Eureka中注册的名称
// RequestMapping为提供方对应的请求地址
@FeignClient(value = "irs-provider-payment")
public interface PaymentFeignService {
    @GetMapping("/payment/query/{id}")
    public CommonResult<Payment> getPaymentByID(@PathVariable("id") Long id);
}

创建Controller

package com.ilirus.springcloud.controller;

import com.ilirus.springcloud.entities.CommonResult;
import com.ilirus.springcloud.entities.Payment;
import com.ilirus.springcloud.enums.Status;
import com.ilirus.springcloud.service.PaymentFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@RequestMapping("/consumer")
@Slf4j
public class OrderController {
    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping("/payment/query/{id}")
    public CommonResult query(@PathVariable("id") Long id) {
        return paymentFeignService.getPaymentByID(id);
    }
}

在启动类中使用@EnableFeignClients注解

package com.ilirus.springcloud;

import com.ilirus.springcloud.config.ApplicationontextConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 { ... }