Springcloud(二) feign
Feign
Spring Cloud Feign对 Ribbon 负载均衡、Hystrix 服务熔断进行简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了开发工作,同时还提供了一种声明式的 Web 服务客户端定义方式。
使用 Feign 实现消费者
-
创建spring boot工程,并导入依赖
<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>
-
在项目入口类上添加@EnableFeignClients 注解表示开启 Spring Cloud Feign
@SpringBootApplication @EnableEurekaClient @EnableFeignClients public class SpringcloudConsumerApplication { …… }
-
定义一个 HelloService 接口,通过@FeignClient 注解来指定服务名称,进而绑定服务,然后再通过 SpringMVC 中提供的注解来绑定服务提供者提供的接口。
@FeignClient(name="springcloud-client") public interface HelloService { /** * 声明一个方法,这个方法就是远程的服务提供者提供的那个方法 * * @return */ @RequestMapping("/service/hello") String hello(); }
服务提供者:
@RestController public class HelloController { @GetMapping("/service/hello") public String hello() { System.out.println("服务提供者1。。。。。。。"); return "Hello, Spring Cloud,Provider 1"; } }
-
在服务消费者模块中创建一个controller,
@RestController public class FeignController { @Autowired private HelloService helloService; @RequestMapping("/web/hello") public String hello () { //调用声明式的接口方法,实现对远程服务的调用 return helloService.hello(); } }
-
启动服务消费者,访问localhost:8764/web/hello
使用 Feign 实现负载均衡和服务熔断
-
负载均衡:@FeignClient 注解的接口,然后使用@RequestMapping 注解到方法上映射远程的 REST 服务,此方法是做好负责均衡配置的。
-
服务熔断
-
导入 hystrix 依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
-
在 application.yml 文件中添加:
feign: hystrix: enabled: true
-
指定熔断回调逻辑,自定义回调类实现接口,并实现对应的方法,即为对应方法的熔断回调逻辑。
@FeignClient(name="springcloud-client", fallback = MyFallback.class)
@Component public class MyFallback implements HelloService { @Override public String hello() { return "发生异常了"; } }
-
启动:
-
为@FeignClient 修饰的接口加上 fallback 方法可以实现远程服务发生异常后进行服务的熔断,但是不能获取到远程服务的异常信息,如果要获取远程服务的异常信息,此时可以使用 fallbackFactory:
@FeignClient(name="springcloud-client", fallbackFactory = MyFallbackFactory.class)
@Component public class MyFallbackFactory implements FallbackFactory<HelloService> { @Override public HelloService create(Throwable throwable) { return () -> throwable.getMessage(); } }
-