在咱们将服务注册到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的效果一致。这样就完成了应用与应用之间的调用