day04-OpenFeign
1 OpenFeign的区别
- OpenFeign
- 声明性web服务客户端
- 使用只需要定义一个接口然后注解@FeignClient
- 基本是当前服务之间调用的标准
- OpenFeign集成了LoadBalancer、集成阿里巴巴Sentinal提供熔断、降级等功能
2 OpenFeign使用
-
消费端/服务使用者引入依赖
<!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
添加yaml配置consul注册服务
server: port: 80 spring: application: name: cloud-consumer-openfeign-order ####Spring Cloud Consul for Service Discovery cloud: consul: host: localhost port: 8500 discovery: prefer-ip-address: true #优先使用服务ip进行注册 service-name: ${spring.application.name}
-
主启动类添加注解
@EnableFeignClients
表示开启Open Feign -
新建服务接口 -- 如果考虑多个模块都需要掉用就建在common模块中
package com.atguigu.cloud.apis; import com.atguigu.cloud.entities.Pay; import com.atguigu.cloud.entities.PayDTO; import com.atguigu.cloud.resp.ResultData; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @FeignClient(value = "cloud-payment-service") public interface PayFeignApi { @PostMapping("/pay/add") // 对应服务的接口路径 public ResultData<String> addPay(@RequestBody Pay pay); @DeleteMapping("/pay/del/{id}") public ResultData<Integer> delete(@PathVariable("id") Integer id); @GetMapping("/pay/get/{id}") public ResultData<PayDTO> getById(@PathVariable("id") Integer id);// 此处的PathVariable一定要加上值‘id’ 否则会报错 @GetMapping("/pay/get/info") public String getInfoFromConsul(); }
-
建立使用者的Controller类,在其中注入api实例,通过调用接口中暴露的方法调用相应的微服务
package com.atguigu.cloud.controller; import com.atguigu.cloud.apis.PayFeignApi; import com.atguigu.cloud.entities.Pay; import com.atguigu.cloud.resp.ResultData; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; @RestController @Slf4j @RequestMapping("/feign") public class OrderController { @Resource private PayFeignApi payFeignApi; @PostMapping("/add") public ResultData addPay(@RequestBody Pay pay){ return payFeignApi.addPay(pay); } @GetMapping("/del/{id}") public ResultData deletePay(@PathVariable Integer id){ return payFeignApi.delete(id); } @GetMapping("/get/{id}") public ResultData getById(@PathVariable Integer id){ return payFeignApi.getById(id); } @GetMapping("/get/info") public String getInfo(){ return payFeignApi.getInfoFromConsul(); } }
3 高级特性
-
超时控制
-
默认超时时间 1 minute,超出后报异常
-
yml中开启配置
- 全局控制
spring: cloud: openfeign: client: config: default: connectTimeout: 3000 readTimeout: 3000
- 指定配置
spring: cloud: openfeign: client: config: service-name: connectTimeout: 3000 readTimeout: 3000
优先配置为具体的超时时间
-
-
重试机制
-
默认重试是关闭的
-
开启重试机制
-
新增配置类FeignConfig
package com.atguigu.cloud.config; import feign.Retryer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignConfig { @Bean public Retryer myRetriever(){ // return Retryer.NEVER_RETRY; // 默认的不重试 return new Retryer.Default(100,1,3); // 初始间隔100ms 重试间最大间隔时间1s 最大请求次数3此 } }
-
-
-
默认HTTPClient修改
-
默认使用的是HttpURLConnection,修改为Apache HttpClient5--性能更好
-
添加pom
<dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-hc5</artifactId> <version>13.1</version> </dependency>
-
Apache HttpClient5配置开启
spring: cloud: openfeign: httpclient: hc5: enabled: true
-
-
-
请求/响应压缩 -- 支持对请求和响应进行gzip压缩 减少通信过程中的性能损耗
-
开启配置
spring.cloud.openfeign.compression.request.enabled=true spring.cloud.openfeign.compression.response.enabled=true
-
细粒度化配置
spring.cloud.openfeign.compression.request.enabled=true spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json #触发压缩数据类型 spring.cloud.openfeign.compression.request.min-request-size=2048 #最小触发压缩的大小
-
-
日志打印功能
-
调整日志打印的级别,对feign调用的细节进行监控
-
级别:
- NONE 默认 不显示任何日志
- BASIC 仅记录请求方法、URL、响应状态码及执行时间;
- HEADERS 除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
- FULL 除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
-
配置日志:
package com.atguigu.cloud.config; import feign.Logger; import feign.Retryer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @auther zzyy * @create 2023-04-12 17:24 */ @Configuration public class FeignConfig { @Bean public Retryer myRetryer() { return Retryer.NEVER_RETRY; //默认 } @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
-
配置监控的客户端
# feign日志以什么级别监控哪个接口 logging: level: com: # 监控类的完整包路径 atguigu: cloud: apis: PayFeignApi: debug # 只能是debug监控
-