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

一. 前言

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

二. 什么是OpenFeign?

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

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

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

OpenFeign的@FeignClient能够解析SpringMVC的@RequestMapping注解下的接口,经过动态代理生成实现类,实现类作负载均衡并调用其余服务。并发

三. 项目信息

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

如今要实现这么个需求,认证中心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-server 8848 注册中心和配置中心
youlai-auth 8000 认证中心
youlai-admin 8080 平台服务

版本声明:高并发

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

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

远程调用代码

@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

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)

次数 HttpURLConnection feign-httpclient feign-okhttp
1 17.79 18.97 16.39
2 18.02 17.45 16.96
3 16.67 16.25 16.27
4 16.65 17.28 14.79
5 23.03 17.62 15.06
6 16.37 16.80 15.14
7 17.01 18.51 15.71
8 16.15 17.12 14.93
9 16.86 16.79 15.76
10 16.28 17.26 15.05

由数据可大概了解到在单次请求测试下,HttpURLConnection和feign-httpclient相差无几,可是feign-okhttp却有着相较于其余二者有着些许的性能优点。因此我最后选择了feign-okhttp,这里只是给你们作个参照。

五. 结语

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

源码地址:youlai-mall

相关文章
相关标签/搜索