本文是Spring Cloud专栏的第七篇文章,了解前六篇文章内容有助于更好的理解本文:html
Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是咱们Spring Cloud中进行微服务开发很是基础的组件,在使用的过程当中咱们也发现它们通常都是同时出现的,并且配置也都很是类似,每次开发都有不少相同的代码,所以Spring Cloud基于Netflix Feign整合了Ribbon和Hystrix两个组件,让咱们的开发工做变得更加简单, 就像Spring boot是对Spring+ SpringMVC的简化, Spring Cloud Feign对Ribbon负载均衡、 Hystrⅸ服务熔断进行简化,在其基础上进行了进一步的封装,不只在配置上大大简化了开发工做,同时还提供了一种声明式的Web服务客户端定义方式。使用方式相似Dubbo的使用方式。测试
一、建立消费者服务命名为(springcloud-service-feign)fetch
二、添加依赖url
<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>
三、在启动类上添加注解
@EnableFeignClients
四、声明服务
定义一个HelloService接口,经过@FeignClient注解来指定服务名称进而绑定服务,而后在经过Spring MVC中提供的注解来绑定服务提供者的接口,以下:
//使用feign的客户端注解绑定远程的名称,名称能够是大写,也能够小写 @FeignClient(value = "springcloud-service-provider") public interface HelloService { //声明一个方法,这个方法就是远程的服务提供者提供的方法 @RequestMapping("/provider/hello") public String hello(); }
五、使用Controller中调用服务,代码以下
@Autowired private HelloService helloService; @RequestMapping("/hello") public String hello(){ //调用声明式接口方法,实现对远程服务的调用 return helloService.hello(); }
六、application.yml配置以下
spring: application: name: springcloud-service-feign server: port: 9091 eureka: client: service-url: defaultZone: http://localhost:8700/eureka #客户端每隔30秒从Eureka服务上更新一次服务信息 registry-fetch-interval-seconds: 30 #须要将个人服务注册到eureka上 register-with-eureka: true #须要检索服务 fetch-registry: true #心跳检测检测与续约时间 instance: #告诉服务端,若是我10s以内没有给你发心跳,就表明我故障了,将我剔除掉,默认90s #Eureka服务端在收到最后一次心跳以后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待本身) lease-expiration-duration-in-seconds: 10 #每隔2s向服务端发送一次心跳,证实自已依然活着,默认30s #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端本身会按照该规则) lease-renewal-interval-in-seconds: 2
七、启动测试,访问地址http://localhost:9091/feign/hello
负载均衡:
Spring Cloud提供了Ribbon来实现负载均衡,使用Ribbo直接注入一个RestTemplate对象便可, RestTemplate已经作好了负载均衡的配置在Spring Cloud下,使用 Feign也是直接能够实现负载均衡的,定义一个有@FeignClient注解的接口,而后使用@RequestMappin注解到方法上映射远程的REST服务,此方法也是作好负责均衡配置的。
服务熔断:
一、在 application.yml文件开启hystrix功能
#开启hystrix熔断机制 feign: hystrix: enabled: true
二、指定熔断回调逻辑
@FeignClient(value = "springcloud-service-provider", fallback = MyFallback.class)
@Component public class MyFallback implements HelloService { @Override public String hello() { return "远程服务不可用,暂时采用本地逻辑代替。。。。。"; } }
三、测试,让服务提供者超时就好了
若是须要捕获提供者抛出的异常能够用:
@FeignClient(value = "springcloud-service-provider", fallbackFactory = MyFallbackFactory.class)
@Component public class MyFallbackFactory implements FallbackFactory<HelloService> { @Override public HelloService create(Throwable throwable) { return new HelloService() { @Override public String hello() { return throwable.getMessage(); } }; } }
详细参考案例源码:https://gitee.com/coding-farmer/springcloud-learn
原文出处:https://www.cnblogs.com/coding-farmer/p/12034706.html