Spring Cloud OpenFegin

RestTemplate可以实现REST API的远程调用,它的请求URL使用字符串拼接的方式,在应对URL中存在多个参数的情况时,这种方式会变得非常低效并且难以维护。

Spring Cloud OpenFegin简介

Spring Cloud OpenFegin是声明式的服务调用工具,它整合了Ribbon和Hystrix,拥有负载均衡和服务容错功能。

Fegin是声明式的服务调用工具,我们只需要创建一个接口并用注解的方式来配置它,就可以实现对某个服务接口的调用,简化了直接使用RestTemplate来调用服务接口的开发量。Fegin具备可插拔的注解支持,同时支持Fegin注解、JAX-RS注解及SpringMVC注解。

Fegin和OpenFegin的区别

Fegin

Fegin是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端,Fegin内置Ribbon用来做客户端负载均衡,去调用服务注册中心的服务。

Fegin的使用方式:使用Fegin的注解定义接口,调用这个接口就可以调用服务注册中心的服务。

依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

OpenFegin

OpenFegin是Spring Cloud在Fegin的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFegin的@FeginClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类。实现类中做负载均衡并调用其他服务。

依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

整合OpenFeign实现负载均衡

添加依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

启动类添加@EnableFeignClients注解

image-20220605132039642

添加UserService接口完成对user-service服务的接口绑定

image-20220605132646831

1
2
3
4
5
@FeignClient(value = "user-service")/*实现Feign客户端,value接口调用的服务名称*/
public interface UserService {
@RequestMapping("/user/{id}")
User getUserById(@PathVariable("id") Long id);
}

同理,添加BookService接口完成对于book-service服务的接口绑定

image-20220605132956580

BorrowServiceImp调用UserService实现服务调用

image-20220605132853381

image-20220605133038830

1
2
3
4
5
6
7
@Override
public BorrowDetail getBorrow(Long uid, Long bid) {
List<Borrow> borrows = borrowMapper.getBorrow(uid, bid);
List<User> users = borrows.stream().map(borrow -> userService.getUserById(borrow.getUid())).collect(Collectors.toList());
List<Book> books = borrows.stream().map(borrow -> bookService.getBookById(borrow.getBid())).collect(Collectors.toList());
return new BorrowDetail(users, books);
}

在user-service中的UserController打印日志

image-20220605133900846

验证负载均衡

image-20220605134255080

image-20220605134410516

整合OpenFeign实现服务降级

OpenFegin客户端定义的接口添加一个服务降级处理的实现类即可实现OpenFegin的服务降级

添加服务降级实现类UserFallBackService

image-20220605151559717

1
2
3
4
5
6
7
@Component
public class BookFallBackService implements BookService {
@Override
public Book getBookById(Long id) {
return new Book(-1L, "defaultTitle", "defaultDesc");
}
}

设置UserService接口服务降级处理类

image-20220605165649334

1
2
3
4
5
@FeignClient(value = "book-service", fallback = BookFallBackService.class)
public interface BookService {
@RequestMapping("/book/{id}")
Book getBookById(@PathVariable("id") Long id);
}

配置文件开启Fegin的Hystrix功能

image-20220605165946830

image-20220605170248889

整合OpenFegin实现日志打印

Fegin提供了日志打印功能,通过配置来调整日志级别,从而理解Fegin中HTTP请求的细节

日志级别

  • NONE:默认的,不显示任何日志
  • BASIC:仅记录请求方法、URL、响应状态码及执行时间
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
  • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据

通过配置类开启日志功能

image-20220605171557899

1
2
3
4
5
6
7
@Configuration
public class FeginConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}

配置文件开启日志的Fegin客户端

设置UserService和BookService的日志级别为debug

1
2
3
4
logging:
level:
com.test.service.UserService: debug
com.test.service.BookService: debug

查看日志

调用http://localhost:8301/borrow?uid=1&bid=1进行测试,控制台日志如下

image-20220605172131544