(二)基于Spring Cloud Feign的客户端互相调用

在咱们将服务注册到Eureka服务器上以后,一个应用要调用另外一个应用的服务。这个问题怎么解决。java

个人场景以下web

Eureka服务器 在本地 使用端口 8761spring

用例1:本地,使用端口8080 有一个greeting服务apache

用例2:本地,使用端口9000 有一个greeting服务服务器

如何在用例1里面请求到用例2里面的greeting方法app

首先想到的解决方案以下:负载均衡

1:JDK原生 URLConnection。用这个咱们经过Eureka获取Eureka提供了discoveryClient类,这个类经过getInstances(用例名)获取用例的详细信息和所需调用服务的域名,端口信息。获取这个信息以后拼接Url字符串。而后使用URLConnection去模拟请求.maven

2:Eureka给咱们提供了一个解决方案 看以下代码:spring-boot

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> resultStr=
        restTemplate.getForEntity("http://localhost:9000/greeting", String.class);
		System.out.println(resultStr.getBody());
		return resultStr.getBody();

咱们能够使用RestTemplate去访问端口为9000的greeting方法,一样采用的是拼接URL的方法。结果以下:工具

3:那就是Spring Cloud Feign了。这个工具提供了很是完成的一套解决方案,咱们只须要告诉他服务名/用例名 他就回去获取服务用例的对应的请求地址和端口,接下来咱们具体的说一下这个调用

首先在用例1里面配置pom添加Feign的依赖包

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.zx</groupId>
  <artifactId>SpringCloudClient</artifactId>
  <version>0.0.1-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>
      <!--此处是差别所在-->
      <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>
       <!-- 客户端负载均衡jar包 -->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
      </dependency>
      <!-- 跨服务请求 包 -->
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
  </dependencies>

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

</project>

这个包加载以后,咱们只须要建立一个接口类(interface)

在这个接口上面启用Feign。而后建立抽象方法,申明要调用的用例2里面的方法便可。代码以下:

package Controller;

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

@FeignClient("TWO-CLOUD-CLIENT")//配置要请求的用例名,此名称和Eureka的名称一致
public interface getServerController {
    //申明调用方法,以及请求方式
	@RequestMapping(value = "/greeting",method = RequestMethod.GET)
    public  String getGreeting9000(@RequestParam("name") String name);//请求附带一个叫name的参数
}

这样写好以后,这个接口就会注册到Spring的Ioc中。后面咱们能够直接使用这个接口调这个方法获取数据了

这个效果和上面使用Eureka的restTemple的效果一致。这样就完成了应用与应用之间的调用

相关文章
相关标签/搜索