Cloud服务之间的调用OpenFeign性能优化

详细视频请参照:[Java架构师第十五步]--SpringCloud企业级开发实战-学习视频教程-腾讯课堂

我们在使用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
<?xml version="1.0" encoding="UTF-8"?>

    
	
   
	

    
	
		
			${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);
}

今天的分享就到这里,喜欢的小伙伴点个关注!

详细视频在顶部链接

一盒烟的价钱让你学会Cloud的方方面面

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章