SpringCloudAlibaba快速整合OpenFeign
第一步:
<!--1. 添加openfeign依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
第二步:
package com.order.service; import com.order.config.feign.FeignConfig; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; /** * @author vans on 2022/2/20 12:23 */ /** * name 指定调用接口所对应的服务名 * path 指定调用接口所在的ProductController指定的@RequestMapping */ @FeignClient(name = "product-service",path = "/vn/product"/*,configuration = FeignConfig.class*/) public interface ProductService { @ApiOperation(value = "获取所有库存列表",notes = "不需要任何参数") @ApiImplicitParam(name = "",value = "",required = false,dataType = "") @GetMapping("/{id}") String getProduct(@PathVariable("id") String id); }
第三步:
package com.order.controller; import com.order.service.ProductService; import com.order.service.StockService; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * @author vans on 2022/2/16 18:13 */ @RestController @RequestMapping("/vn/order") @Slf4j public class OrderController { @Autowired private StockService stockService; @Autowired private ProductService productService; @ApiOperation(value = "获取所有用户列表", notes = "不需要任何参数") @ApiImplicitParam(name = "运单号", value = "mailNo", required = false, dataType = "String") @RequestMapping(value="/{mailNo}",method = RequestMethod.GET) public String getOrder(@PathVariable("mailNo") String mailNo) { String stock = stockService.getStock(); String product = productService.getProduct(mailNo); return stock + "---" + product; } }
第四步:
package com.order; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; /** * @author vans on 2022/2/16 18:32 */ /** * 此配 scanBasePackages={"com.netflix.client.config.IClientConfig"} 解决: * Consider defining a bean of type 'com.netflix.client.config.IClientConfig' in your configuration. */ @SpringBootApplication(scanBasePackages={"com.netflix.client.config.IClientConfig","com.order"}) @EnableFeignClients public class VnOrderApplication { public static void main(String[] args) { SpringApplication.run(VnOrderApplication.class,args); } }
Spring Cloud Feign的自定义配置及使用
package com.order.config.feign; import com.order.interceptor.FeignAuthInterceptor; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author vans on 2022/2/20 12:30 */ /** * * 全局配置: 当使用@Configuration 会将配置作用所有的服务提供方 * 局部配置: 1. 通过配置类:如果只想针对某一个服务进行配置, 就不要加@Configuration * 2. 通过配置文件 * */ //@Configuration public class FeignConfig { // @Bean // public Logger.Level feignLoggerLevel(){ // return Logger.Level.FULL; // } /** * 修改契约配置,支持Feign原生的注解 * 注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原 生的注解 * @return */ // @Bean // public Contract feignContract() { // return new Contract.Default(); // } /** * 超时时间配置 */ /*@Bean public Request.Options options() { return new Request.Options(5000, 10000); }*/ /** * 自定义拦截器 * @return */ @Bean public FeignAuthInterceptor feignAuthRequestInterceptor(){ return new FeignAuthInterceptor(); } }
自定义拦截器:
package com.order.interceptor; import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; /** * @author vans on 2022/2/20 14:06 */ @Slf4j public class FeignAuthInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header("xxx","xxx"); requestTemplate.query("id","111"); requestTemplate.uri("/9"); log.info("feign拦截器!"); } }
配置文件对日志、拦截器等进行配置:
server: port: 82 spring: application: name: order-service # 应用名称 nacos 会将名称作为服务名称 cloud: nacos: server-addr: 192.168.43.66:8848 # nacos 服务器地址 discovery: username: nacos password: nacos namespace: public # springboot默认的日志级别是info ,feign的dubug日志级别就不会输入 logging: level: com.order.service: debug # feign日志局部配置 feign: client: config: product-service: #对应微服务 loggerLevel: FULL # 指定Feign原生注解契约配置 # 注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原 生的注解 # contract: feign.Contract.Default # 连接超时时间,默认2s connectTimeout: 5000 # 请求处理超时时间,默认5s readTimeout: 10000 requestInterceptors[0]: com.order.interceptor.FeignAuthInterceptor ribbon: eager-load: enabled: true clients: product-service,stock-service