Spring Cloud OpenFeign使用教程

简介: Spring Cloud OpenFeign使用教程

文章目录



Spring Cloud OpenFeign Demo


之前项目中需要在Spring Cloud中使用OpenFeign的情况,Spring Cloud的版本是目前最新的Greenwich.SR2版本,对应的Spring boot是2.1.7.RELEASE。


在网上找了很多资料,大多言之不详,并且版本也比较低,不适合我的最新版本Spring Cloud的需求。 所以决定还是自己写个教程。


本教程要解决如下几个问题:


  1. 怎么配置OpenFeignServer
  2. 怎么配置OpenFeignClient
  3. 多个参数传递问题
  4. FeignClient的日志问题
  5. 多个FeignClient使用同一个name的问题


怎么配置OpenFeignServer


我们知道OpenFeign是用在Spring Cloud中的声明式的web service client。


OpenFeignServer就是一个普通的Rest服务,不同的是我们需要将他注册到eureka server上面,方便后面的OpenFeignClient调用。


启动类如下:


@SpringBootApplication
@EnableDiscoveryClient
public class OpenFeignServer {
        public static void main(String[] args) {
            SpringApplication.run(OpenFeignServer.class, args);
    }
}


我们定义了两个Rest服务:


OrderController:


@Slf4j
@RestController
@RequestMapping(path = "/order")
public class OrderController {
    /**
     * PostMapping with @RequestBody
     * @param user
     */
    @PostMapping("doOrder")
    public void doOrder(@RequestBody User user){
        log.info("do order !!!!");
    }
}


UserController:


@RestController
@RequestMapping(path = "/user")
public class UserController {
    /**
     * GetMapping example with @RequestParam
     * @param userId
     * @return userName
     */
    @GetMapping("getUserName")
    public String getUserName(@RequestParam("userId") String userId){
        if("100".equals(userId)) {
            return "张学友";
        }else{
            return "刘德华";
        }
    }
    /**
     * GetMapping example with @RequestParam and @SpringQueryMap
     * @param userId
     * @param user
     * @return userAge
     */
    @GetMapping("getUserAge")
    public String getUserAge(@RequestParam("userId") String userId, @SpringQueryMap User user){
        if("100".equals(userId)) {
            return "20";
        }else{
            return "18";
        }
    }
}


我们将其注册到eureka上面,名字为openfeign-server


spring:
  application:
    name: openfeign-server


怎么配置OpenFeignClient


OpenFeignClient的pom依赖如下:


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>


配置OpenFeignClient只需要使用@FeignClient来注解一个interface即可,如下所示:


@FeignClient(value = "openfeign-server")
@RequestMapping(path = "/user")
public interface UserClient {
    @GetMapping("getUserName")
    public String getUserName(@RequestParam("userId") String userId);
    @GetMapping("getUserAge")
    public String getUserAge(@RequestParam("userId") String userId, @SpringQueryMap User user);
}


其中@FeignClient中的value是要调用的服务的注册名,即OpenFeignServer在eureka的注册名。


FeignClient的 Request路径,方式和参数要和被调用的Rest服务保持一致。


这样我们就可以像下面一样来调用OpenFeignClient了:


@Slf4j
@RestController
public class UserController {
    @Autowired
    private UserClient userClient;
    @GetMapping("getUserName2")
    public void getUserName(){
        log.info(userClient.getUserName("100"));
    }
}


多个参数传递问题


一般我们会使用@GetMapping和@PostMapping两种方式来调用Rest服务。


而接收的参数则会使用@RequestParam和@RequestBody来获取。


首先我们讲一下@RequestBody,@RequestBody只能用在Post请求,并且一个Post请求只能有一个@RequestBody。 @RequestBody的参数可以包括复杂类型。


然后我们讲一下@RequestParam,@RequestParam可以用在Post和Get请求中,但是要注意:@RequestParam 的参数只能是基本类型或者Enum,或者List和Map(List和Map里面也只能是基本类型)。所以@RequestParam可以和@RequestBody一起使用。


如果我们是Get请求,但是又有复合类型怎么办? 比如我们想传递一个User对象。User对象里面只有普通的两个String属性。 这里我们可以使用@SpringQueryMap:


@GetMapping("getUserAge")
    public String getUserAge(@RequestParam("userId") String userId, @SpringQueryMap User user);


注意:@SpringQueryMap后面的参数只能是普通的POJO,不能是复合类型,否则解析不了。如果必须使用复合类型,那么使用@RequestBody吧。


FeignClient的日志问题


OpenFeign的Logger.Level有4种级别:


  • NONE 没有日志
  • BASIC 请求方法,请求URL,返回Code和执行时间
  • HEADERS 请求和返回的头部基本信息
  • FULL 请求和返回的头部,内容,元数据


要想使用这些级别,必须将OpenFeignClient的logger设置成debug级别:


#日志配置
logging:
  level:
    com:
      flydean: debug


同时我们在代码中配置OpenFeign的日志级别:


@Configuration
public class CustFeignLogConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}


这样我们在日志里面就可以看到DEBUG的所有HTTP请求信息。


多个FeignClient使用同一个name的问题


其实这里我们的Server定义了两个Rest服务,User和Order。


上面我们讲到了可以这样定义UserClient:


@FeignClient(value = "openfeign-server")
@RequestMapping(path = "/user")
public interface UserClient {
    ...
}


如果我们同样的这样定义OrderClient:


@FeignClient(value = "openfeign-server")
@RequestMapping(path = "/order")
public interface OrderClient {
    ...
}


运行时候就会报错。 原因是两个FeignClient使用了同一个value!


那怎么解决这个问题呢?


/**
 * 因为@FeignClient的value不能重复,所以需要在这里以自定义的方式来创建
 * @author wayne
 * @version FeignClientController,  2019/9/5 7:07 下午
 */
@Data
@Component
@Import(FeignClientsConfiguration.class)
public class FeignClientController {
    private OrderClient orderClient;
    private UserClient userClient;
    public FeignClientController(Decoder decoder, Encoder encoder, Client client, Contract contract) {
        this.orderClient = Feign.builder().client(client)
                .encoder(encoder)
                .decoder(decoder)
                .contract(contract)
                //默认是Logger.NoOpLogger
                .logger(new Slf4jLogger(OrderClient.class))
                //默认是Logger.Level.NONE
                .logLevel(Logger.Level.FULL)
                .target(OrderClient.class, "http://openfeign-server");
        this.userClient = Feign.builder().client(client)
                .encoder(encoder)
                .decoder(decoder)
                .contract(contract)
                //默认是Logger.NoOpLogger
                .logger(new Slf4jLogger(UserClient.class))
                //默认是Logger.Level.NONE
                .logLevel(Logger.Level.FULL)
                .target(UserClient.class, "http://openfeign-server");
    }
}


方法就是手动创建FeignClient, 上面的例子中,我们手动创建了OrderClient和UserClient两个FeignClient。


注意下面的代码片段,手动创建的FeignClient默认是没有logger和logLevel的。所以上面我们配置好的log信息对手动创建的FeignClient是无效的。 下面展示了如何手动添加:


//默认是Logger.NoOpLogger
                .logger(new Slf4jLogger(OrderClient.class))
                //默认是Logger.Level.NONE
                .logLevel(Logger.Level.FULL)


如何运行


本项目的模块都是以spring boot构建的,直接在编译器中运行Main方法即可启动。


  1. 启动openfeign-registry-server


openfeign-registry-server会启动eureka server,供后面的OpenFeignServer和OpenFeignClient注册。


  1. 启动openfeign-server


  1. 启动openfeign-client


  1. 测试openFeignClient
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1519 3
|
11月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1841 5
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
1136 13
|
SpringCloudAlibaba Java Nacos
尚硅谷SpringCloud教程 笔记
本文介绍了基于Spring Cloud Alibaba构建的cloud-demo工程创建步骤,包括父模块及子模块的配置。父模块采用pom打包方式,定义了Java 8、Spring Boot 2.4.2、Spring Cloud 2020.0.1及Spring Cloud Alibaba 2021.1版本。包含三个主要模块:services(依赖Nacos)、service-order和service-product(均依赖spring-boot-starter-web)。同时提供了discoveryClient的测试代码,展示服务发现功能的实现与验证过程。
814 12
尚硅谷SpringCloud教程 笔记
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
2084 3
|
Java 开发者 微服务
Spring Cloud OpenFeign详解与实践
总结起来说,Spring Cloud OpenFeign提供了一种简单易懂且高效的方式去实现微服务之间通信.它隐藏了许多复杂性,并且允许开发者以声明式方式编写HTTP客户端代码.如果你正在开发基于Spring Cloud 的微服务架构系统,Spring Cloud Open Feign是一个非常好用且强大工具.
923 33
|
SpringCloudAlibaba JavaScript Dubbo
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
本文介绍了 Dubbo-Admin 的安装和使用步骤。Dubbo-Admin 是一个前后端分离的项目,前端基于 Vue,后端基于 Spring Boot。安装前需确保开发环境(Windows 10)已安装 JDK、Maven 和 Node.js,并在 Linux CentOS 7 上部署 Zookeeper 作为注册中心。
4314 1
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。

热门文章

最新文章