上一篇博文,我们介绍了服务治理,注册中心Eureka,学会了基本的服务之间的调用,但是我们用的是RestTemplate的方式,其实这里,我们可以有一种更加简便的服务之间的调用方式,那就是Feign。Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。下面我们一起来写个例子使用吧。
一、首先建立一个特注册中心和一个服务提供者
这里我们建立一个注册中心和服务提供者,可以参考上一篇博文服务治理SpringCloud Eureka入门实战。这里我们提供的服务如下:
@RestControllerpublic class ProviderController {@RequestMapping("/getMsg")public String getMsg() {return "Provider";}}
二、建立服务消费者
这我们新建一个服务消费者,通过Feign的方式调用服务端。相信学过我上一篇博文的读者对于新建一个SpringClopud的应用已经很简单那啦。项目结构如下:
1、pom.xml
<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>cn.suibibk</groupId><artifactId>springcloud-feign-consumer</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version></parent><!-- 管理依赖 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.M7</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- SpringBoot整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SpringBoot整合eureka客户端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- SpringBoot整合feign客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies><!-- 注意: 这里必须要添加, 否者各种依赖有问题 --><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/libs-milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>
我们只需要在引入如下依赖就可以啦
<!-- SpringBoot整合feign客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2、application.yml
其实该配置文件跟上一篇博文里的一样,开启feign功能并不需要去修改配置文件。
###服务消费者启动端口server:port: 8081###服务名称(服务注册到eureka名称)spring:application:name: app-suibibk-consumer###服务注册到eureka地址eureka:client:service-url:defaultZone: http://localhost:8000/eureka###注册到Eurekaregister-with-eureka: true###是否需要从eureka上获取注册信息fetch-registry: true
3、ProviderFeign.java
创建Feign客户端调用工具接口,这里很简单的,代码如下
@FeignClient("app-suibibk-provide")public interface ProviderFeign {@RequestMapping("/getMsg")public String getMsg();}
@FeignClient(“app-suibibk-provide”)这个注解就表示这个是远程调用app-suibibk-provide服务的/getMsg接口,这里必须标明具体的接口:
@RequestMapping("/getMsg")public String getMsg();
但是如果我们有几十个接口,这里如果写几时个接口大的话,代码重复太高,所以这里建议,并且实际上用微服务架构搭建的项目都是把接口抽取出来,然后服务端和Feign客户端直接继承即可,那么这里的代码就会变成如下:
@FeignClient("app-suibibk-provide")public interface ProviderFeign extents ProviderService{}
ProviderService.java为
public interface ProviderService{@RequestMapping("/getMsg")public String getMsg();}
ProviderController.java为
@RestControllerpublic class ProviderController implements ProviderService {@Override@RequestMapping("/getMsg")public String getMsg() {return "Provider";}}
这样子,我们只需要修改ProviderService和ProviderController即可。添加接口删除接口并不会影响Feign客户端的代码。
4、ConsumerController.java
这里我们只需要将ProviderFeign注入即可。
@RestControllerpublic class ConsumerController{@Autowiredprivate ProviderFeign providerFeign;@RequestMapping("/toProviderGetMsg")public String toProviderGetMsg() {return providerFeign.getMsg();}}
5、启动类AppConsumer.java
@SpringBootApplication@EnableEurekaClient@EnableFeignClientspublic class AppConsumer {public static void main(String[] args) {SpringApplication.run(AppConsumer.class, args);}}
@EnableEurekaClient表示这个是Eureka客户端
@EnableFeignClients 表示这个是Feign客户端
三、启动Eureka、服务提供者、服务消费者测试
启动程序后输入:
http://127.0.0.1:8081/toProviderGetMsg
页面返回:Provider
表示调用成功
结语
到此,我们就实现了Feign的调用方式,是不是很简单,当然我们一依然可以用http、restTemplate的调用方式,如果是同一个项目各个微服务之间调用的话,我这里是推荐用Feign;毕竟按我上面说的抽取出接口来真的可以很方便。顺便说一句SpringCloud feign 默认开启支持ribbon,支持本地负载均衡。
