【springcloud】springcloud服务之间的调用Feign客户端的使用

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

Spring Cloud Feign集成到服务中

springBoot使用的是2.0.2.RELEASE版本 springCloud使用的是Finchley.RELEASE版本。

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

通过@EnableFeignClients注解开启扫描Spring Cloud Feign客户端的功能

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

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ProductApplication {

	public static void main(String[] args) {
		SpringApplication.run(ProductApplication.class, args);
	}
}

查看注册中心注册的服务 

创建Feign的客户端接口用@FeignClient注解来指定这个接口所要调用的服务名称

例如订单服务调用商品服务:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "product")
public interface OrderClient {

    @GetMapping("/product/list")
    public String getProductInfo();
}

 通过注入@Autowired定义的feign客户端来调用服务提供方的接口

    @Autowired
    private OrderClient orderClient;

     /**
     * 订单服务调用商品服务
     * @return
     */
    @GetMapping("/getProductList")
    public String getProductList(){
        return orderClient.getProductInfo();
    }

通过Spring Cloud Feign来实现服务调用的方式更加简单了,通过@FeignClient定义的接口来统一的生命我们需要依赖的微服务接口。而在具体使用的时候就跟调用本地方法一点的进行调用即可。由于Feign是基于Ribbon实现的,所以它自带了客户端负载均衡功能。

 Feign的继承与实现机制,发现其使用更加灵活( Feign支持接口继承方式快速生成客户端)

在实际的开发中,为了简化代码,一般抽象出一个公共的API服务,供controller和feign客户端集成api服务。

创建一个公共接口

public interface ProductService {
    @GetMapping("/api/consumer")
    String consumer( @RequestParam("param") String param );
}

订单服务的feign客户端继承 / 商品服务的controller实现公共的订单服务的接口

 订单服务的feign客户端继承:

@FeignClient( value = "product" )
public interface OrderFeignClient extends ProductService {
}

商品服务的controller实现: 

@RestController
@RequestMapping("/product")
public class ProductController implements ProductService {

    @GetMapping("/productInfo")
    @Override
    public String consumer(@RequestParam String param) {
        
        return "ok:" + param;
    }
}

最后订单服务通过feign客户端完成商品服务的调用。

使用 feign的继承特性时,可以将服务接口的定义从服务消费者中剥离出去,形成独立的api项目从而可以很方便的实现接口定义和依赖的共享,不用再复制粘贴接口进行绑定。

另外一种方式:

编写Feign自己的服务调用接口

新建一个接口类的模块,在接口类上加注解@FeignClient(name = "product"),指向自己的服务,其中product是配置的服务在注册中心上的名字。

@FeignClient(name = "product")
public interface ProductClient {
 
    @PostMapping("/product/list")
    List<Product> list();
 
}

此模块项目提交到Maven仓库

直接可以使用Idea右侧的Maven Projects里的install,打包提交到Maven仓库,或者使用Maven命令:

mvn -Dmaven.test.skip=true -U clean install

在其他服务项目中把商品类的client依赖引入项目 

        <dependency>
            <groupId>com.jasin</groupId>
            <artifactId>product-client</artifactId>
        </dependency>

在订单项目模块的应用启动类上添加注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.jasin.product.client")
public class OrderApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
 
}

调用商品服务,只需要在该类把订单类提供的ProductClient接口自动注解进来,就可以使用商品类向外提供的接口服务。

发布了110 篇原创文章 · 获赞 36 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/wjx_jasin/article/details/103224879