SpringCloud OpenFeign Demo

Posted 诺浅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud OpenFeign Demo相关的知识,希望对你有一定的参考价值。

项目结构如下


其中API中主要放置了需要暴露的接口,service则通过RequestMapping的方式提供了一些Controller。在client中,通过feign的方式来调用这些controller。

主POM

<?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 http://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>2.3.5.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.bxoon</groupId>
    <artifactId>demo-rpc</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>demo-rpc-api</module>
        <module>demo-rpc-service</module>
        <module>demo-rpc-client</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
        <fastjson.version>1.2.75</fastjson.version>
    </properties>

    <dependencies>
        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- json -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>$fastjson.version</version>
        </dependency>
    </dependencies>

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

</project>

api 代码

pom

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>demo-rpc</artifactId>
        <groupId>com.bxoon</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-rpc-api</artifactId>
    <packaging>jar</packaging>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

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

</project>

一个接口

@FeignClient(value = "demo-rpc-service")
@Component
public interface SayHello 
    @GetMapping(value = "/sayHello")
    String sayHello();

service 代码

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>demo-rpc</artifactId>
        <groupId>com.bxoon</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-rpc-service</artifactId>

    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.bxoon</groupId>
            <artifactId>demo-rpc-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

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

application.yml

server:
  port: 12080
eureka:
  client:
    serviceUrl:
      defaultZone: http://$EUREKA_HOST:192.168.7.135:$EUREKA_PORT:8761/eureka/
spring:
  application:
    name: demo-rpc-service

Controller

@RestController
public class SayHelloController 
    @GetMapping(value = "/sayHello")
    public String sayHello() 
        return "hello";
    

Client代码

pom

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>demo-rpc</artifactId>
        <groupId>com.bxoon</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-rpc-client</artifactId>

    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.bxoon</groupId>
            <artifactId>demo-rpc-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
</project>

application.yml

server:
  port: 11080
eureka:
  client:
    serviceUrl:
      defaultZone: http://$EUREKA_HOST:192.168.7.135:$EUREKA_PORT:8761/eureka/
spring:
  application:
    name: demo-rpc-client

启动类需要加@EnableFeignClients注解

@EnableFeignClients(basePackages = "com.bxoon")
@SpringBootApplication
public class ClientApplication 
    public static void main(String[] args) 
        SpringApplication.run(ClientApplication.class, args);
    

Controller

@RestController
@RequiredArgsConstructor
public class SayHelloController 

    private final SayHello sayHello;

    @RequestMapping("sayHello")
    String testSayHello()
        return sayHello.sayHello();
    

测试

访问如下地址

localhost:11080/sayHello

页面输出hello说明成功

其他

项目省略了eureka的部署过程,这个过程请自行百度。

以上是关于SpringCloud OpenFeign Demo的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud Hoxton——OpenFeign服务接口调用

SpringCloud + OpenFeign:无法使用@RequestAttribute 调用其他应用程序

SpringCloud Hoxton——OpenFeign服务接口调用

SpringCloud系列——openfeign远程服务调用实战

花一个周末,掌握 SpringCloud OpenFeign 核心原理

微服务架构整理-(十一SpringCloud实战之OpenFeign)