Spring Cloud构建微服务架构之服务消费(三)

上一篇Spring Cloud构建微服务架构之服务消费(二)介绍了如何使用Ribbon来消费微服务提供的接口。本文我们将继续介绍Spring Cloud中的另外一个服务消费的工具:Spring Cloud Feign。

Spring Cloud Feign

Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。Spring Cloud Feign还扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。微服务间调用使用Feign居多。

下面的代码将演示如何使用feign来消费微服务提供的接口

  • 1 在Services工程下右键新建Module,名称为customer-service-feign,在pom.xml添加feign依赖:


    
        services
        spring-cloud-demos
        1.0-SNAPSHOT
    
    4.0.0

    customer-service-feign
    
        
            org.springframework.boot
            spring-boot-starter-web
            1.5.7.RELEASE
        
        
            org.springframework.cloud
            spring-cloud-starter-eureka
        
        
            org.springframework.cloud
            spring-cloud-starter-feign
        
    
    
        UTF-8
        1.8
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            repackage
                        
                    
                
            
        
    

    1. 创建主类FeignApplication并通过@EnableFeignClients注解开启扫描Spring Cloud Feign客户端的功能:
package com.snow.spring.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class FeignApplication {
    public static void main(String[] args){
        SpringApplication.run(FeignApplication.class,args);
    }
}

  • 3.创建一个Feign的客户端接口定义。
    使用@FeignClient注解来指定这个接口所要调用的服务名称,接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口,比如下面就是绑定biz-provider-service1服务的/getUserInfo接口的例子:
package com.snow.spring.cloud.service;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;

@FeignClient("biz-provider-service1")
@Component
public interface SP1Client {
    @PostMapping("/getUserInfo")
    String getInfo(String userName);
}
  • 4 创建消费服务Controller
    在Controller中注入FeignClient接口实例,直接通过该实例调用声明的方法来实现微服务消费。通过Spring Cloud Feign来实现服务调用的方式更加简单了,通过@FeignClient定义的接口来统一的声明我们需要依赖的微服务接口。微服务之间的调用,感觉就像调用本地方法一样方便了。而在具体使用的时候就跟调用本地方法一点的进行调用即可。由于Feign是基于Ribbon实现的,所以它自带了客户端负载均衡功能,也可以通过Ribbon的IRule进行策略扩展。
package com.snow.spring.cloud.controller;

import com.snow.spring.cloud.service.SP1Client;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CustomerController {

    Logger logger = LoggerFactory.getLogger(CustomerController.class);

    @Autowired
    SP1Client sp1Client;

    @GetMapping("/getUserInfo")
    public String getUserInfo(@RequestParam String userName){
        logger.info("get request:" + userName);
        return sp1Client.getInfo(userName);
    }
}

  • 5 . 修改应用配置文件指定消费服务端口
spring:
  application:
    name: customer-serice-feign
server:
  port: 9002
eureka:
  instance:
    prefer-ip-address: true
  client:
    serviceUrl:
      defaultZone: http://localhost:8762/eureka/

services:
  urls:
    userInfoUrl: http://biz-provider-service1/

启动FeignApplication,然后再浏览器中访问:http://localhost:9002/getUserInfo?userName=snow
我们可以看到,请求到达CustomerController,并通过FeignClient声明的SP1Client接口来调用指定的微服务。刷新浏览器,通过日志我们发现请求也是均匀分发的,FeignClient集成了Ribbon负载均衡。
至此,FeignClient的方式消费微服务提供的接口演示完毕。
作者水平有限,说的不好的地方还请包含。

文章中所有的实例代码均可以在下面的连接上获取参考。谢谢。
码市:spring-cloud-demos

你可能感兴趣的:(Spring Cloud构建微服务架构之服务消费(三))