基于去年写的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 对象 而后调用便可