微服务间的通讯组件
RestTemplate
简介
是Spring框架提供的一个强大的用于执行RESTful服务调用的客户端模板类。它封装了HTTP请求的复杂性,使得与RESTful API的交互变得更加简单和直接。开发者不需要关心底层的HTTP连接管理、请求构造、响应解析等细节,只需关注业务逻辑
主要用途
- 发送HTTP请求,支持GET、POST、PUT、DELETE等多种HTTP方法,可以用来发送JSON、XML等各种格式的数据请求。
- 自动序列化和反序列化,它能够自动将Java对象转换为HTTP请求的Payload(请求体),并将HTTP响应的Payload转换回Java对象,极大地简化了JSON或XML数据的处理过程。
- 多种相应内容的处理,可以轻松处理各种响应类型,如字符串、JSON对象、自定义Java对象等。
- 模板化操作,提供了丰富的模板方法来处理HTTP请求和响应,如设置请求头、处理重定向、异常处理等。
示例
创建bean
class RestTemplateConfig { @Bean("restTemplate") public RestTemplate restTemplate1() { return new RestTemplate(); } }
直接使用ip进行访问
@Resource(name = "restTemplate") RestTemplate restTemplate; @GetMapping("/id") public Object getId() { Result object = restTemplate.getForObject("http://localhost:8009/producer/id", Result.class); return object; }
如果采用了注册中心,将ip地址和端口改为注册的服务名称
@Resource(name = "restTemplate") RestTemplate restTemplate; @GetMapping("/id") public Object getId() { Result object = restTemplate.getForObject("http://cloud-producer-service/producer/id", Result.class); return object; }
引入loadbalancer负载均衡
Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器
maven坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
使用:
class RestTemplateConfig {
@Bean("restTemplate")
//直接在RestTemplate上加上注解,默认是轮询策略
@LoadBalanced
public RestTemplate restTemplate1() {
return new RestTemplate();
}
}
Openfeign
简介
OpenFeign是一个轻量级的HTTP客户端开发工具,用于简化HTTP请求的调用和处理。
OpenFeign的设计目标是使API调用更加简单和优雅。它提供了一组注解和接口,通过声明方式定义HTTP请求,然后自动生成实现代码。这样开发人员只需要编写接口定义和相关的注解,就可以实现对远程服务的调用。
OpenFeign支持多种HTTP请求方式,包括GET、POST、PUT、DELETE等。它还支持请求参数的传递、请求头的设置、请求体的序列化等功能。开发人员可以通过注解的方式将这些信息和请求方法关联起来。
除了基本的请求调用,OpenFeign还提供了一些高级功能,如请求重试、请求日志、熔断降级等。这些功能都可以通过配置进行开启和定制。
在Spring Cloud中,OpenFeign被广泛应用于微服务架构中的服务间通信。通过使用OpenFeign,开发人员可以在不依赖于具体实现的情况下,方便地对其他服务进行调用和交互,提高了开发效率和系统的可维护性。
示例
maven坐标
<!-- 负载均衡器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- 和loadbalancer一起引用,采用loadbalancer作为负载均衡组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类加上@EnableFeignClients
创建feignClient接口,会采用动态代理的方式生成实例
// 这是另一个服务的接口 //@GetMapping("/normal") //public String normal() { // return "NORMAL_" + System.currentTimeMillis(); //} @FeignClient(value = "cloud-custom-service") // value值调用服务的名称,默认spring.application.name interface FeignClientInterface { /* * 直接复制需要调用的微服务接口 */ @GetMapping("/normal") public String normal(); }
@Autowired注入feignClient后就可以直接使用
@Autowired FeignClientInterface feignClientInterface; @GetMapping("/normal") public String normal() { return feignClientInterface.normal(); }
超时配置
feign:
client:
config:
default:
#创建连接超时
connectTimeout: 5000
#会话超时
readTimeout: 3000
拦截器
- 创建拦截器类,继承RequestInterceptor。不用加@Component注解
class MyRequestInterceptor implements RequestInterceptor {
public static Logger logger = LoggerFactory.getLogger(MyRequestInterceptor.class);
@Override
public void apply(RequestTemplate requestTemplate) {
String method = requestTemplate.method();
String url = requestTemplate.url();
logger.info("===>MyRequestInterceptor.apply#method[{}]#url[{}]", method, url);
}
}
- 加上拦截器配置
feign:
sentinel:
enabled: true
client:
config:
default:
#创建连接超时
connectTimeout: 2000
#会话超时
readTimeout: 3000
# 添加请求拦截器
requestInterceptors:
- com.cqsiri.MyRequestInterceptor
- 微服务间采用openfeign调用时进入拦截器

熔断和降级
采用circuitbreaker
maven坐标,springcloud 2020之后 feign如果需要进入fallback 需要配置此依赖
<!-- 降级配置 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId> </dependency>
配置文件
在打开此开关之后,默认超时时间为1s,需要配置Customizer配置超时时间
feign: circuitbreaker: enabled: true
@Bean public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() { return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id) /** * 如果配置文件中readTimeout和此处都配置的超时时间,则以小的超时时间为准 */ .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(5)).build()) .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()) .build()); }
创建FallBack类,实现FeignClient接口
@Component class FeignClientFallBack implements FeignClientInterface { public static Logger logger = LoggerFactory.getLogger(FeignClientFallBack.class); @Override public String normal() { return "FeignClientFallBack#normal#" + System.currentTimeMillis(); } }
FeignClient注解上增加fallback配置
@FeignClient(value = "cloud-custom-service", fallback = FeignClientFallBack.class, fallbackFactory = FeignClientFallBackFactory.class)
采用sentinel
maven坐标
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
修改配置
feign: # circuitbreaker: # enabled: true sentinel: enabled: true