SpringCloud学习三:服务消费Feign

SpringCloud学习三:服务消费Feign

  •  2019 年 3 月 7 日
  •  456
  •  Java SpringCloud Feign 

Feign介绍

Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可以帮助我们更快捷、优雅地调用HTTP API。在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

准备工作

因为需要测试feign的负载均衡功能,所以我们需要修改一下上篇文章创建的client-eureka启动类中暴露的接口以便我们在访问的时候能识别出我们的feign-service请求的是哪个服务,如下:

@Value("${server.port}")
private String port;

@GetMapping("/hello")
public String hello(@RequestParam String name){
    return "hello "+ name +" ! from port "+ port;
}

创建Feign服务

首先创建一个Feign服务service-feign,pom.xml依赖如下:

<dependencies>
    <!-- eureka -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
    <!-- feign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--test-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

配置文件

spring:
  application:
    name: service-feign

server:
  port: 8764

eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

启动类

启动类添加@EnableFeignClients注解支持feign功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceFeignApplication {

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

创建feign接口

定义一个Feign接口来调用client-eureka中的暴露的/hello服务,代码如下:

@FeignClient("client-eureka")
public interface HelloConsumer {

    @GetMapping("/hello")
    String hello(@RequestParam("name") String name);
    
}

@FeignClient("client-eureka")注解标识要调用的服务是client-eureka,这个是在配置文件中的spring.application.name定义的,@GetMapping("/hello")标识要调用/hello方法,需要注意的是@RequestParam("name")中的参数"name"是必须要写的,否则启动时会报错。

暴露API

定义一个controller暴露名为hello的API接口,通过调用HelloConsumer接口来消费服务,代码如下:

@RestController
public class HelloController {

    @Autowired
    private HelloConsumer helloConsumer;

    @GetMapping("/hello")
    public String hello(@RequestParam String name) {
        return helloConsumer.hello(name);
    }

}

访问测试

启动server-eureka注册中心,再启动两次client-eureka作为服务提供者,端口号分别为8762和8763,最后启动本次创建的工程service-feign,端口8764。启动完成后访问localhost:8764/hello?name=搬码工,访问多次我们可以发现浏览器会交替显示:

hello 搬码工 ! from port 8762
hello 搬码工 ! from port 8763

源码地址

https://github.com/chenpeidong/spring-cloud-demo

扫一扫分享到微信

已有 条评论
写评论