文章目录

  • ​​1、OpenFeign组件简介​​
  • ​​2、使用RestTemplate+Ribbon已经完成服务调用,为什么还要使用Feign?​​
  • ​​3、OpenFeign服务调用​​
  • ​​3.1 创建两个独立的SpringBoot应用,并注册到服务注册中心(这里我用的consul服务注册中心)​​
  • ​​3.2 引入服务注册中心依赖​​
  • ​​3.3 修改配置文件​​
  • ​​3.4 入口类加注解​​
  • ​​3.5 在服务调用放引入OpenFeign依赖​​
  • ​​3.6 在服务调用方入口类加如注解,开启Feign调用支持​​
  • ​​3.7 开发客户端接口​​
  • ​​3.8 服务调用测试​​

1、OpenFeign组件简介

Spring Cloud Feign是一个HTTP请求调用的轻量级框架,可以以Java接口注解的方式调用HTTP请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。
Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性(可以使用springmvc的注解),可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,默认实现了负载均衡的效果并且springcloud为feign添加了springmvc注解的支持。

2、使用RestTemplate+Ribbon已经完成服务调用,为什么还要使用Feign?

String restTemplateForObject = restTemplate.getForObject("http://服务名/url?参数" + name, String.class);

存在问题:

  • 1.每次调用服务都需要写这些代码,存在大量的代码冗余
  • 2.服务地址如果修改,维护成本增高
  • 3.使用时不够灵活

3、OpenFeign服务调用

3.1 创建两个独立的SpringBoot应用,并注册到服务注册中心(这里我用的consul服务注册中心)

一个类别服务 一个商品服务

OpenFeign组件_服务调用

3.2 引入服务注册中心依赖

两个服务都引入

<!--consul client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3.3 修改配置文件

类别服务:

server.port=8787
spring.application.name=CATEGORY

#注册到consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

商品服务:

server.port=8788
spring.application.name=PRODUCT


#注册到consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

3.4 入口类加注解

类别服务:

OpenFeign组件_spring_02


商品服务:

OpenFeign组件_服务调用_03


项目结构:

OpenFeign组件_spring_04

3.5 在服务调用放引入OpenFeign依赖

由于我们是在类别服务中调用商品服务,所以给类别服务引入下面的依赖:

<!--Open Feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3.6 在服务调用方入口类加如注解,开启Feign调用支持

OpenFeign组件_服务调用_05

3.7 开发客户端接口

在类别服务中开发接口ProductClient

package com.baizhi.FeignClient;

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

//调用商品服务接口
@FeignClient(value = "PRODUCT") //value:用来书写调用服务Id
public interface ProductClient {

//调用商品服务
@GetMapping("/product")
String product();

@GetMapping("list")
String list();
}

下面这句用来指明需要调用的服务ID(默认就是Spring.application.name的值,我们类别服务名称为CATEGORY,商品服务名称为PRODUCT)

@FeignClient(value = "PRODUCT")

注意上面接口中的方法的请求方式和访问路径要和被调用的服务保持一致,由于我么是类别服务调用商品服务,所以查看下商品服务的控制器:

OpenFeign组件_服务调用_06

可以看到,上述的路径和请求方式都保持一致

3.8 服务调用测试

将商品服务设定为两个服务节点,两个不同端口都注册商品服务组成简单集群,顺便测试下负载均衡。

OpenFeign组件_服务调用_07


查看服务注册中心:​​localhost:8500​

OpenFeign组件_服务调用_08


类别服务的控制器:

OpenFeign组件_服务调用_09

访问:​​http://localhost:8787/category​​通过类别服务调用商品服务,顺便通过日志检查负载均衡。

OpenFeign组件_微服务_10


由于默认使用的负载均衡算法是轮询,所以就会一致在8788和8799之间切换,我们多刷新几次再查看日志:

OpenFeign组件_spring cloud_11


可以看到,负载均衡的算法是轮询法,由于我们是一个控制器中调用了两个商品服务,所以可以看到接收请求的服务端口一直在变。