基於去年寫的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 對象 而後調用便可