在咱們將服務註冊到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的效果一致。這樣就完成了應用與應用之間的調用