Feign是一个声明式web服务客户端。使用Feign可以让web服务客户端编写更加简单。它包括可插入的注解支持,包括Feign注解和JAX-RS注解。Feign也支持可插入的编码器和解码器。SpringCloud添加了SpringMVC注解的支持,当使用SpringWeb时使用相同的HttpMessageConverters
。当使用Feign时,SpringCloud集成了Ribbon和Eureka,用来提供负载均衡。
新建maven工程spring-cloud-service-provider
(参考Eureka服务端和客户端的创建),修改spring.application.name
为service-provider
。
创建一个简单的controller
@RestController
public class ServiceProviderController {
@GetMapping
public String sayHello() {
return "hello";
}
}
spring-cloud-service-consumer
,修改spring.application.name
为service-consumer
。@EnableFeignClients
注解开启Feign的支持。@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
ServiceProviderFeignClient
接口,并增加@FeignClient
注解,其中value
为我们刚刚启动的服务名。@FeignClient("service-provider")
public interface ServiceProviderFeignClient {
@RequestMapping(value = "sayHello", method = RequestMethod.GET)
String sayHello();
}
@RestController
public class ServiceConsumerController {
@Autowired
private ServiceProviderFeignClient feignClient;
@GetMapping("sayHello")
public String sayHello() {
return feignClient.sayHello();
}
}
spring-cloud-service-consumer
,查看Eureka监控页面,发现增加了刚刚启动的service-consumer服务。上面大概介绍了一下Fegin的基本使用,但是有一个问题。上面service-provider服务提供的方法是在service-consumer中编写的。但是在实际使用中,多个不同服务消费方调用同一个服务提供方接口的场景却很多,如果调用代码都是在服务消费方。编写,则会有很多重复性的工作。所以我们需要优化上面的代码,将feign声明部分放在服务提供方。