1.前置准备
已经搭建起nacos 服务注册中心
有一个订单Order(order-service) 服务,两个库存Stock(stock-service) 服务
目录结构如下:
2.order-server 和 stock-service的依赖和属性配置文件
在最外侧的pom也就是sample-spring-cloud-alibaba-openfeign\pom.xml中导入依赖管理配置
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后在order-service的 pom.xml中加入以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
在stock-service的 pom.xml中加入以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
由于在外侧的pom.xml中已经带入了依赖管理,所以这个位置的版本号可以省略,其中spring-boot-starter,spring-boot-starter-web的版本号由spring-boot-starter-parent提供
spring-cloud-starter-alibaba-nacos-discovery和spring-cloud-starter-openfeign的版本由spring-cloud-alibaba-dependencies提供。
其中order-service 的application.properties内容如下
server.port=8080
#你的服务名称
spring.application.name=order-service
#nacos的配置
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.namespace=public
stock-service 的application.properties内容如下
server.port=8091
#nacos的相关配置
spring.application.name=stock-service
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.namespace=public
spring.cloud.nacos.discovery.ephemeral=false
3.使用feignClient
在stock-service 中,开发测试用的controller 方法
@RestController
@RequestMapping("/stock")
public class StockRestController {
@Value("${server.port}")
private String port;
@GetMapping("/submit")
public String submit() {
return "去庫存成功 : " + port;
}
}
在order-service 中,开发调用stock-service的feignClient
@FeignClient(value = "stock-service", path = "/stock")
public interface StockFeignClient {
@GetMapping("/submit")
String submit();
}
发测试用的controller 方法
@RestController
@RequestMapping("/order")
public class OrderRestController {
@Autowired
private StockFeignClient stockFeignClient;
@GetMapping("/submit")
public String submit() {
String msg = stockFeignClient.submit();
return "下單成功 " + msg;
}
}
此时目录结果如下:
完成后启动order-service(http://127.0.0.1:8080/order/submit) 后,成功从stock-service获取到返回值
4.feignClient日志配置
方式一:全局feignClient修改日志级别
@Configuration
public class FeignConfiguration {
@Bean
public feign.Logger.Level feignLoggerLevel() {
return Logger.Level.*BASIC*;
}
}
方式二:为某个feignClient 指定日志配置
FeignConfiguration的类上不需要带@Configuration注解
public class FeignConfiguration {
@Bean
public feign.Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
}
修改StockFeignClient , 在@FeignClient注解内添加configuration参数指定配置类
@FeignClient(value = "stock-service", path = "/stock", configuration = FeignConfiguration.class)
public interface StockFeignClient {
@GetMapping("/submit")
String submit();
}
方式三:在application.properties文件内修改对应服务的日志配置
feign.client.config.stock-service.logger-level=basic
以上三种方式,都需要在application.properties内加入
logging.level.com.riteny.feign=DEBUG
其中com.riteny.feign是你feignClient所在的路径
最后重启服务后调用接口,可以见到输出最基本的日志,也可以修改成其他,例如FULL去获得详细的日志
5.feignClient超时时间配置
方式一:全局feignClient修改超时时间配置
@Configuration
public class FeignConfiguration {
@Bean
public Request.Options feignOptions() {
return new Request.Options(3000, 3000);
}
}
方式二:为某个feignClient 指定超时时间配置
同样的,FeignConfiguration的类上不需要带@Configuration注解
public class FeignConfiguration {
@Bean
public Request.Options feignOptions() {
return new Request.Options(3000, 3000);
}
}
修改StockFeignClient ,在@FeignClient注解内添加configuration参数指定配置类
@FeignClient(value = "stock-service", path = "/stock", configuration = FeignConfiguration.class)
public interface StockFeignClient {
@GetMapping("/submit")
String submit();
}
方式三:在application.properties文件内修改对应服务的日志配置
feign.client.config.stock-service.connect-timeout=3000
feign.client.config.stock-service.read-timeout=3000
测试可以通过修改stock-service里面的接口,通过Thread.sleep 睡4秒,达到测试的效果
6.feignClient自定义拦截器
开发拦截器CustomInterceptor
public class CustomInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
System.out.println("come into custom interceptor");
}
}
方式一:全局添加feignClient 指定拦截器配置
@Configuration
public class FeignConfiguration {
@Bean
public CustomInterceptor customInterceptor() {
return new CustomInterceptor();
}
}
方式二:为某个feignClient 指定拦截器配置
同样的,FeignConfiguration的类上不需要带@Configuration注解
public class FeignConfiguration {
@Bean
public CustomInterceptor customInterceptor() {
return new CustomInterceptor();
}
}
修改StockFeignClient ,在@FeignClient注解内添加configuration参数指定配置类
@FeignClient(value = "stock-service", path = "/stock", configuration = FeignConfiguration.class)
public interface StockFeignClient {
@GetMapping("/submit")
String submit();
}
方式三:在application.properties文件内为某个feignClient 指定拦截器配置
feign.client.config.stock-service.request-interceptors[0]=com.riteny.feign.interceptor.CustomInterceptor
修改完成后启动项目,可以见到拦截器输出正常
最后例子的项目结构如下: