文章目录

  • 一、 Openfeign简介
  • 二、 Openfeign的实现
    • 1 创建 springcloudopenfeign 项目
    • 2 创建 feigncommons 子模块
    • 3 创建 feignapi 子模块
    • 4 创建 feignservice 子模块 (Application server)
    • 5 创建 feignclient 子模块 (Application client)
  • 三、 Openfeign的请求参数处理
  • 四、 Openfeign的性能优化
    • 1 GZIP简介
    • 2 HTTP协议中的压缩传输简介
    • 3 在Openfeign技术中应用GZIP压缩
  • 五、 配置Openfeign负载均衡请求超时时间

一、 Openfeign简介

Openfeign是一种声明式、模板化的HTTP客户端(仅在Application Client中使用)。声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求。
Spring Cloud的声明式调用, 可以做到使用 HTTP请求远程服务时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。Openfeign的应用,让Spring Cloud微服务调用像Dubbo一样,Application Client直接通过接口方法远程调用Application Service,而不需要通过常规的RestTemplate构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

1 使用Feign技术开发时的应用部署结构

二、 Openfeign的实现

1 创建 springcloudopenfeign 项目

1.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><modules><module>feigncommons</module><module>feignapi</module><module>feignservice</module><module>feignclient</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><groupId>com.bjsxt</groupId><artifactId>springcloudopenfeign</artifactId><version>1.0-SNAPSHOT</version><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

2 创建 feigncommons 子模块


2.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloudopenfeign</artifactId><groupId>com.bjsxt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feigncommons</artifactId></project>

2.2 com.bjsxt.feign.entity 创建实体类 User

package com.bjsxt.feign.entity;import java.io.Serializable;
import java.util.Objects;public class User implements Serializable {private Integer id;private String name;private String password;public User(){}//省略get set toString equals方法

3 创建 feignapi 子模块


3.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloudopenfeign</artifactId><groupId>com.bjsxt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feignapi</artifactId><dependencies><dependency><groupId>com.bjsxt</groupId><artifactId>feigncommons</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

3.2 UserServiceAPI 接口

package com.bjsxt.feign.api;import com.bjsxt.feign.entity.User;
import org.springframework.web.bind.annotation.*;import java.util.Map;/*** 类型命名随意* 类型是用于约束微服务特性的。* 在约束请求参数的时候,Openfeign技术要特殊的限制要求:*  1、 简单类型参数,必须使用@RequestParam注解描述,且需要提供请求参数命名。*  2、 自定义类型参数,必须使用@RequestBody注解描述,且自定义类型参数数量唯一。*      就是参数表中只有唯一的参数,且是自定义类型参数。** Application Service需要提供什么服务。*  服务1 - 保存用户,方法名、参数表、返回值类型和请求路径地址、请求方式。*  服务2 - 更新用户,方法名、参数表、返回值类型和请求路径地址、请求方式。* Application Client可以访问什么远程服务。*  服务1 - 保存用户,方法名、参数表、返回值类型和请求路径地址、请求方式。*  服务2 - 更新用户,方法名、参数表、返回值类型和请求路径地址、请求方式。*/
public interface UserServiceAPI {@PostMapping("/user/save") // 就是约束了只处理POST请求方式的RequestMapping注解。Map<String, Object> saveUser(@RequestBody  User user);@PostMapping("/user/update")Map<String, Object> updateUser(@RequestBody User user);
}

4 创建 feignservice 子模块 (Application server)


4.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloudopenfeign</artifactId><groupId>com.bjsxt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feignservice</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>com.bjsxt</groupId><artifactId>feignapi</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

4.2 UserController 控制类

package com.bjsxt.feign.controller;import com.bjsxt.feign.api.UserServiceAPI;
import com.bjsxt.feign.entity.User;
import org.springframework.web.bind.annotation.RestController;import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;@RestController
public class UserController implements UserServiceAPI {@Overridepublic Map<String, Object> saveUser(User user) {Map<String, Object> result = new HashMap<>();System.out.println("保存用户数据:" + user);result.put("message", "保存用户数据成功");return result;}@Overridepublic Map<String, Object> updateUser(User user) {Map<String, Object> result = new HashMap<>();System.out.println("更新用户数据:" + user);result.put("message", "更新用户数据成功");return result;}}

4.3 application.yml 配置文件

server:port: 8082spring:application:name: feign-app-serviceeureka:client:service-url:defaultZone: http://localhost:8761/eureka/

4.4 启动类(集群)

package com.bjsxt.feign;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class FeignServiceApp {public static void main(String[] args) {SpringApplication.run(FeignServiceApp.class, args);}
}
package com.bjsxt.feign;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class FeignServiceApp1 {public static void main(String[] args) {SpringApplication.run(FeignServiceApp1.class, args);}
}

5 创建 feignclient 子模块 (Application client)


5.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloudopenfeign</artifactId><groupId>com.bjsxt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>feignclient</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>com.bjsxt</groupId><artifactId>feignapi</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies></project>

5.2 UserController 控制类

package com.bjsxt.feign.client.controller;import com.bjsxt.feign.client.service.UserService;
import com.bjsxt.feign.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/user/save")public Object save(User user){Map<String, Object> result = this.userService.saveUser(user);System.out.println(result);return result;}@GetMapping("/user/update")public Object update(User user){Map<String, Object> result = this.userService.updateUser(user);System.out.println(result);return result;}}

5.3 UserService 接口

package com.bjsxt.feign.client.service;import com.bjsxt.feign.api.UserServiceAPI;
import org.springframework.cloud.openfeign.FeignClient;/*** 本地服务,是用于远程访问Application Service的本地服务接口。*/
@FeignClient("feign-app-service")
public interface UserService extends UserServiceAPI {}

5.4 application.yml 配置文件

server:port: 8081compression:spring:application:name: feign-app-clienteureka:client:service-url:defaultZone: http://localhost:8761/eureka/feign-app-service: # 配置负载均衡ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

5.5 启动类

package com.bjsxt.feign.client;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** 需要提供一个新的注解* @EnableFeignClients - 开启OpenFeign客户端技术。扫描@FeignClient注解。*   默认扫描当前类所在包,及子包中所有的类型。*/
@SpringBootApplication
@EnableFeignClients(basePackages = {"com.bjsxt.feign.client.service"})
public class FeignClientApp {public static void main(String[] args) {SpringApplication.run(FeignClientApp.class, args);}
}

三、 Openfeign的请求参数处理

在Openfeign处理远程服务调用时,传递参数是通过HTTP协议传递的,参数存在的位置是请求头或请求体中。请求头传递的参数必须依赖@RequestParam注解来处理请求参数,请求体传递的参数必须依赖@RequestBody注解来处理请求参数。

    /*** 简单类型的请求参数,如:字符串,8种基本类型,包装类型,简单类型数组* 可以通过请求头和请求体传递,可以使用GET|POST请求方式来进行处理* Openfeign强制要求,简单类型的请求参数,必须使用@RequestParam注解描述。*/
    /*** 自定义类型请求参数处理* Openfeign强制要求,处理自定义类型请求参数的时候,必须使用@RequestBody注解描述。* @RequestBody注解强制约束: 一个方法的参数表中,只能有唯一的一个参数使用此注解描述。* Openfeign强制要求,所有的自定义类型请求参数,必须使用POST请求处理传递。* Openfeign处理自定义类型参数的时候:只能处理唯一的一个自定义类型参数对象,必须使用POST* 请求方式传递处理,对简单类型数据无约束。*/

四、 Openfeign的性能优化

1 GZIP简介

gzip介绍:

gzip是一种数据格式,采用用deflate算法压缩数据;gzip是一种流行的数据压缩算法,应用十分广泛,尤其是在Linux平台。

gzip能力:

当Gzip压缩到一个纯文本数据时,效果是非常明显的,大约可以减少70%以上的数据大小。

gzip作用:

网络数据经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是Gzip与搜索引擎的抓取工具有着更好的关系。例如 Google就可以通过直接读取gzip文件来比普通手工抓取更快地检索网页。

2 HTTP协议中的压缩传输简介

第一:客户端向服务器请求头中带有:Accept-Encoding:gzip, deflate 字段,向服务器表示,客户端支持的压缩格式(gzip或者deflate),如果不发送该消息头,服务器是不会压缩的。
第二:服务端在收到请求之后,如果发现请求头中含有Accept-Encoding字段,并且支持该类型的压缩,就对响应报文压缩之后返回给客户端,并且携带Content-Encoding:gzip消息头,表示响应报文是根据该格式压缩过的。
第三:客户端接收到响应之后,先判断是否有Content-Encoding消息头,如果有,按该格式解压报文。否则按正常报文处理。

3 在Openfeign技术中应用GZIP压缩

在Spring Cloud微服务体系中,一次请求的完整流程如下:
在整体流程中,如果使用GZIP压缩来传输数据,涉及到两次请求-应答。而这两次请求-应答的连接点是Application Client,那么我们需要在Application Client中配置开启GZIP压缩,来实现压缩数据传输。

3.1 只配置Openfeign请求-应答中的GZIP压缩 (即Application Server 和 Application Client之间)

application.yml

server:port: 8081spring:application:name: feign-app-clienteureka:client:service-url:defaultZone: http://localhost:8761/eureka/feign-app-service: # 配置负载均衡ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRulefeign:compression:request:enabled: true # 开启请求GZIP压缩mime-types:  # 什么请求类型开启GZIP压缩 a,b,c- text/html- text/plain- text/xml- application/jsonmin-request-size: 512 # 请求容量超过这个阀值的时候,开启压缩。默认值2048字节response:enabled: true # 开启响应GZIP压缩。

3.2 配置全局GZIP压缩 (即配置 浏览器与Application Client、Application Server 和 Application Client之间)

在全局配置文件中配置下述内容,来开启所有请求-应答中的GZIP压缩,这里使用的是Spring Boot中的GZIP技术。在Spring Boot中已经集成了GZIP压缩技术,并对所有的请求-应答实现GZIP数据压缩。工程中已经依赖了Spring Boot技术,所以在配置文件中可以开启Spring Boot中的GZIP压缩技术,对完整流程中所有相关的请求-应答开启GZIP压缩。

application.yml

server:port: 8081compression:enabled: true # 开启全局GZIP压缩mime-types:  # 设置开启GZIP压缩的请求头类型- text/html- text/plain- text/xml- application/json- application/javascript- application/xmlmin-response-size: 512  # 最小的响应容量阀值,超过这个容量,进行压缩,默认2048字节。spring:application:name: feign-app-clienteureka:client:service-url:defaultZone: http://localhost:8761/eureka/feign-app-service: # 配置负载均衡ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRulefeign:compression:request:enabled: true # 开启请求GZIP压缩mime-types:  # 什么请求类型开启GZIP压缩 a,b,c- text/html- text/plain- text/xml- application/jsonmin-request-size: 512 # 请求容量超过这个阀值的时候,开启压缩。默认值2048字节response:enabled: true # 开启响应GZIP压缩。

五、 配置Openfeign负载均衡请求超时时间

Openfeign技术底层是通过Ribbon技术实现的,那么在负载均衡和超时时间配置上,主要对Ribbon的配置。

超时时间配置-----在Application Client应用的配置文件 application.yml 上:

server:port: 8081compression:enabled: true # 开启全局GZIP压缩mime-types:  # 设置开启GZIP压缩的请求头类型- text/html- text/plain- text/xml- application/json- application/javascript- application/xmlmin-response-size: 512  # 最小的响应容量阀值,超过这个容量,进行压缩,默认2048字节。spring:application:name: feign-app-clienteureka:client:service-url:defaultZone: http://localhost:8761/eureka/feign-app-service: # 配置负载均衡ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRulefeign:compression:request:enabled: true # 开启请求GZIP压缩mime-types:  # 什么请求类型开启GZIP压缩 a,b,c- text/html- text/plain- text/xml- application/jsonmin-request-size: 512 # 请求容量超过这个阀值的时候,开启压缩。默认值2048字节response:enabled: true # 开启响应GZIP压缩。ribbon:ConnectTimeout: 1000 # 连接超时时间ReadTimeout: 3000 # 操作超时时间。必须大于等于ConnectTimeout。

SpringCloud Openfeign相关推荐

  1. SpringCloud OpenFeign + Nacos正确打开方式!

    作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) Nacos 支持两种 HTTP 服务请求,一个是 REST Template,另一 ...

  2. SpringCloud OpenFeign 远程HTTP服务调用用法与原理

    在 openFeign 未出现前,Spring 提供了 RestTemplate 作为远程服务调用的客户端,提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率.由于文章内容会使 ...

  3. SpringCloud OpenFeign服务调用客户端介绍及配置使用

    一.OpenFeign介绍 OpenFeign是Netfix开发的一款声明式,模板化的Http服务调用客户端.使用在服务调用者工程端.OpenFeign的负载均衡也为客户端负载均衡.一下简称Feign ...

  4. Spring-Cloud | openfeign使用细节

    2019独角兽企业重金招聘Python工程师标准>>> 写在前面的话 各位,下午好! 我比较喜欢用 fegin 来实现微服务之间的调用,但是feign使用的那些细节,是get到了吗? ...

  5. SpringCloud OpenFeign 整合 logbook 实现链路日志

    前言 工作中我们有些生产问题出现在微服务 OpenFeign 的互相调用中,然而 OpenFeign 的调用默认是不打日志的.这给我们线上排查问题带来很大的阻力. 开启 OpenFeign 日志 我们 ...

  6. springCloud openFeign返回数据转型问题

    1.被调用的服务接口返回的数据类型 @PostMapping(value = "/getPaymentById") public CommonResult<String> ...

  7. SpringCloud OpenFeign 服务调用传递 token

    业务场景 通常微服务对于用户认证信息解析有两种方案 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去. 在 gateway 直接 ...

  8. springcloud openFeign A component required a bean of type ‘ ‘ that could not be found.启动失败

    错误分析:启动类需要指定openFeign接口所在包 @EnableFeignClients(basePackages = "com.order.feign")

  9. 最新版Spring Cloud Alibaba微服务架构-Openfeign服务调用篇

    文章目录 前言 一.OpenFeign配置使用 1.引入pom依赖 2.消费端开启Feign服务调用 3.消费端动态代理Service接口 3.消费端测试 二.OpenFeign日志配置 1.全局配置 ...

最新文章

  1. 哈佛博士教你如何摆脱「尬聊」
  2. BQ24296充电管理芯片使用过程中的注意事项
  3. STM32 基础系列教程 9 – 串口通信
  4. elasticsearch搜素关键字自动补全(suggest)
  5. hdu 1754 I Hate It(分块做法)
  6. 如何让手机1秒打开健康码 ,任何机型!
  7. 盐城大数据产业园人才公寓_盐城市大数据产业园获评大众创业万众创新示范基地...
  8. ajax提交与上传文件同步
  9. MySql 优化----- 慢查询
  10. html快闪软件制作,抖音如何制作快闪视频?怎样快速制作炫酷视频?
  11. halcon 深度学习标注_halcon深度学习: 分类
  12. sql2012下载,安装,
  13. 西瓜视频4K修复技术还原经典,为内容创新打开新思路
  14. snakeyaml操作yml文件中注释的处理
  15. Python绘图库Matplotlib.pyplot之网格线设置(plt.grid())
  16. 没经验能做seo专员吗
  17. Python+经济学:资本边际效率与IRR
  18. 使用Unity3D50个技巧-50 Tips for Working with Unity (Best Practices)
  19. ARM微控制器与嵌入式系统
  20. 移动应用开发之路 01 Android Studio 项目文件介绍、创建虚拟机、完成第一个程序Hello World

热门文章

  1. 数据结构---二叉排序树
  2. Easy Math(ACM-ICPC 2018 徐州赛区网络预赛)(递归 + 杜教筛)
  3. Codeforces Round #212 (Div. 2) C. Insertion Sort 思维
  4. Codeforces Round #615 (Div. 3) A-F
  5. GCD HDU - 1695
  6. cf600 E. Lomsat gelral
  7. 区域赛铜牌专题(一)
  8. CF 1529C Parsa‘s Humongous Tree
  9. 牛客网 【每日一题】5月14日题目 maze
  10. 「BJOI2019」奥术神杖(AC自动机+DP)