05. OpenFeign 服务调用

61 阅读3分钟

Spring Cloud 微服务系列文章,点击上方合集↑

1. 简介

微服务架构中使用OpenFeign进行服务调用,OpenFeign提供了一种简洁的方式来定义和处理服务间的调用。

OpenFeign作为一个声明式的、模块化的HTTP客户端,通过接口的定义和注解的使用,简化了微服务之间的通信调用。

2. 启动Nacos

通过Nacos注册中心进行服务的注册与发现,先启动Nacos。

Linux/Unix/Mac 运行

sh startup.sh -m standalone

Windows 运行

startup.cmd -m standalone

3. 服务提供者 provider-service

创建provider-service模块,用于提供服务。

3.1 pom.xml

  • 添加spring-boot-starter-web依赖。
  • 添加spring-cloud-starter-alibaba-nacos-discovery服务注册和发现相关依赖。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3.2 application.properties

nacos的用户名、密码和地址等相关配置。

# 应用名称
spring.application.name=provider-service
server.port=8001
# nacos
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=http://localhost:8848
# 数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3.3 ProviderController

一个简单的get请求接口,传入参数name

@RestController
@RequestMapping("provider")
public class ProviderController {
    @GetMapping("test")
    public String test(@RequestParam String name) {
        System.out.println(name);
        return "hello " + name;
    }
}

4. 服务消费者 consumer-service

创建consumer-service模块,用于消费服务。

consumer-service服务调用provider-service服务。

4.1 pom.xml

  • 添加spring-boot-starter-web依赖。
  • 添加spring-cloud-starter-alibaba-nacos-discovery服务注册和发现相关依赖。
  • 添加spring-cloud-starter-openfeign服务调用相关依赖。
  • 添加spring-cloud-loadbalancer负载均衡器相关依赖。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

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

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

4.2 application.properties

nacos的用户名、密码和地址等相关配置。

# 应用名称
spring.application.name=consumer-service
server.port=8011
# nacos
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=http://localhost:8848
# 数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

4.3 ProviderService

这里通过 OpenFeign 来调用服务。

创建ProviderService接口,接口上的 @FeignClient(name = "provider-service") 来指向provider-service服务,

其它类调用ProviderService#test方法相当于直接调用provider-service服务的 /provider/test接口。

@FeignClient(name = "provider-service")
public interface ProviderService {

    @GetMapping("/provider/test")
    String test(@RequestParam String name);
}

4.4 ConsumerController

这里注入providerService实例,调用test方法

@RestController
@RequestMapping("consumer")
public class ConsumerController {
    @Resource
    private ProviderService providerService;

    @GetMapping("test")
    public String test(@RequestParam String name) {
        System.out.println(name);
        return providerService.test(name);
    }
}

4.5 @EnableFeignClients()

在启动类上加上 EnableFeignClients() 注解。

@EnableFeignClients()
@SpringBootApplication
public class ConsumerServiceApplication {

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

}

5. ProviderService 运行多个实例

先运行一个实例,然后修改端口号,再运行一个实例。

在nacos后台可以看到有两个provider-service服务和一个consumer-service服务。

6. 测试接口

访问地址: http://localhost:8011/consumer/test?name=zhangsan,浏览器显示hello zhangsan,并且两个provider-service服务轮流打印zhangsan

接口调用consumer-service服务,consumer-service服务会轮询调用provider-service服务。

7. 总结

这里创建了provider-serviceconsumer-service两个模块,也就是服务提供者和服务消费者两个服务,每个服务都可以运行多个实例,实例运行后都会向nacos中心注册,服务消费者consumer-service调用服务提供者provider-service的服务。

整体架构图如下:


Spring Cloud 微服务系列 完整的代码在仓库的sourcecode/spring-cloud-demo目录下。

gitee(推荐):gitee.com/cunzaizhe/x…

github:github.com/tigerleeli/…

关注微信公众号:“小虎哥的技术博客”,让我们一起成为更优秀的程序员❤️!