Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)

通过之前发布的《Spring Cloud构建微服务架构:服务消费者(Feign)》,我们已经学会如何使用Spring MVC的注解来绑定服务接口。我们几乎完全可以从服务提供方的Controller中依靠复制操作,来构建出相应的服务接口客户端,或是通过Swagger生成的API文档来编写出客户端,亦或是通过Swagger的代码生成器来生成客户端绑定。即便如此,有很多的方式来产生Feign的客户端程序,依然有很多开发者热衷于利用公共的依赖接口来连接服务提供者和服务消费者的方式。由此,Feign的继承特性就能很好的派上用处。下面,我们来详细看看如何使用Spring Cloud Feign的继承特性。

动手试一试

接下来的示例将分为三个模块:

  • 服务接口定义模块:通过Spring MVC注解定义抽象的interface服务接口
  • 服务接口实现模块:实现服务接口定义模块的interface,该模块作为服务提供者注册到eureka
  • 服务接口消费模块:服务接口定义模块的客户端实现,该模块通过注册到eureka来消费服务接口

服务接口的定义

  • 创建一个Spring Boot项目:eureka-feign-api, pom.xml的主要内容如下:
<parent>    
<groupId>org.springframework.boot</groupId>    
<artifactId>spring-boot-starter-parent</artifactId>   
 <version>1.5.6.RELEASE</version>    
 <relativePath/></parent><dependencies>    
 <dependency>        
 <groupId>org.springframework.boot</groupId>        
 <artifactId>spring-boot-starter-web</artifactId>    
 </dependency></dependencies><dependencyManagement>    
 <dependencies>        
 <dependency>            
 <groupId>org.springframework.cloud</groupId>            
 <artifactId>spring-cloud-dependencies</artifactId>            
 <version>Dalston.SR2</version>            
 <type>pom</type>            
 <scope>import</scope>        
 </dependency>    
 </dependencies></dependencyManagement>
  • 使用Spring MVC注解来定义服务接口:
public interface HelloService {    
@GetMapping("/hello")    
String hello(
@RequestParam(value = "name")
 String name);
}
  • 完成了上述构建之后,我们使用 mvn install将该模块构建到本地的Maven仓库中。

服务接口的实现

  • 创建一个Spring Boot项目:eureka-feign-client, pom.xml的主要内容如下:
<parent>   
<groupId>org.springframework.boot</groupId>    
<artifactId>spring-boot-starter-parent</artifactId>    
<version>1.5.6.RELEASE</version>    
<relativePath/></parent><dependencies>   
 <dependency>        
<groupId>org.springframework.boot</groupId>        
<artifactId>spring-boot-starter-web</artifactId>    
</dependency>    
<dependency>        
<groupId>org.springframework.cloud</groupId>        
<artifactId>spring-cloud-starter-eureka</artifactId>    
</dependency>    
<dependency>        
<groupId>com.didispace</groupId>        
<artifactId>eureka-feign-api</artifactId>
        <version>1.0.0</version>    
        </dependency></dependencies><dependencyManagement>
 <dependencies>        
 <dependency>            
 <groupId>org.springframework.cloud</groupId>          
   <artifactId>spring-cloud-dependencies</artifactId> 
              <version>Dalston.SR2</version>          
                <type>pom</type>          
                  <scope>import</scope>  
                         </dependency>   
</dependencies>
</dependencyManagement>

该模块需要依赖上面定义的 eureka-feign-api,将使用上述定义的 HelloService接口来实现对应的REST服务。同时依赖Eureka是为了将该服务注册到Eureka上供服务消费者发现。

  • 创建应用主类。使用 @EnableDiscoveryClient注解开启服务注册与发现,并实现 HelloService接口的REST服务:
@EnableDiscoveryClient@SpringBootApplicationpublic class Application {  
  @RestController    class HelloController implements HelloService {      
    @Override        public String hello(String name) {     
           return "hello " + name;        }    }    public static void main(String[] args) {  
                 new SpringApplicationBuilder(Application.class).web(true).run(args);    }}
  • 编辑 application.properties配置内容:
spring.application.name=eureka-feign-clientserver.port=2101eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/

配置了服务提供者的名称 eureka-feign-client,服务提供者的端口号 2101,并将该服务注册到我的公益Eureka注册中心上。启动该项目,我们可以通过访问:http://eureka.didispace.com/ ,在该页面中找到它。

服务接口的消费

  • 创建一个Spring Boot项目:eureka-feign-consumer, pom.xml的主要内容如下:
<parent>    <groupId>org.springframework.boot</groupId>  
  <artifactId>spring-boot-starter-parent</artifactId>   
   <version>1.5.6.RELEASE</version>    <relativePath/></parent><dependencies>    <dependency>   
        <groupId>org.springframework.boot</groupId>     
           <artifactId>spring-boot-starter-web</artifactId>    
           </dependency>    <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>com.didispace</groupId>        <artifactId>eureka-feign-api</artifactId>   
                  <version>1.0.0</version>    </dependency></dependencies><dependencyManagement>    
                  <dependencies>        <dependency>         
                     <groupId>org.springframework.cloud</groupId>           
                      <artifactId>spring-cloud-dependencies</artifactId>         
                         <version>Dalston.SR2</version>            <type>pom</type>       
                              <scope>import</scope>        </dependency> 
                                 </dependencies></dependencyManagement>

该模块较服务提供者的依赖增加了Feign的依赖,因为这里将使用Feign来绑定服务接口的客户端。下面我们将使用Feign的继承特性来轻松的构建Feign客户端。

  • 创建应用主类。使用 @EnableDiscoveryClient注解开启服务注册与发现,并通过 @FeignClient注解来声明服务绑定客户端:
@EnableFeignClients@EnableDiscoveryClient@SpringBootApplicationpublic class Application { 
  @FeignClient("eureka-feign-client")    interface HelloServiceClient extends HelloService {    } 
     @RestController    class TestController {      
@Autowired        private HelloServiceClient helloServiceClient;      
  @GetMapping("/test")        public String test(String name) {      
        return helloServiceClient.hello(name);        }    }   
public static void main(String[] args) {        
new SpringApplicationBuilder(Application.class).web(true).run(args);    }}

从上述代码中我们可以看到,利用Feign的继承特性, @FeignClient注解只需要通过声明一个接口来继承在API模块中定义的公共interface就能产生服务接口的Feign客户端了。而 @FeignClient中的值需要填写该服务的具体服务名(服务提供者的 spring.application.name配置值)。

  • 编辑服务消费者的 application.properties配置内容,将服务消费者注册到eureka上来消费服务:
spring.application.name=eureka-feign-consumerserver.port=2102eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/
  • 启动 eureka-feign-consumer之后,我们可以通过访问:http://localhost:2102/test ,来实验 eureka-feign-consumereureka-feign-client接口的调用。

本文示例

  • 码云:https://gitee.com/didispace/SpringCloud-Learning
  • GitHub:https://github.com/dyc87112/SpringCloud-Learning

程序清单:

  • eureka-feign-api:服务接口定义
  • eureka-feign-client:服务接口实现的提供方
  • eureka-feign-consumer:服务接口的调用方

原文发布于微信公众号 - 程序猿DD(didispace)

原文发表时间:2017-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

使用SseEmitter不断向网页输出结果

之前写过一篇文章:springmvc不断输出文本到网页,采用的是对response不断进行write和flush实现的。在spring 4.2版本的时候提供了一...

3061
来自专栏程序猿DD

Spring Cloud构建微服务架构:服务消费(Feign)【Dalston版】

前言通过前两篇《Spring Cloud构建微服务架构:服务消费(基础)》和《Spring Cloud构建微服务架构:服务消费(Ribbon)》,我们已经学会了...

1929
来自专栏阿杜的世界

通过@Enable*注解触发Spring Boot配置

在Spring Boot:定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法:

1061
来自专栏Java学习网

java开发中spring和springboot常用注解总结,开发人员必学

这个注解可以用于类和方法上,用于类上,表示父路径,如类上是demo,方法上是/demo1,那么访问路径就是demo/demo1

1315
来自专栏史上最简单的Spring Cloud教程

SpringBoot非官方教程 | 第十六篇:用restTemplate消费服务

这篇文章主要介绍怎么用消费一个 Restful的web服务。我将用restTemplate去消费一个服务: http://gturnquist-quoters....

2767
来自专栏你不就像风一样

SpringBoot分布式 - SpringCloud

本文只讲解了服务的注册与发现,Spring cloud的更多内容推荐阅读:SpringCloud分布式教程

1972
来自专栏会跳舞的机器人

Spring Cloud(2)——服务提供者

前言: 本文中的注册中心基于Spring Cloud(1)——服务注册中心,请先了解注册中心的相关知识后再阅读本文。

1613
来自专栏猿天地

Spring Boot系列之配置读取

子曰:温故而知新,可以为师矣。周日还在学习的就真的是爱学习的人,周日大放送,这周的精彩文章推荐阅读:

2912
来自专栏Java工程师日常干货

写出我的第一个框架:迷你版Spring MVC前期准备关于自定义注解编写核心控制器:DispatcherServletMake it run!

OK,到这里,一个迷你版的Spring MVC就开发完成了,以前,都是用Spring MVC,从没有想过可以自己开发一个出来,这是我的第一次,我的能量超乎我的想...

1104
来自专栏LhWorld哥陪你聊算法

Flume篇---Flume安装配置与相关使用

Copy过来一段介绍Apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集...

2423

扫码关注云+社区

领取腾讯云代金券