Feign是什么
Feign是Netflix公司开发的一个声明式的REST调用客户端;
Ribbon负载均衡、Hystrix服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似,每次开发都有很多相同的代码,因此Spring Cloud基于Netflix Feign整合了Ribbon和Hystrix两个组件,让我们的开发工作变得更加简单,就像Spring Boot是对Spring+SpringMVC的简化一样,Spring Cloud Feign对Ribbon负载均衡、Hystrix服务熔断进行简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了开发工作,同时还提供了一种声明式的Web服务客户端定义方式;
使用Feign实现消费者,我们通过下面步骤进行:
首先我们来创建一个普通的Spring Boot工程,取名为:05-springcloud-service-feign;
要添加的依赖主要是spring-cloud-starter-netflix-eureka-client和spring-cloud-starter-feign,如下:
<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-feign</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<!--Spring Cloud熔断器起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
第三步:添加注解
在项目入口类上添加@EnableFeignClients注解表示开启Spring Cloud Feign的支持功能;
定义一个HelloService接口,通过@FeignClient注解来指定服务名称,进而绑定服务,然后再通过SpringMVC中提供的注解来绑定服务提供者提供的接口,如下:
@FeignClient("01-springcloud-service-provider")
public interface HelloService {
@RequestMapping("/service/hello")
public String hello();
}
这相当于绑定了一个名叫01-springcloud-service-provider (这里01-springcloud-service-provider大小写01-SPRINGCLOUD-SERVICE-PROVIDER都可以 ) 的服务提供者提供的/service/hello接口;
我们服务提供者提供的接口如下:
@GetMapping("/service/hello")
public String hello() {
System.out.println("服务提供者1。。。。。。。");
return "Hello, Spring Cloud,Provider 1";
}
第五步:使用Controller中调用服务
接着来创建一个Controller来调用上面的服务,如下:
@RestController
public class FeignController {
@Autowired
HelloService helloService;
@RequestMapping("/web/hello")
public String hello() {
return helloService.hello();
}
}
第六步:属性配置
在application.properties中指定服务注册中心、端口号等信息,如下:
server.port=8082
#配置服务的名称
spring.application.name=05-springcloud-service-feign
#配置eureka注册中心地址
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8762:8762/eureka/
第七步:测试
依次启动注册中心、服务提供者和feign实现服务消费者,然后访问如下地址:http://localhost:8082/web/hello。
之前我们为了简化RestTemplate操作,将之封装在一个BookService中,但同时我们也发现BookService中的方法几乎都是模板式的,写起来很枯燥,Spring Cloud Feign对此进行了进一步的封装,简化了我们的封装操作。
Feign的基本使用,在HelloService类中声明接口时,我们发现这里的代码可以直接从服务提供者的Controller中复制过来,这些可以复制的代码Spring Cloud Feign对它进行了进一步的抽象,这里就用到了Feign的继承特性,Feign继承特性的方便之处了,这种方式用起来确实很方面,但是也带来一个问题,就是服务提供者和服务消费者的耦合度太高,此时如果服务提供者修改了一个接口的定义,服务消费者可能也得跟着变化,进而带来很多未知的工作量,因此小伙伴们在使用继承特性的时候,要慎重考虑。