一、什么是Feign
Feign是一个声明式的http客户端,使用Feign可以实现声明式REST调用,它的目的就是让Web Service调用更加简单。Feign整合了Ribbon和SpringMvc注解,这让Feign的客户端接口看起来就像一个Controller。 如下图所示:
在上图所示当中,我们将之前通过RestTemplate和Ribbon来进行发送调用请求,现在换成了Feign来替代他们,Feign中整合了RestTemplate和Ribbon。
二、使用Feign的步骤
1.创建工程 springcloud-pay-server,用来集成Feign
2.导入依赖,需要的依赖放在下面
<dependencies>
<!--1.导入EurekaClient的包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--2.导入Feign的包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--web包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--user-common-->
<dependency>
<groupId>cn.itsource.springboot</groupId>
<artifactId>springcloud-user-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
3.配置启动类
/`
* 支付的启动类
* @EnableFeignClients :开启Feign支持
*/
@SpringBootApplication
@EnableFeignClients
public class PayServerApplication1040
{
public static void main( String[] args )
{
SpringApplication.run(PayServerApplication1040.class);
}
}
4.配置yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1010/eureka/
instance:
prefer-ip-address: true #使用ip地址进行注册
instance-id: pay-server #实例ID
spring:
application:
name: pay-server
server:
port: 10040
logging:
level:
org.example.inter.UserFeignClient: debug
feign:
hystrix:
enabled: true #开启熔断支持
5.配置Feign接口
@FeignClient("user-server")
public interface UserFeignClient {
//订单服务来调用这个方法 http://localhost:1020/user/10
// @GetMapping(value = "/user/{id}" )
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
User getById(@PathVariable("id")Long id);
}
6.编写Controller实现接口
//支付服务的controller
@RestController
public class PayController{
@Autowired
private UserFeignClient userFeignClient;
//浏览器来掉
@RequestMapping("/pay/{id}")
public User getById(@PathVariable("id")Long id){
//使用Feign调用用户服务获取User
return userFeignClient.getById(id);
}
}
三、Feign的工作原理(重点)
要使用Feign,我们除了导入依赖之外,需要主配置类通过@EnableFeignClients(value="")
注解开启Feign,也可以通过value属性指定了Feign的扫描包。同时我们需要为Feign编写客户端接口,接口上需要注解@FeignClient
标签。 当程序启动,注解了@FeignClient的接口将会被扫描到然后交给Spring管理
。
当请求发起,会使用jdk的动态代理方式代理接口,生成相应的RequestTemplate
,Feign会为每个方法生成一个RequestTemplate同时封装好http信息,如:url,请求参数等等
最终RequestTemplate生成request请求,交给Http客户端
(UrlConnection ,HttpClient,OkHttp)。然后Http客户端会交给LoadBalancerClient,使用Ribbon的负载均衡发起调用。