(四)基于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 对象 而后调用便可

相关文章
相关标签/搜索