在SpringCloud中使用Feign进行服务的访问

以前已经说过了SpringCloud做为“分布式微服务”的解决方案时的大概原理和方法了。就是一个个web应用之间的访问,以前的访问方式有两种:git

  • 使用RestTemplate这个封装好的类,使用ip+端口+服务地址进行访问,这是最简单的访问方式了web

@GetMapping("demo3/consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
 //远程调用provider中的接口
 return restTemplate.getForObject("http://localhost:8001/demo1/provider/hello/"+id,String.class);
}
  • 使用Ribbon进行访问负载均衡,也就是将“提供者”注册到注册中心,而后“消费者”使用微服务名进行访问算法

@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访问时,要对参数进行拼接。那么有没有更好的方法呢?spring

并且,若是咱们想和RPC框架同样(好比Dubbo等),使用本地接口就能够访问呢?那么咱们就要引入Feign浏览器

1. 建立一个服务访问的接口

既然咱们想像在本地访问同样来调用远程“微服务”接口,固然,将远程代码写在本项目中是不可能的,那么就建立一个接口来访问微信

  • 建立一个新的项目 demo4-feign-interfaceapp

其实你建立这个项目就是为了让消费者微服务进行依赖的,固然你能够直接在你的消费者项目中建立这个接口,可是并不利于管理,因此就新建立了一个项目,专门用来写feign的接口负载均衡

  • pom.xml(导入Feign客户端的依赖)框架

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  • 而后编写接口的Service类maven

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中的

  • 而后,使用maven的命令,clean 而后install到本地仓库中以便于其余的项目进行调用

  • 这个应用只是作为一个消费者的依赖,因此并不须要启动类

2.建立一个新的项目,使用Feign进行访问

  • 建立新的使用Feign的消费者项目,将以前的demo3-consumer复制一份,而后修改以下:

  • pom.xml添加feign的依赖和咱们以前建立的demo4-feign-interface

<!--以前的依赖省略,请查看源码-->
<!--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>
  • application.yml 不用修改,仍是将以前的配置文件复制过来

  • 在启动类上添加注解,声明Feign的调用包名

@EnableFeignClients(basePackages= {"cn.lyn4ever.provider"})
  • 接下来就是修改咱们的controller类,可使用本地接口进行访问了

@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的服务提供者、刚才建立的这个服务消费者,而后使用浏览器进行访问

3.使用Feign进行访问有什么好处及其原理?

  • 使用FeignClient访问时,能够不用再使用ip+port或者使用微服务名进行访问。能够直接在Autowired后,在本地调用方法

  • 其实就是Feign在本地生成了动态代理,能够直接使用Autowired调用。其本质仍是使用Ribbon进行负载均衡访问

  • Feign中内置了Ribbon进行负载均衡,因此也一样能够像Ribbon同样进行自定义负载均衡算法

扫码关注后回复“SpringCloud”获取更多SpringCloud的学习笔记以及代码地址

本文分享自微信公众号 - 小鱼与Java(Fish_Java)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索