- 在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。但是,用起来最方便、最优雅的还是要属Feign了。Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。
- feign的优势就是提供统一的抽象,通过接口来实现远程调用,更加符合我们的编程习惯。实际上feign就是对restTemplate和ribbon进一步封装,使之使用更加简单、高效。通过Feign, 我们能把HTTP远程调用对开发者完全透明,得到与调用本地方法一致的编码体验。这一点与阿里Dubbo中暴露远程服务的方式类似,区别在于Dubbo是基于私有二进制协议,而Feign本质上还是个HTTP客户端。如果是在用Spring Cloud Netflix搭建微服务,那么Feign无疑是最佳选择。
一、入门体验
1、搭建注册中心和服务提供者
(1)搭建eureka注册中心
server-url=http://localhost:8081/eureka/
(2)搭建eureka服务提供中心
- spring.application.name=eureka-client
- 提供restful方法为:
@RequestMapping("/hello/{name}")
public String hello(@PathVariable String name){
return "hello "+name;
}
2、搭建服务消费中心(使用feign)
(1)一如feign相关包,老版本用spring-cloud-starter-feign,Finchley.SR1版本的用spring-cloud-starter-openfeign
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(2)定义接口
/**
* 定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务
*/
@FeignClient(name = "EUREKA-CLIENT")
public interface HelloService {
@RequestMapping("/hello/{name}")
String hello(@PathVariable("name") String name);
}
(3)创建controller并访问
@Autowired
private HelloService helloService;
@RequestMapping("/hello")
public String hello(){
return helloService.hello("qiu");
}
(4)开启feign服务
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class RibbonConsumer1Application {
public static void main(String[] args) {
SpringApplication.run(RibbonConsumer1Application.class, args);
}
}
(5)配置
server.port=8083
spring.application.name=feign-consumer
#向注册中心注册并获取相关的服务提供者信息
eureka.client.service-url.defaultZone=http://localhost:8081/eureka/
(6)测试
3、feign调用整个流程
1、首先通过@EnableFeignCleints注解开启FeignCleint
2、根据Feign的规则实现接口,并加@FeignCleint注解
3、程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中。
4、当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
RequesTemplate在生成Request
5、Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
6、最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
二、feign一些高级功能
- 与ribbon搭配使用
- 重试机制
- 与hystrix搭配使用
- 替换底层连接方式(比如替换成httpClient)
- feign的配置(默认和自定义配置)