Feign

SpringCloud各个服务之间是通过RestApi调用的,像HttpClient、restTemplate用起来都比较麻烦。Feign就提供了一种优雅的方式。

pom

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-dependenciesartifactId>
            <version>Greenwich.SR2version>
            <type>pomtype>
            <scope>importscope>
        dependency>
    dependencies>
dependencyManagement>

<dependency>
  <groupId>org.springframework.bootgroupId>
     <artifactId>spring-boot-starter-webartifactId>
 dependency>
 <dependency>
     <groupId>org.springframework.cloudgroupId>
     <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
 dependency>
 <dependency>
     <groupId>org.springframework.cloudgroupId>
     <artifactId>spring-cloud-starter-openfeignartifactId>
 dependency>

配置

server.port=9001
spring.application.name=feign-consumer
# 配置中心的地址
eureka.client.service-url.defaultZone=http://192.168.1.4:1111/eureka

# 这个必须开启,不然服务降级不生效
feign.hystrix.enabled=true

使用

启动类加注解

@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class FeignConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignConsumerApplication.class, args);
    }

}

代码中使用

// 调用的服务名是:hello-service。断路之后调用:HelloServiceImpl中相应的方法
@FeignClient(value = "hello-service",fallback = HelloServiceImpl.class)
public interface HelloService {

	// 和hello-service相应的api对应方法名返回值类型,参数列表都要对应
    @RequestMapping("/hello")
    String hello();
}

// hello调用超时,就会使用短路器中的返回值
@Component
public class HelloServiceImpl implements HelloService {
    @Override
    public String hello() {
        return "error";
    }
}

@RestController
public class ConsumerController {

    @Autowired
    private HelloService helloService;

    @RequestMapping("feign-consumer")
    public String hello() {
        // 这里就会去调用其他的相应的api了
        return helloService.hello();
    }
}

你可能感兴趣的:(Spring,Cloud)