(四)基於Spring Cloud Fegin的跨服調用

基於去年寫的SpringCloud系列 因爲工做緣由一直沒有接着往下寫java

如今從新撿起來 介紹下SpringCloud的其餘組件web

上次說到Ribbon作的負載均衡 是用的Spring提供RestTemple來作的請求spring

去看RestTemple的請求源碼 原理上仍是用java.net.uri去請求跨服調用,而本篇着重介紹Spring cloud的Fegin組件,這個組件是Spring提供的封裝好的跨服調用組建 可使服務之間的調用更爲便捷apache

我得業務場景是這樣的app

一臺SpringEureka 提供註冊服務 兩臺同樣的服務 分別啓動在9001/9002端口負載均衡

一臺服務two須要調用One服務的某一個方法maven

如下是POM文件spring-boot

<?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>SpringRibbon</groupId>
    <artifactId>SpringRibbon</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.7</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-parent</artifactId>
                <version>Brixton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--此處是Eureka客戶端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

而後再啓動器類裏 加入標籤@EnableFeignClients 這個標籤是用來申請啓動Feign組件的ui

而後加入一層Controller層 以下:.net

package Controller;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient("ONE-CLOUD-CLIENT")
@RibbonClient(name = "ONE-CLOUD-CLIENT",configuration = RibbonConfiguration.class)
public interface FeignController {

    @RequestMapping(value = "/service-instances/{clientName}",method = RequestMethod.GET)
    public String method(@PathVariable("clientName") String clientName);//請求附帶一個叫clientName的參數

    @RequestMapping(value = "/method",method = RequestMethod.GET)
    public String requestMethod();
}

如上 咱們建立一個接口 在這個接口文件裏面用FeignClient來申明本接口 請求的是哪一個服務,用在Eureka註冊的服務名字來區分

而且經過RibbonClient標籤來配置負載策略 (此處採用的是輪詢)詳細配置見上一章

在這個接口的方法上 經過RequestMapping來配置這個接口請求的One服務的路徑 ,如:One服務裏面有一個/method的路徑,咱們經過RequestMapping配置請求路徑和請求方法 那麼在這個Controller調用的時候就會經過你配置的路徑去請求指定服務裏面的方法。而且採用Ribbon的負載策略

調用以下

@RestController
public class requestController {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
    @Autowired
    private RestTemplate restTemplete;
    @Autowired
    private FeignController feignController;

    @RequestMapping("/getinfo")
    public String getinfo() {
        StringBuffer sb=new StringBuffer();
        for (int i = 0; i < 1000; i++) {
            sb.append("["+(i+1)+"]"+":"+restTemplete.getForEntity("http://ONE-CLOUD-CLIENT/method", String.class).getBody()+"/n");
        }
        return sb.toString();
    }
    @RequestMapping("/getmethod")
    public String getMethod(){
        return feignController.method("ONE-CLOUD-CLIENT");
    }
    @RequestMapping("/gettestmethod")
    public String testmethod(){
        StringBuffer sb=new StringBuffer();
        for (int i=0;i<100;i++){
            sb.append(feignController.requestMethod());
        }
        return sb.toString();
    }
}

能夠看到利用Spring的IOC獲取到剛纔配置的feignController 對象 而後調用便可

相關文章
相關標籤/搜索