美文网首页
SpringCloud组件:创建第一个Feign客户端

SpringCloud组件:创建第一个Feign客户端

作者: 淡若S悠然 | 来源:发表于2019-03-01 11:00 被阅读0次

    1. Feign简介

    Feign是一个声明式的Web服务客户端,它使得写Web服务变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,包括Feign注解和JAX-RS注解。Feign同时支持可插拔的编码器解码器Spring CloudSpringMVC添加了支持,同时在Spring Web中次用相同的HttpMessageConverter。当我们使用Feign的时候,Spring Cloud整和了RibbonEureka去提供负载均衡。

    Feign基于Netflix Feign实现,整合了Spring Cloud RibbonSpring Cloud Hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的Web服务客户端定义方式。

    Spring Cloud Netflix的微服务都是以HTTP接口的形式暴露的,所以调用方式有:

    • JDK原生的URLConnection
    • ApacheHttp Client
    • Netty的异步HTTP Client
    • SpringRestTemplate
    • Feign

    Feign是一个使用起来更加方便的HTTP客戶端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法。Feign还支持可插拔的编码器和解码器,Spring在用的时候增加了对@RequestMapping的处理,Feign的目的是尽量的减少资源和代码来实现和HTTP API的连接。通过自定义的编码解码器以及错误处理,可以编写任何基于文本的HTTP API

    github地址:https://github.com/OpenFeign/feign

    在源码中可以看到子模块包括RibbonHystrix,所以Feign是基于RibbonHystrix的声明式服务调用组件。Feign是一种声明式、模板化的HTTP客户端。

    2. 来源

    Feign使得Java HTTP客户端编写更方便。Feign灵感来源于RetrofitJAXRS-2.0WebSocketFeign最初是为了降低统一绑定DenominatorHTTP API的复杂度,不区分是否支持Restful

    3. 前期准备

    1. 一个服务注册中心tairan-spring-cloud-eureka,端口8761。参考SpringCloud组件:搭建Eureka服务注册中心
    2. 创建tairan-spring-cloud-feign-api核心工程,对外提供api接口。
    3. 创建服务提供者tairan-spring-cloud-feign-privder工程,提供/hello接口,启动三个实例,端口分别为100011000210003,并注册到服务中心。参考SpringCloud组件:将微服务提供者注册到Eureka服务中心
    4. 创建服务消费者tairan-spring-cloud-feign-consumer工程,提供/feign-hello接口,端口号为8080,并注册到服务中心。

    4. 构建项目

    4.1 创建tairan-spring-cloud-feign-api工程

    同样的是采用idea开发工具创建一个SpringBoot项目,然后引入Spring Cloud Feign依赖以及相关依赖,项目的pom.xml内容如下所示:

    ...//省略部分配置
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    ...//省略部分配置
    

    注意:网上有的文章说引入的依赖是spring-cloud-starter-feign,其实官方不再推荐使用,推荐使用spring-cloud-starter-openfeign

    4.1.1 创建HelloService接口

    tairan-spring-cloud-feign-api工程中只提供api接口,具体实现由tairan-spring-cloud-feign-privder工程实现。代码如下:

    package com.tairan.chapter.feign.api;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @FeignClient(value = "tairan-spring-cloud-feign-provider")
    public interface HelloService {
    
        @RequestMapping("/hello")
        String getMessage() throws Exception;
    
    }
    

    4.2 创建tairan-spring-cloud-feign-privder工程

    同样的是采用idea开发工具创建一个SpringBoot项目,然后引入Spring Cloud Feign依赖以及tairan-spring-cloud-feign-api依赖,项目的pom.xml内容如下所示:

    ...//省略部分配置
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <skipTests>true</skipTests>
    
        <spring-cloud.version>Greenwich.RC1</spring-cloud.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.tairan.chapter</groupId>
            <artifactId>tairan-spring-cloud-feign-api</artifactId>
        </dependency>
    </dependencies>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    ...//省略部分配置
    

    4.2.1 创建HelloController

    创建HelloController类,并实现HelloService接口,代码如下:

    package com.tairan.chapter.feigin.provider.controller;
    
    import com.tairan.chapter.feign.api.HelloService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController implements HelloService {
    
        @Autowired
        private Environment environment;
    
        @Override
        public String getMessage() {
            return environment.getProperty("spring.application.name") + ":" + environment.getProperty("server.port", "8080");
        }
    }
    

    Environment获取项目配置信息,本接口中返回项目服务名与端口号。

    4.3 创建tairan-spring-cloud-feign-consumer工程

    同样的是采用idea开发工具创建一个SpringBoot项目,然后引入Spring Cloud Feign依赖以及tairan-spring-cloud-feign-api依赖,项目的pom.xml内容如4.2 创建tairan-spring-cloud-feign-privder工程

    4.3.1 入口类

    在应用主类中通过@EnableFeignClients注解开启Feign功能,因为需要注册到服务中心,所以还需要@EnableDiscoveryClient注解,代码如下所示:

    package com.tairan.chapter.feign.consumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    // 通过@EnableFeignClients注解开启Spring Cloud Feign的支待功能。
    @EnableFeignClients("com.tairan.chapter.feign.api")
    public class TairanSpringCloudFeignConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(TairanSpringCloudFeignConsumerApplication.class, args);
        }
    
    }
    

    4.3.2 创建FeignHelloController

    创建FeignHelloController实现对Feign客户端的调用,代码如下:

    package com.tairan.chapter.feign.consumer.controller;
    
    import com.tairan.chapter.feign.api.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 FeignHelloController {
    
        @Autowired
        private HelloService helloService;
    
        @RequestMapping("/feign-hello")
        public String getNodeInfo() throws Exception {
            return helloService.getMessage();
        }
    
    }
    

    5. 运行测试

    我们已经完成所需工程的创建以及配置工作,接下来我们按照下面的步骤进行执行测试:

    1. 启动服务注册中心tairan-spring-cloud-eureka
    2. 通过如下命令启动tairan-spring-cloud-feign-privder三个实例
    java -jar tairan-spring-cloud-feign-provider-1.0-SNAPSHOT.jar --server.port=10001
    java -jar tairan-spring-cloud-feign-provider-1.0-SNAPSHOT.jar --server.port=10002
    java -jar tairan-spring-cloud-feign-provider-1.0-SNAPSHOT.jar --server.port=10003
    
    1. 启动tairan-spring-cloud-feign-consumer服务
    2. 访问tairan-spring-cloud-feign-consumer工程的/feign-hello接口,链接:http://localhost:8080/feign-hello

    所以服务启动完成后,打开tairan-spring-cloud-eureka管理界面地址:http://localhost:8761,如下图所示:

    Eureka Server管理界面

    5.1 访问/feign-hello接口

    访问链接:http://localhost:8080/feign-hello
    连续访问如上接口链接,展示效果如下图所示:

    6. 结论

    Feign实现了与Ribbon同样的负载均衡的效果。

    7. 源码位置

    本章源码已经上传到淡若悠然,请结合源码进行学习,感谢阅读。

    码云地址(本章源码):https://gitee.com/litairan/tairan-spring-cloud

    相关文章

      网友评论

          本文标题:SpringCloud组件:创建第一个Feign客户端

          本文链接:https://www.haomeiwen.com/subject/higruqtx.html