一、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服务调用的完整思路。当然,实际应用中需要建立相应的服务注册中心,进行服务发现。这里只是提供了最基础的实现方式。