从零开始搭建spring-cloud(3) ----feign

Feign简介

Feign是Netflix开发的声明式、模块化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮组咱们更加便捷、优雅的调用HTTP API。java

在Spring Cloud中,使用Feign很是简单——建立一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。web

Spring Cloud对feign进行了加强,并整合了Ribbon和Eureka,从而让Feign的使用更加便捷。spring

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只须要建立一个接口并注解。它具备可插拔的注解特性,可以使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。apache

简而言之:浏览器

  • Feign 采用的是基于接口的注解
  • Feign 整合了ribbon

准备工做

继续以前的工做,启动Eureka server,端口为8080,启动spring-cloud-eureka-provider-A-一、启动spring-cloud-eureka-provider-A-2,端口分别为808一、8082mybatis

建立一个feign服务

新建一个spring-boot工程,取名为spring-cloud-feign,在它的pom文件引入Feign的起步依赖spring-cloud-starter-feign、Eureka的起步依赖spring-cloud-starter-eureka、Web的起步依赖spring-boot-starter-web,代码以下:app

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.vincent</groupId>
    <artifactId>spring-cloud-feign</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

    </dependencies>

</project>

在工程的配置文件application.properties文件,指定程序名为service-feign,端口号为8083,服务注册地址为http://127.0.0.1:8080/eureka/,代码以下:负载均衡

# 注册中心的注册地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8080/eureka/

# 服务名称--调用的时候根据名称来调用该服务的方法
spring.application.name=service-feign
server.port=8083

在程序的启动类App ,加上@EnableFeignClients注解开启Feign的功能:maven

package com.vincent;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * Created by vincent on 2019-6-18 21:56
 */
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

定义一个feign接口,经过@ FeignClient(“服务名”),来指定调用哪一个服务。好比在代码中调用了service-provider-A服务的“/user/{name}”接口,代码以下:ide

@FeignClient("service-provider-A")
public interface FeignService {
    @GetMapping("/user/{name}")
    Map<String,Object> getUser(@PathVariable("name") String userName);
}

在Web层的controller层,对外暴露一个"/user/{name}"的API接口,经过上面定义的Feign客户端FeighService 来消费服务。代码以下:

public class UserController {
    @Autowired
    FeignService feignService;

    @GetMapping("/user/{userName}")
    public Map<String, Object> getUser(@PathVariable("userName") String userName){
        Map<String, Object> user = feignService.getUser(userName);
        System.out.println(user);
        return user;
    }
}

启动程序,屡次访问http://localhost:8083/user/vincent,浏览器交替显示:

{"from":"provider-A-2","id":"vincent"}
{"from":"provider-A-1","id":"vincent"}

Ribbon与Feign的区别

Ribbon
是一个基于 HTTP 和 TCP 客户端 的负载均衡的工具。
它能够 在客户端 配置 RibbonServerList(服务端列表),使用 HttpClient 或 RestTemplate 模拟http请求,步骤至关繁琐。

Feign
Feign 是在 Ribbon的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。

采用接口的方式, 只须要建立一个接口,而后在上面添加注解便可 ,将须要调用的其余服务的方法定义成抽象方法便可, 不须要本身构建http请求。

而后就像是调用自身工程的方法调用,而感受不到是调用远程方法,使得编写 客户端变得很是容易。

相似于 mybatis 的 @Mapper注解 。

spring-cloud-starter-openfeign 里面已经包含了 spring-cloud-starter-ribbon(Feign 中也使用了 Ribbon)

相关文章
相关标签/搜索