分布式微服务 - 3.服务调用 - 2.Openfeign
项目示例:
- 项目示例 - 3.服务调用 - 1.Openfeign
内容提要:
- 介绍
- 服务调用:原生方式、openfeign
- 负载均衡、配置
文档:
参考:
介绍
往往同一个服务的接口会在多处被调用,因此通常都会针对每个服务提供者封装一些类来包装暴露的服务调用。在Openfeign的帮助下,只需要创建一个接口并使用注解方式来配置它,即可完成对服务提供方的接口绑定。
服务调用
原生方式调用
原生方式即不使用Openfeign框架时,进行服务调用,此时主要使用RestTemplate类。
RestTemplate类常用方法有Get请求方法和POST请求方法
- getForObject方法和postForObject方法:返回对象为响应体中的数据转化成的对象,基本上可以理解为Json。
- getForEntity方法和postForEntity方法,返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等。
使用步骤
- 引入依赖:RestTemplate类的使用需要引入该依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 配置类中注入:在配置类中注入bean,可以对所有使用RestTemplate类进行的请求进行统一配置
@Configuration
public class ApplicationContextConfig {
// 在配置类中注入bean使用,可以为所有的http请求统一进行配置
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
- 请求服务:使用RestTemplate类的方法发送请求,请求地址的格式为
http://服务提供者别名/api地址
// 提供服务提供者注册时使用的别名
private static final String URL_PAYMENT_PRE_ALIAS = "http://nacos-provider/nacos/provider/";
// 服务提供者提供的接口
private static final String PAYMENT_API = "test";
@Resource
private RestTemplate restTemplate;
@GetMapping("test/alias")
public String testAlias() {
return restTemplate.getForObject(URL_PAYMENT_PRE_ALIAS+PAYMENT_API, String.class);
}
使用Openfeign调用
使用openfeign框架进行服务调用时,可以为服务提供者创建一个统一的服务调用接口。
使用步骤
- 引入依赖:openfeign需要loadbalancer依赖,而nacos依赖不包含loadbalancer(eureka、zookeeper、consul依赖都包含loadbalancer),因此需要单独引入。
<!--Openfeign服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--Nacos依赖中不包括loadbalancer依赖,而openfeign需要loadbalancer依赖,因此需要单独引入-->
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- 主启动类加@EnableFeignClients注释(扫描所有@FeignClient对应的接口)
- 配置服务调用接口:需要按照服务提供者创建接口类
- 需要@Component注解将接口注入
- @FeignClient注解中,value属性赋值为服务提供者别名,path属性赋值为服务提供者api接口共同的路径前缀
- 接口中方法按照服务提供者api接口对应的方法头赋值即可
@Component
@FeignClient(value = "nacos-provider", path = "/nacos/provider/")
public interface ProviderInter {
@GetMapping("test")
String test();
}
- 使用服务调用接口:使用@Resource注解获取接口类使用即可请求服务提供者
@Resource
private ProviderInter providerInter;
@GetMapping("test")
public String test() {
return providerInter.test();
}
负载均衡
新版openfeign不再集成ribbon来做负载均衡,而是使用loadbalancer来做负载均衡。loadbalancer自带有随机RandomLoadBalancer
和轮询RoundRobinLoadBalancer
两种负载均衡策略的实现,默认使用轮询策略。
配置
使用openfeign进行服务调用时,可以通过代码方式@FeignClient(configuration = 自定义配置类.class)
创建自定义配置类(类不能用@Configuration注解)来配置,也可以在application.yml中对spring.cloud.openfeign.client.config进行配置。
spring:
cloud:
openfeign:
client:
config:
# 可以写成具体的服务别名,表示其中的配置只对指定服务提供者的服务调用起效
# 写成default表示对所有服务提供者的服务调用起效
default:
# 下面可以进行若干配置,具体配置项可以参考类org.springframework.cloud.openfeign.FeignClientProperties的内部类FeignClientConfiguration
# 连接超时时间
connect-timeout: 3000
# 读取超时
read-timeout: 3000
日志增强
Feign提供了日志打印功能,对接口的调用情况进行监控和输出
openfeign的日志级别
- none:默认,不显示任何日志
- basic:仅记录请求方法、URL、响应状态码及执行时间
- headers:比basic多了请求和响应的头信息
- full:比headers多了请求和响应的正文及元数据
logging的日志级别
- trace:最详细的日志级别,用于跟踪程序的每一步操作。
- debug:用于调试和开发阶段,会输出较为详细的日志信息。
- info:用于输出一般的运行时信息。
- warn:用于输出警告信息,表示可能存在潜在的问题。
- error:用于输出错误信息,表示程序遇到了无法处理的问题。
spring:
cloud:
openfeign:
client:
config:
# 可以写成具体的服务别名,表示其中的配置只对指定服务提供者的服务调用起效
# 写成default表示对所有服务提供者的服务调用起效
default:
# 日志级别
logger-level: full
logging:
level:
# 指定包或者类的日志输出级别
learn.demo.inter: debug