Spring Cloud Feign声明式服务消费介绍和简单使用

一、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();
        }
     };
}
}
上一篇:java之学习记录 7 - 1 - 分布式系统架构解决方案Dubbo 实战(中)


下一篇:RPC版 “Hello World”