1. 简介
Feign是一个声明式的Web服务客户端,使用Feign可使得Web服务客户端的写入更加方便.它具有可插拔注释支持,包括Feign注解和JAX-RS注解、Feign还支持可插拔编码器和解码器、Spring Cloud增加了对Spring MVC注释的支持,并HttpMessageConverters在Spring Web中使用了默认使用的相同方式。Spring Cloud集成了Ribbon和Eureka,在使用Feign时提供负载平衡的http客户端。Fegin对Robbin进行了封装,如果需要配置自己的负载算法,可以自定义Ribbon的算法即可。 Spring Cloud Feign 提供的声明式服务绑定功能来实现对该服务接口的调用。
2. 实例
引入pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
引入application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8765
spring:
application:
name: eureka-feign-client
程序启动类上打上注解@EnableFeignClients
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaFeignClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaFeignClientApplication.class,args);
}
}
通过如上三个步骤就初步的具备了feign的功能了,我们结合之前的实例来做一个简单的Feign Client
首先新建一个EurekaFeignClient接口
@FeignClient(value="eureka-client",configuration = FeignConfig.class)
public interface EurekaClientFeign {
@RequestMapping("/hello")
String sayHiFromFeignClient(@RequestParam(value="name") String name);
}
这个接口是我们用来调用远程服务,value是远程调用其他服务的服务名。即调的远程服务的hello方法
然后配置FeignConfig配置类
@Configuration
public class FeignConfig {
@Bean
public Retryer feignRetryer(){
return new Retryer.Default(100,SECONDS.toMillis(1),5);
}
}
Configuration注解代表这是个注解类,注入了BeanName为feignRetryer的Retryer的Bean,这样Feign在远程调用失败之后会重试。
Service注入EurekaClientFeign的Bean,通过eurekaClientFeign来调用sayHiFromFeignClient方法
@Service
public class FeignService {
@Autowired
EurekaClientFeign eurekaClientFeign;
public String sayHi(String name){
return eurekaClientFeign.sayHiFromFeignClient(name);
}
}
最后补上controller方法
@RestController
public class FeignController {
@Autowired
FeignService feignService;
@RequestMapping("/hi")
public String syaHi(@RequestParam String name){
return feignService.sayHi(name);
}
}
这样每次http://localhost:8765/hi?name=llf
页面轮替呈现出
hi , my port is 8762,my name is llf
hi ,my port is 8763 , my name isllf