文章目录
六、Netflix Feign 服务调用
6.1 Feign 简介
我们在Java使用接口调用时,可以借助HttpClient、OkHttp、HttpURLConnection以及我们之前一直在使用的RestTemplate等工具来完成接口调用的功能;我们接下来要学习的Feign也是来帮我们做接口调用的;在SpringCloud中,使用Feign非常简单创建一个接口,并在接口上添加一些注解,就可以实现远程调用,在Feign中我们只需要像调用方法一样调用它就可以完成服务请求及相关处理;
Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡
-
Feign和Ribbon的关系:
- Ribbon是一个基于 HTTP和TCP客户端的负载均衡的工具。它可以在客户端配置服务端列表(listOfServers),使用RestTemplate、HttpClient等模拟http请求;使用步骤相对繁琐
- Feign 是在 Ribbon的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。采用接口+方法的方式, 只需要创建一个接口,然后在上面添加注解,提供对应的方法即可;这个过程不需要自己构建http请求。就像是调用自身工程的方法调用,而感觉不到是调用远程方法,使得编写客户端变得非常容易
6.2 Feign 快速入门
1)引入Spring Cloud OpenFeign依赖:
<!--Feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2)在启动类上标注注解:
@EnableFeignClients // 开启Feign客户端
3)建立接口:
package com.cloud.item.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.Map;
/**
* @author lscl
* @version 1.0
* @intro:
*/
@FeignClient("order-service")
public interface OrderClient {
@GetMapping("/order/{id}")
Map findById(@PathVariable Integer id);
}
6.3 Feign的负载均衡
Feign集成了Ribbon,大多数和Ribbon有关的配置都是一样的配置方法;
- 全局:
/**
* 配置负载均衡器
* @return
*/
@Bean
public RandomRule randomRule(){
return new RandomRule();
}
- 针对某个微服务:
order-service: # 微服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
6.4 请求压缩
6.4.1 Gzip 压缩简介
Gzip是一种压缩过后的文件,采用deflate压缩算法,Gzip主要用来压缩html,css,javascript,等静态文本文件,也支持对动态生成的,包括CGI、PHP、JSP、ASP、Servlet、SHTML等输出的网页也能进行压缩。Gzip压缩的比率通常在3~10倍之间,这样可以大大节省服务器的网络带宽,大大提升浏览器的浏览速度。
- HTTP对Gzip的支持:
HTTP 协议支持Gzip压缩机制,也称协议压缩。HTTP Gzip压缩是由WEB服务器和浏览器共同遵守的协议,也就是说WEB服务器和浏览器都必须遵守。目前主流的服务器和浏览器都支持GZIP压缩技术。包括 Chrome、IE、FireFox、Opera 等;服务器有Tomcat、Apache 和 IIS 等。
我们一般发送请求都是使用浏览器,遵循HTTP协议,HTTP对Gzip压缩有非常好的支持;但是如果我的的客户端改为了HttpClient、RestTemplate等其他组件,那么就不支持Gzip压缩了;
6.4.2 如何使用Gzip压缩
目前主流的浏览器和服务器都支持Gzip压缩,我们要做的只是开启Gzip压缩;
1)客户端发送http请求,如果请求头中携带Accept-Encoding: gzip,deflate
,表示告诉服务器需要进行Gzip压缩;
2)服务器在接收请求头上携带有Accept-Encoding: gzip,deflate
的请求时,会对响应内容进行压缩,并在响应头中添加Content-Encoding: gzip
;表示响应的内容是经过压缩的;如果不符合,那么将不压缩,直接返回。
3)客户端接收到响应后,如果响应头中包含Content-Encoding: gzip
那么浏览器会自动将响应内容进行Gzip解压缩,然后再呈现在页面上。如果不包含,那么将直接呈现在页面上。
Tips:Gzip压缩需要客户端(浏览器)与服务器端(Tomcat)双方的支持;
我们打开浏览器,访问http://www.baidu.com;打开抓包工具,查看请求头是否有携带Accept-Encoding: gzip,deflate
Tips:百度首页的请求已经告诉服务器,需要进行Gzip压缩;
查看响应头是否有携带Content-Encoding: gzip
6.4.3 Tomcat Gzip压缩配置
在Tomcat/conf/server.xml下配置:
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="firefox"
compressableMimeType="text/html,text/xml,text/javascript,
application/javascript,text/css,text/plain,text/json"/>
-
compression
:是否开启Gzip压缩,on:开启压缩,off:关闭压缩,force:任何情况下都开启压缩; -
compressionMinSize
:最小的压缩大小,如果文件小于这个大小则不进行压缩;单位B,默认为2048B; -
noCompressionUserAgents
:设置指定的浏览器不压缩;默认所有的浏览器都压缩;多个浏览器使用逗号隔开 -
compressableMimeType
:指定会被压缩的MIME类型列表,多个使用逗号隔开;
6.4.4 Feign对Gzip的支持
我们前面说到HTTP协议对Gzip有很好的支持,但是如果我们的客户端换成了HttpClient或者其他,那么就不再支持Gzip压缩了;好在Feign对Gzip有很好的支持,我们在使用Feign对其调用时,也可以使用Gzip压缩;
Feign开启Gzip压缩:
feign:
compression:
request:
mime-types: text/html,application/json # 配置指定的MIME类型才压缩
min-request-size: 100 # 配置最小的压缩大小(小于此大小的文件不压缩)
enabled: true # 开启请求Gzip压缩
response:
enabled: true # 开启响应Gzip压缩
Tips:开启Feign的压缩之后,使用Feign进行远程调用时,就进行请求的压缩;
开启Item服务器的Gzip压缩:
server:
port: 9000
compression:
enabled: true # 开启服务器的Gzip压缩
Tips:我们进行浏览器抓包只是能看到Item服务器对浏览器响应的请求结果做了压缩,并不能看到Feign的Gzip压缩,我们可以配置Feign的日志来观察;
6.5 Feign的日志支持
在开发或者运行阶段往往希望看到Feign请求过程的日志记录,默认情况下Feign的日志是没有开启的。我们可以通过配置文件或者配置类的方式来配置Feign在调用时的日志输出;
-
Feign日志级别有4种:
NONE
:不记录任何日志(默认值)BASIC
:仅记录请求方法、URL、响应状态代码以及执行时间HEADERS
:记录BASIC级别的基础上,记录请求和响应的头信息。FULL
:记录请求和响应的header、body,一般用于测试环境
-
1)配置文件方式,修改
application.yml
配置文件:
feign:
client:
config:
order-service: # 调用哪个服务需要开启日志
loggerLevel: FULL # 日志的级别
logging: # logging配置配置
level:
com.cloud.item.client.OrderClient: debug # 开启debug日志
访问http://localhost:9000/item/findOrderById/1,观察item服务器的控制台:
- 2)配置类的方式:
编写配置类:
package com.cloud.item;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author lscl
* @version 1.0
* @intro: Feign的配置
*/
@Configuration
public class FeignClientConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
配置类:
logging: # logging配置配置
level:
com.cloud.item.client.OrderClient: debug # debug级别
FeignClient:
package com.cloud.item.client;
import com.cloud.item.FeignClientConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.FeignClientProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.Map;
/**
* @author lscl
* @version 1.0
* @intro:
*/
@FeignClient(value = "order-service",configuration = FeignClientConfig.class) // 指定配置类
public interface OrderClient {
@GetMapping("/order/{id}")
Map findById(@PathVariable Integer id);
}
重启服务器,访问http://localhost:9000/item/findOrderById/1,观察控制台
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131747.html