7-1. Feign是什么?
Feign是NetFlix公司开发的一个声明式的REST调用客户端。
Ribbon负载均衡、Hystrix服务熔断器是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时存在的,而且配置也都非常相似,每次开发中有很多相同的代码,因此Spring Cloud基于Netflix Fegin整合了Ribbon和Hystrix两个组件,让我们的开发工作变得非常简单,就像Spring Boot是对Spring + Spring MVC的简化一样,Spring Cloud Feign对Ribbon负载均衡和Hystrix服务熔断器进行了简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了工作,同时还提供了一种声明式的web服务客户端定义方式;
7-2.使用Feign实现消费者
使用Feign实现消费者,我们通过以下步骤进行
-
创建一个Spring Boot工程
-
添加依赖 :主要添加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> <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注解来指定服务名称,进而绑定服务,然后再通过Spring MVC 中提供的注解来绑定服务提供者提供的接口,如下:
@FeginClient("xxx-xxx-xxx-provider") // 远程服务的名称 public interface HelloService{ @RequestMapping("/service/hello") public String hello(); }
这就相当于绑定了一个名叫xxx-xxx-xxx-provider(这里的名字大小写都可以)的服务提供者提供的/service/hello接口;
我们服务提供者的接口如下:
@GetMapping("/service/hello") public String hello(){ return "hello spring cloud,provider 1"; }
-
-
创建一个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=xxx-xxx-xxx-feign #配置eureka注册中心地址 eureka.client.service-url.defaultZone=http://eureka项目名:端口号/eureka
-
测试
依次启动注册中心、服务提供者、Feign实现服务消费者,然后访问地址:http://localhost:8082/web/hello
7-3. 使用Feign实现消费者的测试
-
负载均衡
- 我们知道,Spring Cloud提供了Ribbon来实现负载均衡,使用Ribbon直接注入RestTemplate对象即可,RestTemplate已经做好了负载均衡配置;在Spring Cloud下,使用Feign也可以直接实现负载均衡,定义一个注解有@FeginClient注解的接口,然后使用@RequestMapping注解到方法上映射远程的REST服务,此方法也是做好负载均衡配置的。
-
服务熔断
-
在application.properties文件开启hystrix功能
feign.hystrix.enabled=true
-
指定熔断回调逻辑
// 上面的注解中加一个fallback参数 @FeignClient(name="spring-cloud-service-provider",fallback=MyFallback.class) // 远程服务的名称) //下面是出现异常时回调的函数 @Component public class MyFallback implements HelloService{ @Override public String hello(){ retrun "远程调用服务出现异常"; } }
3.服务熔断获取异常信息
为@FeignClient修饰的接口上加上fallback方法可以实现远程服务发生异常后进行服务的熔断,但是不能获取到远程服务的异常信息,要获取远程服务的信息,怎么办?此时可以使用fallbackFactory
// 上面的注解中加一个fallback参数 @FeignClient(name="spring-cloud-service-provider",fallbackFactory=MyFallbackFactory.class) //下面是出现异常时回调的函数 FallbackFactory泛型为有@FeignClient注解的接口类名称 @Component public class MyFallbackFactory implements FallbackFactory<HelloService>{ @Override public HelloService create(Throwable throwable){ return new HelloService(){ @Override public String hello(){ return throwable.getMessage(); } } } }
-