Consul与SpringBoot微服务实战:从零构建服务注册与调用

在当今分布式系统架构中,服务发现与治理已成为开发者必须掌握的核心技能。Consul作为HashiCorp推出的开源服务网格解决方案,凭借其轻量级、多数据中心支持和健康检查等特性,成为众多企业构建微服务架构的首选工具。本文将带您在Windows环境下,通过SpringBoot和RestTemplate快速搭建一个可运行的微服务调用Demo,涵盖Consul安装配置、服务注册、服务发现等全流程。

1. 环境准备与Consul部署

1.1 Consul安装与启动

首先访问Consul官网下载页面获取最新Windows版本。解压后您将得到一个独立的consul.exe可执行文件,无需复杂安装过程。验证版本信息只需在命令行执行:

consul --version

启动开发模式下的Consul服务(适合本地测试):

consul agent -dev

启动成功后,控制台将显示关键信息:

  • HTTP接口地址:127.0.0.1:8500
  • 数据中心名称:dc1
  • 节点ID与名称

注意:开发模式(-dev)会启用所有功能但数据不会持久化,适合快速验证场景。生产环境请使用server模式部署集群。

访问http://localhost:8500即可进入Consul的Web管理界面,这里可以查看节点状态、服务注册情况等关键信息。

1.2 SpringBoot项目初始化

使用Spring Initializr创建两个Maven项目:

  • test-goods(商品服务)
  • test-user(用户服务)

基础依赖选择:

  • Spring Web
  • Spring Boot Actuator
  • Lombok(可选)

额外添加Consul服务发现依赖:

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

2. 服务注册实战

2.1 商品服务配置

在test-goods服务的application.properties中添加配置:

server.port=8080
spring.application.name=test-goods
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.prefer-ip-address=true

主启动类添加注解启用服务发现:

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

创建测试接口:

@RestController
@RequestMapping("/goods")
public class GoodsController {
    
    @GetMapping("/info")
    public String getGoodsInfo() {
        return "商品服务返回:最新款智能手机";
    }
}

启动服务后,在Consul的Web界面可以看到test-goods服务已成功注册,健康检查状态为passing。

2.2 用户服务配置

test-user服务采用类似配置,注意修改端口避免冲突:

server.port=8081
spring.application.name=test-user
# 其他Consul配置与goods服务相同

3. 服务间调用实现

3.1 RestTemplate配置

在调用方服务(test-user)中配置负载均衡的RestTemplate:

@Configuration
public class RestTemplateConfig {
    
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplateBuilder()
                .setConnectTimeout(Duration.ofSeconds(3))
                .setReadTimeout(Duration.ofSeconds(5))
                .build();
    }
}

提示:@LoadBalanced注解使RestTemplate能够通过服务名进行调用,Consul会自动处理服务发现和负载均衡。

3.2 服务调用示例

在test-user服务中创建调用接口:

@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/order")
    public String createOrder() {
        String goodsInfo = restTemplate.getForObject(
            "http://test-goods/goods/info", 
            String.class
        );
        return "用户服务调用结果:" + goodsInfo;
    }
}

关键点说明:

  • 使用服务名(test-goods)而非具体IP地址
  • 调用路径包含服务名和实际API路径
  • 返回结果将包含商品服务返回的信息

4. 进阶配置与问题排查

4.1 健康检查配置

Consul默认通过Actuator的健康端点进行检查,可自定义检查间隔:

spring.cloud.consul.discovery.health-check-interval=15s
spring.cloud.consul.discovery.health-check-path=/actuator/health

4.2 常见问题解决

服务注册失败检查清单:

  1. 确认Consul服务正常运行(检查8500端口)
  2. 验证application.properties中的Consul地址配置
  3. 检查是否添加了@EnableDiscoveryClient注解
  4. 查看日志中是否有连接异常

调用失败排查步骤:

  • 在Consul UI确认目标服务状态为healthy
  • 直接访问目标服务API验证是否可用
  • 检查RestTemplate是否添加了@LoadBalanced注解

4.3 多实例测试

启动多个test-goods实例(修改server.port),观察Consul中的实例列表和RestTemplate的负载均衡效果:

java -jar test-goods.jar --server.port=8082

在微服务架构实践中,Consul与SpringBoot的集成提供了灵活可靠的服务治理方案。通过本文的示例,您已经掌握了最基本的服务注册与发现模式。实际项目中,还可以结合Consul的KV存储、多数据中心等特性构建更复杂的分布式系统。

更多推荐