微服务-微服务调用
# 服务调用简述
Feign 是 Netflix 开发的声明式、模板化的 HTTP 客户端,其灵感来自 Retrofit、JAXRS-2.0 以及 WebSocket。Feign 可帮助我们更加便捷、优雅地调用 HTTP API。 Feign 支持多种注解,例如 Feign 自带的注解或者 JAX-RS 注解等。
Feign 可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
Spring Cloud openfeign 对 Feign 进行了增强,使其支持 Spring MVC 注解,另外还整合了 Ribbon 和 Nacos,从而使得 Feign 的使用更加方便
# 整合 OpenFeign
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2
3
4
定义接口(不需要提供实现类)
@FeignClient(value="product-service",path="/product")
public interface ProductServiceFeign {
@GetMapping(value = "/hello")
public String product();
}
2
3
4
5
6
编写 Controller
@RestController
@RequestMapping(value = "/api/user")
public class UserController {
@Autowired
private ProductServiceFeign productService;
@GetMapping(value = "/product")
public String place(){
return "接收到的响应的结果是:"+productService.product();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
启动类上启用
@SpringBootApplication
@EnableDiscoveryClient
//负载均衡策略
@LoadBalancerClients(value = {
@LoadBalancerClient(configuration = {CustomLoadBalancerConfiguration.class})
})
@EnableFeignClients
public class UserApplication{
public static void main( String[] args ){
SpringApplication.run(UserApplication.class, args);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
# Feign 自定义配置
Feign 提供了很多的扩展机制,让用户可以更加灵活的使用
# 日志配置
有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要配置 Feign 的日志了,以此让 Feign 把请求信息输出来。
OpenFeign 日志等级有 4 种,分别是
NONE:性能最佳,适用于生产。不记录任何日志(默认值)。
BASIC:适用于生产环境追踪问题。仅记录请求方法、URL、响应状态代码以及执行时间。
HEADERS:记录 BASIC 级别的基础上,记录请求和响应的 header。
FULL:比较适用于开发及测试环境定位问题。记录请求和响应的 header、body 和元数据。
JavaConfig 配置(需要注意的是这样所有的服务都会开启)
@Configuration
public class FeignConfig {
@Bean
public Logger.Level xxxx(){
System.out.println("0000000000000");
return Logger.Level.BASIC;
}
}
2
3
4
5
6
7
8
9
10
11
12
让某一个微服务生效的话,可以进行如下配置
@FeignClient(value="product-service",path="/product",configuration = {FeignConfig.class})
public interface ProductServiceFeign {
@GetMapping(value = "/hello")
public String product();
}
2
3
4
5
6
7
开启 SpringBoot 指定目录下的日志
logging.level.com.example.service=debug
# 超时时间配置
通过 Options 可以配置连接超时时间和读取超时时间,Options 的第一个参数是连接的超时时间(ms),默认值是 2s;第二个是请求处理的超时时间(ms),默认值是 5s。
@Configuration
public class FeignConfig {
@Bean
public Request.Options options() {
return new Request.Options(5000, 10000);
}
}
2
3
4
5
6
7
8
# 契约配置
Spring Cloud 在 Feign 的基础上做了扩展,使用 Spring MVC 的注解来完成 Feign 的功能。原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式来定义客户端也是可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的是 SpringMvcContract。
Spring Cloud 1 早期版本就是用的原生 Fegin. 随着 netflix 的停更替换成了 Open feign
注意:不要使用全局的形式进行配置
public class FeignDefaultConfig {
@Bean
public Contract feignContract(){
return new Contract.Default();
}
}
2
3
4
5
6
7
8
对应服务的配置
@FeignClient(value="service-order",path="/api",configuration = {FeignDefaultConfig.class})
public interface OrderServiceFeign {
@RequestLine(value = "GET /hello")
public String hello();
}
2
3
4
5
6
7
单独对某个服务开启是可以编写到配置文件中的
feign.client.config.service-order.contract=feign.Contract.Default