一、Spring Cloud Feign 是什么?
Spring Cloud 基于 NetflixFeign 整合了 Ribbon 和 Hystrix 两个组件,让我们的开发工作变得更加简单。Spring Cloud Feign是对 Ribbon 负载均衡、Hystrix 服务熔断进行简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了开发工作,同时还提供了一种声明式的 Web 服务客户端定义方式
二、Spring Cloud Feign的快速使用
注意:Feign已经有负载均衡了,如果要使用服务熔断,可以参考第三
(1)第一步:创建普通 Spring Boot 工程,取名为:05-springcloud-service-feign;并添加下面依赖
<dependencies>
<!--springboot开发web项目的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka客户端进行服务发现的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--spring cloud feign的起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
</dependencies>
<!--依赖管理必须加,要不然spring-cloud-starter-netflix-eureka-server版本无法做到-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--在本地仓库找不到就到官网去找-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
(2)第二步:项目入口类上添加@EnableFeignClients 注解表示开启 Spring Cloud Feign的支持功能;
@SpringBootApplication
@EnableFeignClients //表示开启 Spring Cloud Feign 的支持功能;
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
(3)第三步:定义一个 HelloService 接口,通过@FeignClient 注解来指定服务名称,进而绑定服务,然后再通过 SpringMVC 中提供的注解来绑定服务提供者提供的接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
//通过feign客户端注解绑定远程服务(提供者)的名称,远程服务的名称的可以大小写
@FeignClient("02-springcloud-service-provider")
public interface HelloService {
//声明一个方法,这个方法就是远程服务提供者提供的那个方法,路径名称就是提供者里面的方法路径
//这个方法具体实现在提供者
@RequestMapping("/service/hello")
String hello();
}
(4)第四步:使用 Controller 中调用这个服务
import com.chang.controller.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@RequestMapping("/web/hello")
public String hello(){
return helloService.hello();
}
}
(5)第五步:在 application.properties配置文件配置下面信息
erver.port=8082
# 配置服务的名称
spring.application.name=05-springcloud-service-feign
# 配置 eureka 注册中心地址
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8762:8762/eureka/
三、Feign中服务熔断的使用
(1)在 application.properties 文件开启 hystrix 功能
#开启 hystrix 功能
feign.hystrix.enabled=true
(2)修改上面Helloservice接口,指定熔断回调逻辑,添加fallback = MyFallback.class
//通过feign客户端注解绑定远程服务(提供者)的名称,远程服务的名称的可以大小写
@FeignClient(name="02-springcloud-service-provider",fallback =
MyFallback.class)
public interface HelloService {
//声明一个方法,这个方法就是远程服务提供者提供的那个方法,路径名称就是提供者里面的方法路径
//这个方法具体实现在提供者
@RequestMapping("/service/hello")
String hello();
}
(3)编写 MyFallback类回调业务处理
import com.chang.controller.service.HelloService;
import org.springframework.stereotype.Component;
@Component
public class MyFallback implements HelloService {
@Override
public String hello() {
return "远程服务不可用,暂时使用本地业务逻辑";
}
}
如果要在服务熔断中获取异常信息可以将(2)(3)依次改成下面的(4)(5)
(4)修改HelloService接口
@FeignClient(name="01-springcloud-service-provider", fallbackFactory =
MyFallbackFactory .class)
(5)编写MyFallbackFactory类
@Component
public class MyFallbackFactory implements FallbackFactory<HelloService> {
@Override
public HelloService create(Throwable throwable) {
return new HelloService() {
@Override
public String hello() {
return throwable.getMessage();
}
};
}
}