1. 程式人生 > >聲明式調用---Feign

聲明式調用---Feign

location ice osi sna base 端口 這一 https not

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

技術分享圖片

可以看到服務註冊成功,然後訪問http://localhost:8765/,可以看到頁面和使用ribbon的時候一樣交替顯示。

技術分享圖片

技術分享圖片

控制臺

技術分享圖片

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

技術分享圖片

源碼下載 :大老楊碼雲

個人網站:https://dalaoyang.cn

聲明式調用---Feign