基于去年写的SpringCloud系列 由于工作原因一直没有接着往下写
现在重新捡起来 介绍下SpringCloud的其他组件
上次说到Ribbon做的负载均衡 是用的Spring提供RestTemple来做的请求
去看RestTemple的请求源码 原理上还是用java.net.uri去请求跨服调用,而本篇着重介绍Spring cloud的Fegin组件,这个组件是Spring提供的封装好的跨服调用组建 可以使服务之间的调用更为便捷
我得业务场景是这样的
一台SpringEureka 提供注册服务 两台一样的服务 分别启动在9001/9002端口
一台服务two需要调用One服务的某一个方法
以下是POM文件
4.0.0 SpringRibbon SpringRibbon 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 1.3.5.RELEASE UTF-8 1.7 org.springframework.cloud spring-cloud-starter-parent Brixton.SR3 pom import org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-starter-feign org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
然后再启动器类里 加入标签@EnableFeignClients 这个标签是用来申请启动Feign组件的
然后加入一层Controller层 如下:
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的负载策略
调用如下
@RestControllerpublic 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 对象 然后调用即可