14.Spring-Cloud-Feign中请求压缩配置和日志配置

   请求压缩配置

    Spring Cloud  feign支持对请求与响应进行GZIP压缩,以减少通信中的性能损耗,主要是在spring-cloud-netflix-core.jar文件中.

默认对请求和相应压缩是禁用的,从
org.springframework.cloud.netflix.feign.encoding.FeignContentGzipEncodingAutoConfiguration类中可以看到请求压缩是禁用的
源码:
@ConditionalOnProperty(value = "feign.compression.request.enabled", matchIfMissing = false)
org.springframework.cloud.netflix.feign.encoding.FeignAcceptGzipEncodingAutoConfiguration.class类中可以看到响应压缩是禁用的
源码:

@ConditionalOnProperty(value = "feign.compression.response.enabled", matchIfMissing = false)

org.springframework.cloud.netflix.feign.encoding.FeignClientEncodingProperties类中配置了一些默认的编码属性
源码:
@ConfigurationProperties("feign.compression.request")
public class FeignClientEncodingProperties {
    /**
     * The list of supported mime types.
     */
    private String[] mimeTypes = new String[]{"text/xml", "application/xml", "application/json"};
    /**
     * The minimum threshold content size.
     */
    private int minRequestSize = 2048;

}

在application.properties中自定义请求压缩


feign.compression.request.enabled=true
feign.compression.response.enabled=true
#默认配置
feign.compression.request.mine-types=text/xml,application/xml,application/json 
#默认配置
feign.compression.request.min-request-size=2048


日志配置

在构建@FeignClient注解修饰的服务客户端时,会为一个客户端都创建一个feign.Logger实例,可以利用该日志对象的DEBUG模式来分析Feign的请求细节。具体配置在application.properties中配置:

logging.level.<FeignClient>=DEBUG开启指定Feign客户端的DEBUG模式日志;

<FeignClient>为Feign客户端定义接口的完整路径

如:
logging.level.com.niugang.service.HelloService=DEBUG

只添加上面配置还无法实现对DEBUG日志的输出,以因为Feign客户端默认的logger.level对象定义为none级别,所以不会记录feign调用过程中的信息。

feign中日志级别
  /**
   * Controls the level of logging.
   */
  public enum Level {
    /**
     * No logging.不记录日志
     */
    NONE,
    /**
*只记录请求方法和URL,以及响应状态代码和执行时间。
     * Log only the request method and URL and the response status code and execution time.
     */
    BASIC,
    /**
*记录请求和响应头基本信息。
     * Log the basic information along with request and response headers.
     */
    HEADERS,
    /**
*记录请求和响应的标头、正文和元数据
     * Log the headers, body, and metadata for both requests and responses.
     */
    FULL

  }

创建方式一:在启动类上配置


@SpringBootApplication
@EnableDiscoveryClient
//扫描声明它们是feign客户端的接口(通过@FeignClient)
@EnableFeignClients
public class Application {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}


测试

   输入:http://localhost:9001/feign-consumer1/zhangsan

   输入:http://localhost:9001/feign-consumer2/zhangsan/15094031789

创建方式二:定义配置类

 

1.创建专门的配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.Logger;
@Configuration
public class FeignLoggerConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}

2.在服务调用接口上进行绑定

//value:调用服务的名
//fallback:配置服务降级类
//configuration:定制客户端的自定义@configuration。可以包含对组成客户端的片段的重写@Bean定义

@FeignClient(value="service-provide",fallback=ServiceProvideFallBack.class,configuration=FeignLoggerConfig.class)

测试效果和在启动类上配置效果一样

微信公众号

                          

实验十五 SpringCloud的使用 一、实验目的 1、了解SpringCloud的作用 2、掌握SpringCloud配置使用 3、了解SpringCloud的组件使用方法 二、实验过程 1、编写程序测试Springcloud服务发现过程。首先创建项目springcloud,然后分别创建3个子模块discovery、producercomsumer。(以下配置或代码供参考,注意相关依赖版本JDK版本) a)Springcloud工程的依赖配置 <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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <groupId>org.example</groupId> <artifactId>SpringCloud</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <name>SpringCloud</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.0.3.RELEASE</version> <scope>test</scope> </dependency> </dependencies> </project> b)配置discovery服务发现中心 1)相关依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.3.5.RELEASE</version> </dependency> 2)服务中心启动代码 import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } 3)application.yml server.port=8260 eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka c)配置producer服务生产者 1)相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> 2)关键代码 主程序 App.java @EnableDiscoveryClient @SpringBootApplication public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); } } 服务提供程序 PController.java @RestController public class PController{ protected Logger logger = LoggerFactory.getLogger(HelloEndpoint.class); @Autowired private EurekaInstanceConfig eurekaInstanceConfig; @Value("${server.port}") private int serverPort = 0; @RequestMapping(value = "/hello", method = RequestMethod.GET) public String hello() { return "Hello, Spring Cloud! I am from producer 1. My port is " + String.valueOf(serverPort); } } 3)配置application.yml server.port=2100 spring.application.name=SERVICE-HELLO eureka.client.service-url.defaultZone=http://localhost:8260/eureka d)配置consumer服务消费者 1)相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 2)主要代码 主程序 App.java @EnableDiscoveryClient @SpringBootApplication public class ConsumerApp { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerApp.class, args); } } 服务消费程序 CController.java @RestController public class HelloController { @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/chello", method = RequestMethod.GET) public String hello() { return restTemplate.getForEntity("http://SERVICE-HELLO/hello", String.class).getBody(); } } 3)配置文件application.properties server.port=8080 spring.application.name=consumer-hello eureka.client.service-url.defaultZone=http://localhost:8260/eureka 2、参考以上内容进行代码编写项目配置,分别运行服务发现中心,生产者消费者程序,最后测试消费者是否能够成功消费生产者提供的服务,并将相关过程的结果截图于此。 3、修改消费者模块,用Feign进行改造,使其能够简化服务调用的请求。 4、提交代码文档至超星,命名为“班级+学号+姓名+实验十五.rar”。
最新发布
06-26
<think>我们正在使用SpringCloud构建微服务架构,需要搭建Eureka服务发现中心,并配置生产者(Producer)消费者(Consumer)模块。消费者将使用Feign客户端简化对生产者的调用。步骤概览:1.创建Eureka服务器(服务发现中心)2.创建生产者服务(Producer)并注册到Eureka3.创建消费者服务(Consumer)并注册到Eureka,同时使用Feign调用生产者服务详细步骤:一、搭建Eureka服务发现中心1.创建SpringBoot项目,添加EurekaServer依赖。在pom.xml中添加:```xml<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>```2.在启动类上添加`@EnableEurekaServer`注解。```java@SpringBootApplication@EnableEurekaServerpublicclassEurekaServerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EurekaServerApplication.class,args);}}```3.配置application.yml(或application.properties):```yamlserver:port:8761#Eureka默认端口eureka:instance:hostname:localhostclient:registerWithEureka:false#不向自己注册fetchRegistry:false#不从自己获取注册信息serviceUrl:defaultZone:http://${eureka.instance.hostname}:${server.port}/eureka/```二、创建生产者服务(Producer)1.创建SpringBoot项目,添加EurekaClient依赖(用于注册到Eureka)Web依赖(用于提供REST服务)。pom.xml:```xml<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>```2.在启动类上添加`@EnableEurekaClient`注解(新版本也可以不加,但为了清晰可以加上)。```java@SpringBootApplication@EnableEurekaClientpublicclassProducerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ProducerApplication.class,args);}}```3.配置application.yml:```yamlserver:port:8081#生产者服务端口spring:application:name:producer-service#服务名称,消费者将通过这个名称调用eureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/#Eureka服务器地址```4.编写一个简单的REST接口:```java@RestControllerpublicclassProducerController{@GetMapping("/hello")publicStringhello(){return"HellofromProducer!";}}```三、创建消费者服务(Consumer)并使用Feign调用生产者服务1.创建SpringBoot项目,添加EurekaClient依赖(用于注册到Eureka)Feign依赖。pom.xml:```xml<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>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>```2.在启动类上添加`@EnableEurekaClient``@EnableFeignClients`注解。```java@SpringBootApplication@EnableEurekaClient@EnableFeignClients//启用Feign客户端publicclassConsumerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ConsumerApplication.class,args);}}```3.配置application.yml:```yamlserver:port:8082#消费者服务端口spring:application:name:consumer-serviceeureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/```4.创建Feign客户端接口,用于调用生产者服务:```java@FeignClient(name="producer-service")//使用服务名称publicinterfaceProducerFeignClient{@GetMapping("/hello")//映射生产者的接口StringcallHello();}```5.在消费者Controller中注入Feign客户端并调用:```java@RestControllerpublicclassConsumerController{@AutowiredprivateProducerFeignClientproducerFeignClient;@GetMapping("/call-producer")publicStringcallProducer(){returnproducerFeignClient.callHello();}}```四、测试1.启动Eureka服务器(端口8761)2.启动生产者服务(端口8081)3.启动消费者服务(端口8082)访问Eureka服务器管理界面:http://localhost:8761,应该能看到两个服务已注册。通过消费者服务调用生产者服务:访问http://localhost:8082/call-producer,应该返回"HellofromProducer!"。这样就完成了使用SpringCloud搭建Eureka服务发现中心,并配置了生产者消费者,使用Feign进行服务调用。注意:Feign已经集成了Ribbon负载均衡,如果有多个生产者实例,Feign会自动进行负载均衡调用。引用说明:[^1]:Feign封装了Ribbon负载均衡Eureka服务器访问以及REST格式处理。[^2]:启动类需要添加`@EnableDiscoveryClient``@EnableFeignClients`注解。[^3]:生产者服务的启动类使用`@EnableEurekaClient`,消费者启动类使用`@EnableFeignClients`。[^4]:FeignClient的name属性指定了生产者服务的注册名称,用于服务发现。[^5]:在application.properties(或application.yml)中配置服务名称Eureka服务器地址。§§相关问题§§1.如何在Feign客户端中传递请求参数?2.如何配置Feign客户端的超时时间?3.如何实现Feign客户端的熔断降级(fallback)?</think>### Spring Cloud Eureka与Feign服务调用实现 我将指导您搭建一个完整的Spring Cloud服务发现与调用系统,包括Eureka服务注册中心、生产者(Producer)消费者(Consumer)模块。 --- ### 一、系统架构 ```mermaid graph LR E[Eureka Server:8761] -->|注册| P[Producer] E -->|注册| C[Consumer] C -->|Feign调用| P ``` --- ### 二、实现步骤 #### 1. 创建Eureka服务注册中心 **pom.xml 关键依赖**: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> ``` **启动类**: ```java @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } ``` **application.yml配置**: ```yaml server: port: 8761 eureka: client: register-with-eureka: false # 不注册自己 fetch-registry: false # 不获取注册表 service-url: defaultZone: http://localhost:8761/eureka/ ``` --- #### 2. 创建生产者服务(Producer) **pom.xml 关键依赖**: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` **启动类**: ```java @SpringBootApplication @EnableEurekaClient public class ProducerApplication { public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args); } } ``` **application.yml配置**: ```yaml server: port: 8081 spring: application: name: producer-service # 服务标识名 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ ``` **生产者接口**: ```java @RestController public class ProducerController { @GetMapping("/hello") public String hello(@RequestParam String name) { return "Hello, " + name + "! From Producer"; } } ``` --- #### 3. 创建消费者服务(Consumer)使用Feign **pom.xml 关键依赖**: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` **启动类**: ```java @SpringBootApplication @EnableFeignClients // 启用Feign @EnableEurekaClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } ``` **Feign客户端接口**: ```java @FeignClient(name = "producer-service") // 使用服务名 public interface ProducerFeignClient { @GetMapping("/hello") String callHello(@RequestParam("name") String name); } ``` **消费者控制器**: ```java @RestController public class ConsumerController { @Autowired private ProducerFeignClient feignClient; @GetMapping("/call-producer") public String callProducer(@RequestParam String name) { return feignClient.callHello(name); } } ``` **application.yml配置**: ```yaml server: port: 8082 spring: application: name: consumer-service eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ feign: client: config: default: # Feign全局配置 connectTimeout: 5000 # 连接超时 readTimeout: 5000 # 读取超时 ``` --- ### 三、测试流程 1. 启动顺序: ``` Eureka Server → Producer → Consumer ``` 2. 访问Eureka控制台: http://localhost:8761 应看到`PRODUCER-SERVICE``CONSUMER-SERVICE`已注册 3. 测试Feign调用: ``` http://localhost:8082/call-producer?name=SpringCloud ``` 返回结果:`Hello, SpringCloud! From Producer` --- ### 四、关键机制解析 1. **服务发现过程**: - 服务启动时向Eureka注册元数据(IP、端口、健康指标) - Eureka每30秒心跳检测服务可用性[^1] - Feign通过服务名`producer-service`解析实际地址 2. **Feign工作原理**: - 动态生成接口实现类 - 集成Ribbon实现负载均衡 - 自动处理HTTP请求/响应序列化[^4] 3. **配置要点**: - `@EnableFeignClients`扫描Feign接口 - `@FeignClient`的name必须匹配生产者服务名 - 超时配置防止调用阻塞[^4] > **注意**:当启动多个生产者实例时,Feign会自动实现负载均衡,这是通过内置的Ribbon组件完成的[^1]。 --- ### 五、常见问题解决 1. **服务注册失败**: - 检查`defaultZone`地址是否正确 - 确认依赖包含`eureka-client` 2. **Feign调用报404**: - 确认生产者接口路径完全匹配 - 检查`@FeignClient`的name与服务名一致 3. **调用超时**: ```yaml feign: client: config: default: connectTimeout: 3000 readTimeout: 5000 ``` --- ### 六、扩展优化 1. **添加Hystrix熔断**: ```java @FeignClient(name = "producer-service", fallback = ProducerFallback.class) ``` 2. **启用请求压缩**: ```yaml feign: compression: request: enabled: true ``` 3. **日志调试**: ```java @Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } ``` [^1]: Feign封装了Ribbon负载均衡Eureka服务器访问,简化了服务调用过程 [^2]: 启动类需要添加`@EnableDiscoveryClient``@EnableFeignClients`注解 [^3]: 生产者服务注册使用`@EnableEurekaClient`注解 [^4]: FeignClient的name属性对应生产者服务的注册名称 [^5]: Eureka客户端配置需要指定服务注册中心地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值