Spring Cloud OpenFeign 入门示例

前面章节已经搭建好了 Spring Cloud OpenFeign 学习的环境,一个 Eureka 服务和一个 service-demo 服务,下面将通过一个简单示例,快速上手 Spring Cloud OpenFeign。

项目结构如下图:

image.png

包说明:

  • entity  存放实体,仅有一个 User 实体

  • dto  数据传输对象,其中 CommonReturn 定义了接口通用传输格式

  • feign  存放所有的 Feign 客户端类

  • controller  定义三个业务 Controller,分别用于简单 POST、GET 服务,用户信息管理 Controller

添加 Maven 依赖

pom.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.9</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hxstrive</groupId>
    <artifactId>openfeign-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>openfeign-demo</name>
    <description>openfeign-demo</description>

    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2023.0.3</spring-cloud.version>
        <base.path>${project.basedir}</base.path>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- feign 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!-- 缓存 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>3.1.8</version>
        </dependency>

        <!-- 熔断依赖 -->
        <!--<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>-->
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <finalName>demo_netflix_feign</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml 配置

application.yml 配置内容如下:

server:
  port: 8080

spring:
  application:
    name: open_feign_application

# 服务地址
eureka:
  client:
    enabled: true
    service-url:
      # 注册中心路径,表示我们向这个注册中心注册服务,如果向多个注册中心注册,用“,”进行分隔
      defaultZone: http://localhost:8761/eureka
  instance:
    hostname: localhost
    # 心跳间隔5s,默认30s。每一个服务配置后,心跳间隔和心跳超时时间会被保存在server端,
    # 不同服务的心跳频率可能不同,server端会根据保存的配置来分别探活
    lease-renewal-interval-in-seconds: 5
    # 心跳超时时间10s,默认90s。从client端最后一次发出心跳后,
    # 达到这个时间没有再次发出心跳,表示服务不可用,将它的实例从注册中心移除
    lease-expiration-duration-in-seconds: 10

其他辅助类

CommonReturn.java

package com.hxstrive.demo_springcloud_openfeign.dto;

import lombok.Data;

/**
 * 通用返回对象
 * @author hxstrive.com
 */
@Data
public class CommonReturn<T> {
    private int code;
    private String message;
    private T data;
    private String appName;
    private String port;

    public static <T> CommonReturn<T> success(T data) {
        CommonReturn<T> commonReturn = new CommonReturn<>();
        commonReturn.setCode(1);
        commonReturn.setData(data);
        return commonReturn;
    }

    public static <T> CommonReturn<T> fail(String message) {
        CommonReturn<T> commonReturn = new CommonReturn<>();
        commonReturn.setCode(0);
        commonReturn.setMessage(message);
        return commonReturn;
    }

    public CommonReturn<T> ext(String appName, String port) {
        this.setAppName(appName);
        this.setPort(port);
        return this;
    }

}

User.java

package com.hxstrive.demo_springcloud_openfeign.entity;

import lombok.Builder;
import lombok.Data;
import lombok.ToString;

import java.util.Date;

/**
 * 用户实体
 * @author hxstrive.com
 */
@Data
@Builder
@ToString
public class User {
    private Long id;
    private String name;
    private Integer age;
}

定义 Feign 客户端

下面代码定义了一个使用 OpenFeign 进行服务调用的接口 SimpleFeign。通过这个接口,能够方便地向名为 SERVICE-DEMO 的服务发起特定的 HTTP 请求来获取数据或执行操作。代码如下:

package com.hxstrive.demo_springcloud_openfeign.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * 用户 Feign
 * @author hxstrive.com
 */
@FeignClient("SERVICE-DEMO")
public interface SimpleFeign {

    @GetMapping("/simple/hello")
    String hello();

}

注意:

  • SERVICE-DEMO  是一个服务名,可以通过 Eureka 管理页面获取,不区分大小写。

  • @FeignClient("SERVICE-DEMO")  用于标识该接口是一个 OpenFeign 客户端接口,并且指定了要调用的目标服务名称为 SERVICE-DEMO。OpenFeign 就能够根据配置(如服务发现配置,常见的有基于 Eureka 等服务发现组件的配置)找到对应的服务实例所在的位置,以便后续发起准确的服务调用。

  • @GetMapping("/simple/hello")  表示该方法将处理一个 HTTP GET 请求,并且请求的路径为 /simple/hello。在 SimpleFeign 接口中,它明确了当通过这个 OpenFeign 客户端调用目标服务时,要发送的具体请求路径。

控制器 Controller

通过 Spring 的依赖注入自动将 SimpleFeign 接口注入到当前控制器,然后通过调用 SimpleFeign 接口的 hello() 方法发起远程 HTTP 调用,代码如下:

package com.hxstrive.demo_springcloud_openfeign.controller;

import com.hxstrive.demo_springcloud_openfeign.feign.SimpleFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 控制器
 * @author hxstrive.com
 */
@RestController
public class FeignController {

    @Autowired
    private SimpleFeign simpleFeign;

    @GetMapping("/hello")
    public Object hello() {
        return simpleFeign.hello();
    }

}

启动类

该类也是一个简单的 Spring Boot 启动类,唯一不同的是在该类上添加了 @EnableFeignClients 注解。@EnableFeignClients 是 Spring Cloud 提供的一个注解,用于开启 Feign 客户端功能。当在 Spring Boot 应用的主配置类(通常是带有 @SpringBootApplication 注解的类)上添加这个注解后,Spring Cloud 会自动扫描并注册带有@FeignClient注解的接口,将它们配置为 Feign 客户端,从而能够方便地进行远程服务调用。

代码如下:

package com.hxstrive.demo_springcloud_openfeign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 启动类
 * @author hxstrive.com
 */
@SpringBootApplication
// 启动 Feign 客户端
@EnableFeignClients //(defaultConfiguration = FeignConfig.class)
public class OpenfeignDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(OpenfeignDemoApplication.class, args);
    }

}

运行效果

完成上述开发后,启动 Demo 程序,启动后的状态如下图:

image.png

上图中,目前我们启动了三个应用程序,分别是 Eureka 服务端、Service Demo 服务和示例 Demo。

此时,访问 http://localhost:8761 地址,查看 Eureka 管理页面,如下图:

image.png

这是,Eureka 上面注册了两个服务,分别为 OPEN_FEIGN_APPLICATION 和 SERVICE-DEMO。

最后,使用浏览器访问 http://localhost:8080/hello  地址,效果如下图:

d179e4e7889e2b2961151a29feaf3391_1730966598763-ffa91499-6d17-4624-8b29-fdb72b4280f6.png

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号