我们在使用Cloud的时候,经常会涉及到服务之间的调用。使用的技术为OpenFeign,那么对于OpenFeign在远程调用的时候一些优化,我们来聊一聊:
优化方案(一)性能优化之GZip压缩
gzip是一种数据格式,采用deflate算法压缩数据。gzip大约可以帮我们减少70%以上的文件大小。
开启压缩可以有效节约网络资源,但是会增加CPU压力,建议把最小压缩的文档大小适度调大一点
如何设定GZip压缩,只需要在配置中心Nacos中完成这样的配置即可:
server:
port: 9201
compression:
# 是否开启压缩!!!!!!!!!!!!!!!!!!
enabled: true
# 配置支持压缩的 MIME TYPE!!!!!!!!!!!!!!!!
mime-types: text/html,text/xml,text/plain,application/xml,application/json
feign:
compression:
request:
# 开启请求压缩
enabled: true
# 配置压缩支持的 MIME TYPE
mime-types: text/xml,application/xml,application/json
# 配置压缩数据大小的下限
min-request-size: 2048
response:
# 开启响应压缩
enabled: true
spring:
application:
name: song-system
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/
instance:
instance-id: haha
prefer-ip-address: true
优化方案(二)性能优化之Http连接池
两台服务器建立HTTP连接的过程涉及到多个数据包的交换,很消耗时间。采用HTTP连接池可以节约大量的时间提示吞吐量。
Feign的HTTP客户端支持3种框架:HttpURLConnection、HttpClient、OkHttp。
默认是采用
java.net.HttpURLConnection,每次请求都会建立、关闭连接,为了性能考虑,可以引入httpclient、okhttp作为底层的通信框架。
HttpURLConnection是JDK自带的HTTP客户端技术,并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的其他方案,也没有必要自己去管理连接对象。
Apache提供的HttpClient框架相比传统JDK自带的HttpURLConnection,它封装了访问http的请求头,参数,内容体,响应等等;它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性;另外高并发大量的请求网络的时候,还是用“HTTP连接池”提升吞吐量。
OKHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架。OKHttp拥有共享Socket,减少对服务器的请求次数,通过连接池,减少了请求延迟等技术特点。
例如将Feign的HTTP客户端工具修改为HttpClient:
- 步骤一 :添加依赖
io.github.openfeign
feign-httpclient
- 步骤二:全局配置
feign:
httpclient:
# 开启httpclient
enabled: true
优化方案(三)性能优化之请求日志
日志配置:浏览器发起的请求可以通过F12查看请求和响应信息。如果想看微服务中每个接口我们可以使用日志配置方式进行查看详细信息。
配置步骤:
- 第一步:配置文件logback.xml,设置日志级别为debug
${log.pattern}
${log.path}/info.log
${log.path}/info.%d{yyyy-MM-dd}.log
60
${log.pattern}
INFO
ACCEPT
DENY
${log.path}/error.log
${log.path}/error.%d{yyyy-MM-dd}.log
60
${log.pattern}
ERROR
ACCEPT
DENY
- 第二步:添加全局配置类
@Bean
public Logger.Level getLog()
{
return Logger.Level.FULL;
}
- 第三步:Feign配置
/**
* Feign 客户端配置
*/
@Configuration
public class FeignConfiguration
{
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}
- 第四步:在客户端接口配置
@FeignClient(contextId = "test", value = "song-test", configuration = FeignConfiguration.class)
public interface TestService
{
@GetMapping(value = "/test/haha")
Result getHaha();
@PostMapping(value = "/test/add")
Result addStudent(@RequestBody Student s);
}
今天的分享就到这里,喜欢的小伙伴点个关注!