Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign实现微服务之间的调用

摘要:
一.前言微服务实战系列是基于开源微服务项目有来商城微服务框架升级为背景来开展的,本篇则是讲述SpringCloud整合OpenFeign实现微服务之间的相互调用,有兴趣的朋友可以给youlai-mall个star,非常感谢。Feign是SpringCloud组件中一个轻量级RESTFul的HTTP客户端。但是Feign是不支持SpringMVC注解的,所以便有了OpenFeign,OpenFeign在Feign的基础上支持SpringMVC注解比如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,通过动态代理生成实现类,实现类做负载均衡并调用其他服务。

一. 前言

微服务实战系列是基于开源微服务项目有来商城微服务框架升级为背景来开展的,本篇则是讲述SpringCloud整合OpenFeign实现微服务之间的相互调用,有兴趣的朋友可以给youlai-mall 个star,非常感谢。

二. 什么是OpenFeign?

想知道什么是OpenFeign,首先要知道何为Feign?

Feign是SpringCloud组件中一个轻量级RESTFul的HTTP客户端。

Feign内置了Ribbon实现客户端请求的负载均衡。但是Feign是不支持Spring MVC注解的,所以便有了OpenFeign,OpenFeign在Feign的基础上支持Spring MVC注解比如 @RequestMapping等。

OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,通过动态代理生成实现类,实现类做负载均衡并调用其他服务。

三. 项目信息

有来商城youlai-mall 项目结构图:

Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign实现微服务之间的调用第1张

现在要实现这么个需求,认证中心youlai-auth登录认证时需要调用youlai-admin接口,这个接口在youlai-admin的请求路径是/users/loadUserByUsername。因为牵涉到微服务之间的调用,所以需要引入HTTP客户端,也就是本篇所说的OpenFeign。

其中youlai-admin-api模块作为youlai-admin模块对外提供FeignClient给其他微服务引用,比如此次的youlai-auth,这样做的好处是无需在youlai-auth去写有关于youlai-admin的FeignClient,直接引入youlai-admin-api即可。而把youlai-admin的FeignClient编写交给负责youlai-admin模块的开发人员,就是让更熟悉此模块的人编写其对外开放的FeignClient。

本篇设计的项目模块如下:

工程名端口描述
nacos-server8848注册中心和配置中心
youlai-auth8000认证中心
youlai-admin8080平台服务

版本声明:

Nacos Server: 1.3.2

SpringBoot: 2.3.0.RELEASE

SpringCloud: Hoxton.SR5

SpringCloud Alibaba: 2.2.1.RELEASE 

四. 项目实战

1.youlai-admin

提供接口/users/loadUserByUsername,完整代码下载地址有来商城youlai-mall

Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign实现微服务之间的调用第2张

2.youlai-admin-api

添加OpenFeign、OkHttp依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

接口FeignClient代码

@FeignClient("youlai-admin")
public interface UmsAdminService {
    @GetMapping("/users/loadUserByUsername")
    UserDTO loadUserByUsername(@RequestParam String username);
}

3.youlai-auth

添加youlai-admin-api依赖

<dependency>
    <groupId>com.youlai</groupId>
    <artifactId>youlai-admin-api</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

配置文件开启OpenFeign使用OkHttp作为底层的client

feign:
  okhttp:
    enabled: true

远程调用代码

Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign实现微服务之间的调用第3张

@Autowired
private UmsAdminService umsAdminService;

@GetMapping("/loadUserByUsername")
public Result loadUserByUsername(){
    UserDTO userDTO = umsAdminService.loadUserByUsername("admin");
    return Result.success(userDTO);
}

4.微服务调用测试

依次启动项目nacos-server,youlai-auth,youlai-admin,使用接口测试工具测试接口http://localhost:8000/oauth/loadUserByUsername

Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign实现微服务之间的调用第4张

5.OpenFeign底层httpclient选择:HttpURLConnection、feign-httpclient、feign-okhttp?

HttpURLConnection是JDK默认的,出于性能考虑一般是不可取的。至于其他支持的HC选择,来一波测试数据吧

添加依赖,公平起见引入都是最新版本feign-okhttp和feign-httpclient

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>11.0</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>11.0</version>
</dependency>

配置信息,两个都为false则默认使用的是HttpURLConnection,开启一方另一方选择关闭。

feign:
  httpclient:
    enabled: false
  okhttp:
    enabled: false

修改配置后重启youlai-auth进行测试,我这里是单次单次的请求测试,没有模拟高并发的环境去测试。(单位:ms)

次数HttpURLConnectionfeign-httpclientfeign-okhttp
117.7918.9716.39
218.0217.4516.96
316.6716.2516.27
416.6517.2814.79
523.0317.6215.06
616.3716.8015.14
717.0118.5115.71
816.1517.1214.93
916.8616.7915.76
1016.2817.2615.05

由数据可大概了解到在单次请求测试下,HttpURLConnection和feign-httpclient相差无几,但是feign-okhttp却有着相较于其他两者有着些许的性能优势。所以我最后选择了feign-okhttp,这里只是给大家做个参照。

五. 结语

至此SpringCloud整合OpenFeign实现微服务之间的相互调用已经完成。还有至于OpenFeign为什么选择使用OkHttp作为底层的client给大家做个测试参考。熟悉如何使用OpenFeign去完成微服务之间的调用在后续的工作中是必要的。

源码地址:youlai-mall

免责声明:文章转载自《Spring Cloud实战 | 第五篇:Spring Cloud整合OpenFeign实现微服务之间的调用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HTTP方式播放FLV/mp4 :nginx+Yamdi/MP4BOXgcc中gdb调试工具的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring框架扩展点详解(BeanPostProcessor等)

在日常使用Spring框架的业务开发中,利用框架提供的扩展点完成某些功能的设计是很常见的,了解这些扩展点的原理也对理解框架非常有帮助。这里做一个简单的整理、总结。 1. BeanPostProcessor BeanPostProcessor 接口定义了基本的Bean初始化回调方法,可以实现对应的回调方法来在Spring容器完成Bean的实例化、初始化前后...

spring学习(三) ———— spring事务操作

     前面一篇博文讲解了什么是AOP。学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理。                                       --wh 一、jdbcTemplate         什么是JdbcTemplate?             spring提供用...

spring2.0-2.5-3.0变化[转]

spring2.0-2.5-3.0变化[转] 博客分类: JAVA spring   2.5的新特性Spring2.5rc1发布了,一直想知道它葫芦里卖什么药,以下是文档里的change.log 1. JDK版本: JDK至少要1.4.2以上,如果仍然打算使用1.3的话就请用2.0.6/2.0.7版本吧。 2. Jar包:SpringMVC 不...

《Spring源码深度解析》一

Spring整体架构 1.1 Spring整体架构 1.1.1 Core Container: 模块:Core、Beans、Context和Expression Language Core:框架的基础部分, 提供IOC 和依赖注入特性。也包含核心工具类。基础概念是BeanFactory, 它提供对工厂模式的经典实现来消除对程序性单例模式的需要, 并真正地...

RocketMQ学习分享

消息队列的流派   什么是 MQ Message Queue(MQ),消息队列中间件。很多人都说:MQ 通过将消息的发送和接收分离来实现应用程序的异步和解偶,这个给人的直觉是——MQ 是异步的,用来解耦的,但是这个只是 MQ 的效果而不是目的。MQ 真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层的、更加简单的通讯协议。一个分布式系统中两个模...

Spring框架之jdbc源码完全解析

Spring框架之jdbc源码完全解析        Spring JDBC抽象框架所带来的价值将在以下几个方面得以体现:        1、指定数据库连接参数        2、打开数据库连接        3、声明SQL语句        4、预编译并执行SQL语句        5、遍历查询结果(如果需要的话)        6、处理每一次遍历操作...