06.SpringCloud - Spring Cloud Netflix 之 Feign;Spring Cloud 之 OpenFeign声明式服务调用组件(六)
06.SpringCloud - Spring Cloud Netflix 之 Feign;Spring Cloud 之 OpenFeign声明式服务调用组件(六)
阅读本文前可先参考
SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客
一、Feign 与 OpenFeign
1、Feign
Feign 是 Netflix 公司开发的一个声明式的 REST 调用客户端,是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。
调用远程的restful风格的http接口 的组件,如:
1、Httpclient(apache)
2、Httpurlconnection (jdk)
3、restTemplate(spring)
4、OkHttp(android)
5、Feign (Netflix)
Feign 是 Netflix 公司发布的一种实现负载均衡和服务调用的开源组件。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Ribbon 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix Feign。
Feign 支持多种注解,但 Feign 本身并不支持 Spring MVC 注解,2019 年 Netflix 公司宣布 Feign 组件正式进入停更维护状态,于是 Spring 官方便推出了一个名为 OpenFeign 的组件作为 Feign 的替代方案。
2、OpenFeign
OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。
OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。
3、Feign与OpenFeign的区别
Feign 和 OpenFeign 都是 Spring Cloud 下的远程调用和负载均衡组件。
Feign 和 OpenFeign 作用一样,都可以实现服务的远程调用和负载均衡。
Feign 和 OpenFeign 都对 Ribbon 进行了集成,都利用 Ribbon 维护了可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。
1、Feign
Feign是Netflix公司开发的,是 Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用接口,就可以调用服务注册中心的服务
Feign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
2、OpenFeign
OpenFeign 是 Spring 官方推出的,是SpringCloud自己研发的。是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中
OpenFeign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
注:
springcloud F 及F版本以上 springboot 2.0 以上基本上使用openfeign,openfeign 如果从框架结构上看就是2019年feign停更后出现版本,也可以说大多数新项目都用openfeign ,2018年以前的项目在使用feign
使用OpenFeign实现服务消费者调用服务
1、新建一个springboot Module(springcloud-2-service-common),继承自统一的父项目,存放通用的接口层、常量类、model
2、在 springcloud-2-service-common 中 添加 openfeign 依赖 spring-cloud-starter-openfeign
<!--继承统一的父项目-->
<parent>
<groupId>com.company</groupId>
<artifactId>springcloud-demo</artifactId>
<version>1.0.0</version>
<!-- <relativePath/> <!– lookup parent from repository –>-->
</parent>
<groupId>com.company</groupId>
<artifactId>springcloud-2-service-common</artifactId>
<version>1.0.0</version>
<name>springcloud-2-service-common</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
3、在 服务消费者 application.properties配置文件中指定服务注册中心、端口号等信息
server.port=8081
#设置应用名称,对应Eureka控制台下 DS Replicas 的 Application
spring.application.name=springcloud-5-service-eureka-openfeign-consumer
#每间隔5s,向Eureka服务注册中心发送一次心跳,证明服务是否依然"存活"
eureka.instance.lease-renewal-interval-in-seconds=30
#告诉服务端,如果10s之内没有发送心跳,就代表故障,将本服务踢出
eureka.instance.lease-expiration-duration-in-seconds=60
#告诉服务端,服务实例以IP作为链接,不是取机器名
eureka.instance.prefer-ip-address=false
#注册服务实例ID,,服务ID必须唯一
eureka.instance.instance-id=springcloud-5-service-eureka-openfeign-consumer
#注册中心的链接地址 http://localhost:8761/eureka
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka
在 服务提供者 springcloud-5-service-eureka-openfeign-provider application.properties配置文件中指定服务注册中心、端口号等信息
server.port=9001
#设置应用名称,对应Eureka控制台下 DS Replicas 的 Application(集群部署服务提供者,Application一致,对应多个eureka.instance.instance-id)
spring.application.name=springcloud-5-service-eureka-openfeign-provider
#设置mysql数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin123456
#每间隔5s,向Eureka服务注册中心发送一次心跳,证明服务是否依然"存活"
eureka.instance.lease-renewal-interval-in-seconds=5
#告诉服务端,如果10s之内没有发送心跳,就代表故障,将本服务踢出
eureka.instance.lease-expiration-duration-in-seconds=10
#告诉服务端,服务实例以IP作为链接,不是取机器名
eureka.instance.prefer-ip-address=false
#注册服务实例ID,,服务ID必须唯一
eureka.instance.instance-id=springcloud-5-service-eureka-openfeign-provider
#注册中心的链接地址 http://localhost:8761/eureka
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka
4、在 springcloud-2-service-common 中定义一个远程服务提供者接口ProviderGoodsRemoteClient
通过@FeignClient 注解来指定服务名称,进而绑定服务,然后再通过 SpringMVC 中提供的注解来绑定服务提供者提供的接口
@Component
@FeignClient("springcloud-5-service-eureka-openfeign-provider")
public interface ProviderGoodsRemoteClient {
/**
* 声明一个feign的接口,它的实现是服务提供者的controller实现
*/
@GetMapping(value = "/eureka/openfeign/service/goodList")
public List<Goods> goods();
}
服务提供者 springcloud-5-service-eureka-openfeign-provider
@RestController
public class GoodsController {
@Autowired
private GoodsService goodsService;
@GetMapping(value = "/eureka/openfeign/service/goodList")
public List<Goods> goodList(){
List<Goods> goodsList = goodsService.getAllGoods();
System.out.println("查询商品列表成功:");
for (Goods good:goodsList) {
System.out.println("查询商品:"+ good);
}
return goodsList;
}
}
5、在服务消费者项目(springcloud-5-service-eureka-openfeign-consumer)springboot启动类添加 @EnableFeignClients 注解表示开启 Spring Cloud openFeign的支持功能
@EnableFeignClients //表示开启 Spring Cloud OpenFeign的支持功能
@EnableEurekaClient //开启 Eureka client服务
@SpringBootApplication
public class EurekaOpenFeign5ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaOpenFeign5ConsumerApplication.class, args);
}
}
6、服务消费者springcloud-5-service-eureka-openfeign-consumer使用 Controller 调用服务
@RestController
public class GoodsController {
@Autowired
private ProviderGoodsRemoteClient providerGoodsRemoteClient;
@GetMapping(value = "/springcloud/eureka/openfeign/goodList")
public @ResponseBody Object getGoodList(){
// 调用远程的一个controller, restful的调用,通过openfeign这种声明式的远程调用,providerGoodsRemoteClient就像dubbo里面的接口层一样
return providerGoodsRemoteClient.goods();
}
}
7、启动服务测试;启动 eureka(springcloud-3-service-eureka),服务提供者springcloud-5-service-eureka-openfeign-provider,服务消费者springcloud-5-service-eureka-openfeign-consumer
浏览器输入:http://localhost:8081/springcloud/eureka/openfeign/goodList
来源:https://blog.csdn.net/MinggeQingchun/article/details/125295943