以前已经说过了SpringCloud做为“分布式微服务”的解决方案时的大概原理和方法了。就是一个个web应用之间的访问,以前的访问方式有两种:java
@GetMapping("demo1/consumer/hello/{id}") public String hello(@PathVariable("id") String id){ //远程调用provider中的接口 return restTemplate.getForObject("http://localhost:8001/demo1/provider/hello/"+id,String.class); }
@GetMapping("demo3/consumer/hello/{id}") public String hello(@PathVariable("id") String id){ //远程调用provider中的接口 return restTemplate.getForObject("http://demo3-ribbon-provider/demo3/provider/hello/"+id,String.class); }
可是呢?这么访问仍是很麻烦,使用restTemplate访问时,要对参数进行拼接。那么有没有更好的方法呢?web
并且,若是咱们想和RPC框架同样(好比Dubbo等),使用本地接口就能够访问呢?那么咱们就要引入Feign算法
既然咱们想像在本地访问同样来调用远程“微服务”接口,固然,将远程代码写在本项目中是不可能的,那么就建立一个接口来访问spring
其实你建立这个项目就是为了让消费者微服务进行依赖的,固然你能够直接在你的消费者项目中建立这个接口,可是并不利于管理,因此就新建立了一个项目,专门用来写feign的接口浏览器
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
package cn.lyn4ever.provider; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; /** * 这个注解代表这是一个Feign的客户端, * 其中的value属性就是目标微服务的服务名 */ @FeignClient(value = "demo3-ribbon-provider") public interface ProviderService { /** * 这个实际上是provider提供者中的方法 * * @param id * @return */ @GetMapping("demo3/provider/hello/{id}") public String hello(@PathVariable("id") Integer id); }
主要看一下上边的FeignClient注解中的value值,就是目标微服务中的服务名微信
这个hello()方法以及注解中的内容,所有都是项目demo3-ribbon-provider中的app
<!--以前的依赖省略,请查看源码--> <!--feign的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <!--以前建立的feign接口项目--> <dependency> <groupId>cn.lyn4ever</groupId> <artifactId>demo4-feign-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
@EnableFeignClients(basePackages= {"cn.lyn4ever.provider"})
@RestController public class HelloConsumerController { @Autowired private ProviderService providerService; @GetMapping("demo4/consumer/hello/{id}") public String hello(@PathVariable("id") Integer id){ //直接使用本地的接口就能够访问了 return providerService.hello(id); } }
这们,启动Eureka集群、三个provicder的服务提供者、刚才建立的这个服务消费者,而后使用浏览器进行访问负载均衡
更多关于SpringCloud的学习笔记以及代码地址,关注微信公众号“小鱼与Java”回复“SpringCloud”获取框架