天天看點

聲明式調用---Feign

Feign:Feign是一種聲明式、模闆化的HTTP用戶端。

用我的了解來說,Feign的功能類似dubbo暴露服務,但是與dubbo稍有不同的是Feign是HTTP REST接口的形式暴露的。

這一篇還是要利用到上一篇中的service(8762),service(8763)兩個服務,先啟動這兩個服務。

建立項目,service-feign(8765),pom加入feign依賴,完整pom代碼如下:

<?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.dalaoyang</groupId>
    <artifactId>springcloud_feign</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springcloud_feign</name>
    <description>springcloud_feign</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.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>
        <spring-cloud.version>Edgware.SR1</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
           

在啟動類加入@EnableFeignClients注解,如果沒有加入basePackages制定掃描包得話,預設會去找項目會掃描到的所有@FeignClient。啟動類代碼如下:

package com.dalaoyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;


@SpringBootApplication
@EnableEurekaClient
//@EnableFeignClients(basePackages = "com.dalaoyang.interfaces")
@EnableFeignClients
public class SpringcloudFeignApplication {

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

           

建立Feign暴露接口,接口上加入@FeignClient(value="service",fallback = FeignFallbackService.class)

注解。

service為要遠端調用服務的名字,即你要調用服務的spring.application.name

fallback為遠端調用失敗後回調的方法。代碼如下:

package com.dalaoyang.interfaces;

import com.dalaoyang.back.FeignFallbackService;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author dalaoyang
 * @Description
 * @project springcloud_learn
 * @package com.dalaoyang.interfaces
 * @email [email protected]
 * @date 2018/4/20
 */
@FeignClient(value="service",fallback = FeignFallbackService.class)
//這裡是要遠端調用的服務的名稱,即你要調用服務的spring.application.name
//fallback是遠端調用失敗回調的方法
public interface FeignInterface {
    @GetMapping("/")
    String IndexInfo();
}
           

遠端調用失敗回調類FeignFallbackService,要實作對應的FeignClient實作對應的方法:

package com.dalaoyang.back;

import com.dalaoyang.interfaces.FeignInterface;
import org.springframework.stereotype.Service;

/**
 * @author dalaoyang
 * @Description
 * @project springcloud_learn
 * @package com.dalaoyang.back
 * @email [email protected]
 * @date 2018/4/20
 */
@Service
public class FeignFallbackService implements FeignInterface {
    @Override
    public String IndexInfo(){
        return "遠端調用失敗!";
    };
}
           

最後看一下配置檔案,需要注意的是feign.hystrix.enabled,如果配置遠端調用回調的話需要聲明一下Feign的 hystrix支援,不然頁面還是會顯示錯誤。

##端口号
server.port=8765

##服務名稱
spring.application.name=service_feign

##注冊中心位址
eureka.client.service-url.defaultZone=http://eureka.dalaoyang.cn/eureka/


##聲明Feign的 hystrix支援
feign.hystrix.enabled=true
           

啟動service-feign(8765),先去看一眼

http://eureka.dalaoyang.cn

image

可以看到服務注冊成功,然後通路

http://localhost:8765/

,可以看到頁面和使用ribbon的時候一樣交替顯示。

控制台

然後我們關閉service(8762),service(8763)兩個服務,再次通路,可以看到

源碼下載下傳 :

大老楊碼雲

個人網站:

https://dalaoyang.cn