前言
以下都是用到的依赖
<!--spring cloud openfeign 其中包括了ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--feign httpclient http连接池 优化模块间的通信--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
一、openfeign传参
传递参数时和正常的传递没有任何区别,下面是openfeign的接口方法
/**
* contextId 跟的是真实地址的名字
* value 服务的名字
* @author Ren
*/
@FeignClient(contextId = "test",value = "song-test")
public interface TestService {
/**
* openfeign的使用
* 测试数据
* @return
*/
@GetMapping(value = "/test/one")
Result getOne();
/**
* openfeign的使用
* 测试传递参数
* @param dog
* @return
*/
@PostMapping("/dog/save")
Result addDog(@RequestBody Dog dog);
}
二、openfeign的性能优化
2.1 性能优化之GZIP
gzip是一种数据格式 采用deflate算法压缩数据 gzip大约可以帮我们减少70%以上的文件大小,开启压缩可以有效节约网络资源 但是会增加cpu压力 建议把最小压缩的文档大小适度调大一点
server:
port: 9201
#配置gzip压缩
compression:
#是否开启压缩
enabled: true
#配置支持压缩支持的MINE TYPE
mime-types: text/html,text/xml.text/plain,application/xml,application/json
#配置openfeign的请求和响应压缩
feign:
compression:
request:
#开启请求压缩
enabled: true
# 配置压缩支持的数据格式
mime-types: text/xml,application/xml,application/json
#配置压缩数据大小的下限
min-request-size: 2048
response:
#开启响应压缩
enabled: true
2.2 性能优化之http连接池
两台服务器建立http连接的过程涉及到多个数据包的交换,消耗时间 采用http连接池可以节约大量时间提升吞吐量
feign的http客户端支持3种框架:HttpURLConnection、HttpClient、OkHttp
默认采用的是java.net.HttpURLConnection每次请求都会建立 关闭连接 为了性能考虑 可以引入后两者其中之一作为底层的通信框架
HttpURlConnection是JDK自带的http客户端技术 并不支持连接池 如果要实现连接池机制 还需要自己来管理连接对象 对于网路请求这种来说就比较麻烦
Apache提供了httpclient框架相比传统的jdk自带的http技术 它封装了http的请求头,参数,内容题,响应等等 不仅让客户端发送http请求容易 也方便测试接口 提高了开发效率 方便提高代码的健壮性 高并发时还能用连接池来提高吞吐量
OkHttp是一个处理网络请求的开源项目 是安卓端最火的轻量级框架 OKHTTP拥有共享Socket减少对服务器的请求吃书 通过连接池减少请求延迟等特点,
比如修改为httpClient客户端连接
前提要引入httpClient的依赖然后修改为以下配置,就完成了该优化
feign:
httpclient:
#开启httpclient连接池
enabled: true
2.3 性能优化之请求日志
如果想看微服务中每个接口我们可以配置日志来查看各个微服务之间的详细信息
在微服务模块的配置文件中新建logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--日志存放路径 这里要改成自己的项目-->
<property name="log.path" value="logs/song-system" />
<!--日志输出格式-->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!--控制台输出-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!--系统日志输出-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!--循环政策 基于时间创建日志文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件名格式-->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--日志最大保存天数-->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤级别-->
<level>INFO</level>
<!--匹配时的操作 接收记录-->
<onMatch>ACCEPT</onMatch>
<!--不匹配时的操作 拒绝记录-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!--循环政策 基于时间创建日志文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件名格式-->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--日志最大保存天数-->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤级别-->
<level>ERROR</level>
<!--匹配时的操作 接收记录-->
<onMatch>ACCEPT</onMatch>
<!--不匹配时的操作 拒绝记录-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--系统模块日志控制级别 这里要改成自己的项目-->
<logger name="org.example" level="debug" />
<!--spring 日志级别控制-->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>
添加完之后 要注入该日志需要的对象
如果想看所有请求的日志和详细信息需要全局配置 就是直接在spring boot启动类里面直接添加一下代码
/** * 全局配置日志类 * @param */ @Bean public Logger.Level getLog(){ return Logger.Level.FULL; }
如果想看局部的那么就局部配置
首先需要新建一个配置类
@Configuration
public class FeignConfiguration{
@Bean
public Logger.Level getLog(){
return Logger.Level.FULL;
}
}
然后在客户端指定该配置就完成了局部日志
/**
* contextId 跟的是真实地址的名字
* value 服务的名字
*configuration=FrignConfiguration.class 表示只对调用的接口的请求生成日志
* @author Ren
*/
@FeignClient(contextId = "test",value = "song-test" configuration=FrignConfiguration.class)
public interface RemoteTestService {
/**
* openfeign的使用
* 测试数据
* @return
*/
@GetMapping(value = "/test/one")
Result getOne();
/**
* openfeign的使用
* 测试传递参数
* @param dog
* @return
*/
@PostMapping("/dog/save")
Result addDog(@RequestBody Dog dog);
}
总结
无