整合 Spring Cloud OpenFeign

417 阅读1分钟

启动Consul

可以使用本地的方式或者Docker的方式启动

本地启动

consul agent -dev

Server

引入依赖

pom文件内容如下

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.4</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</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>

配置文件

server.port=8081
spring.application.name=app-server

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=feign-server

启动类添加注解

@EnableDiscoveryClient //开启服务发现
@SpringBootApplication
public class FeignServerApplication {

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

}

添加Controller

添加一个简单的接口

@RestController
@RequestMapping("server")
public class ServerController {

    @GetMapping("/info/{str}")
    public String getInfo(@PathVariable String str) {
        if (str.equals("name")) {
            return "feign-server";
        } else {
            return "other";
        }
    }

}

然后就可以启动server了

启动Client

引入依赖

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>2021.0.4</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</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>

配置文件

server.port=8080
spring.application.name=app-client

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

# client不需要进行服务注解
spring.cloud.consul.discovery.register=false

开启 Feign 注解

application启动类上添加@EnableFeignClients注解,让spring在启动的时候扫描所有的Feign Client 类。

@EnableFeignClients
@SpringBootApplication
public class FeignClientApplication {

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

}

声明Feign Client

主要做两件事

  1. 在接口上声明@FeignClient注解,备注目标服务Name
  2. 定义目标服务的接口路径,以及方法的参数
@FeignClient(name = "feign-server")
public interface MyFeignClient {

    @GetMapping("/server/info/{str}")
    String getInfo(@PathVariable String str);
}

声明访问

我们在Controller中直接调用Feign访问Server

@RestController
@RequestMapping("/client")
public class MyController {

    private final MyFeignClient feignClient;

    public MyController(MyFeignClient feignClient) {
        this.feignClient = feignClient;
    }

    @GetMapping("/serverInfo")
    public String getServerInfo() {
        return feignClient.getInfo("name");
    }

}

接下来启动client , 访问该接口,可以看到返回了"feign-server",对应的刚刚在server controller中声明的值。