您的位置:

使用SpringBoot和Feign实现RESTful服务调用——从入门到精通

一、Feign简介

Feign是一种声明式的RESTful客户端,可以与Spring Cloud Eureka和Spring Cloud Ribbon进行整合,以提供负载均衡的HTTP客户端实现。使用Feign可以使得编写RESTful客户端变得更加简单,Feign依据RESTful服务的接口定义去生成相关的HTTP客户端,开发人员只需要定义接口,然后使用Java的Annotation去描述接口定义,Feign会根据这些Annotation自动生成相关的代理实现。

Feign可以通过Ioc容器(如Spring Boot)去使用,使用Feign远程调用RESTful接口的代码非常简单,只需要定义接口并添加相关注解即可。

二、使用Feign调用RESTful服务

使用Feign进行RESTful服务调用包含以下三个步骤:

第一步:添加依赖


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

第二步:创建Feign代理接口

在Spring Boot工程中,定义Feign接口的方法就相当于定义一个Feign客户端,在实现接口中通过配置URL实现“远程调用”。


@FeignClient(name = "xxxx")
public interface DemoFeignService {
 
    @RequestMapping(value = "/demo/xxx", method = RequestMethod.GET)
    String xxx();
 
    @RequestMapping(value = "/demo/yyy", method = RequestMethod.GET)
    String yyy(@RequestParam("name") String name);
}

这里需要注意的是,在Feign接口的定义中使用了Spring MVC的注解,包括RequestMapping和RequestParam,同时使用了FeignClient定义了一个客户端的名称,这个名称对应了远端服务在Eureka上的注册名称。

第三步:使用Feign代理接口

可以在控制器中使用@Autowired的方式来注入Feign接口,然后直接调用该接口的相关方法,就实现了RESTful服务的调用。


@RestController
public class DemoController {
 
    @Autowired
    private DemoFeignService demoFeignService;
 
    @RequestMapping("/demo")
    public String demo() {
        return demoFeignService.xxx();
    }
 
    @RequestMapping("/demo/{name}")
    public String demo(@PathVariable String name) {
        return demoFeignService.yyy(name);
    }
}

三、使用Spring Boot集成Feign和Ribbon实现负载均衡

我们可以通过SpringBoot和Feign的组合实现负载均衡。Feign默认整合了Eureka和Ribbon,因此使用起来非常简单。需要注意的是需要先引入Spring Cloud Eureka的依赖。

第一步:添加依赖


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

第二步:添加注解@EnableFeignClients和@EnableEurekaClient

在Spring Boot启动类上添加@EnableFeignClients注解启用Feign,同时添加@EnableEurekaClient注解启用注册中心客户端。


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

第三步:使用Feign和Ribbon实现负载均衡

使用Feign和Ribbon实现负载均衡,只需要在Feign接口定义上添加一个serviceId属性用于标识服务的名称。Feign会自动通过Ribbon和Eureka去获取远程服务的地址。


@FeignClient(serviceId = "demo-service")
public interface DemoFeignService {
 
    @RequestMapping(value = "/demo/xxx", method = RequestMethod.GET)
    String xxx();
 
    @RequestMapping(value = "/demo/yyy", method = RequestMethod.GET)
    String yyy(@RequestParam("name") String name);
}

以上为使用SpringBoot和Feign实现RESTful服务调用的完整思路。当然,实际应用中需要建立相应的服务注册中心,进行服务发现。这里只是提供了最基础的实现方式。