Spring Cloud Consul 实战

Consul 文档地址

Spring Cloud Consul 文档地址

介绍

来自google翻译: HashiCorp Consul 是一种服务网络解决方案,使团队能够管理服务之间以及跨本地和多云环境和运行时的安全网络连接。 Consul 提供服务发现、服务网格、流量管理和网络基础设施设备的自动更新。您可以在单个 Consul 部署中单独或一起使用这些功能。

主要作用

  • 服务发现
  • 用于支持负载均衡
  • 分布式的配置中心
  • 分布式的控制总线

安装运行

官方安装教程 MAC 示例:

shell 复制代码
# 下载
brew tap hashicorp/tap 
brew install hashicorp/tap/consul
# 启动
consul agent -dev

访问地址: http://localhost:8500

服务注册与发现

  1. 添加依赖
xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
  1. 添加配置
yaml 复制代码
spring:
  application:
    name: order-svc
    ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}
      config:
        profile-separator: '-' # default value is ",",we update '-'
        format: YAML
  1. 启动类添加注解
java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
public class OrderSvc {
    public static void main(String[] args) {
        SpringApplication.run(OrderSvc.class, args);
    }
}

这里的注解默认不是必须的, 但是如果需要修改他的自动注册行为, 就需要在注解中修改autoRegister为false.

  1. 配置restTemplate
java 复制代码
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

这里需要添加注解: @LoadBalanced 否则在通过restTemplate+服务名访问其他服务时, 系统不会自动映射服务名为对应服务的ip+端口.

  1. 测试
java 复制代码
    @GetMapping("/list")
    public String getOrders() {
        // 请求商品列表
        // 1. 通过RestTemplate调用goods-svc服务的商品列表接口
//        String resp = restTemplate.getForObject("http://localhost:9002/goods/list", String.class);
        String resp = restTemplate.getForObject("http://goods-svc/goods/list", String.class);
        log.info(resp);
        return resp;
    }

经过测试可以发现利用consul, 可以实现通过以服务名的方式来访问其他服务. 其原理就是映射服务名为具体服务的ip+端口的方式来发送http请求, 利用它还可以实现更高阶的功能, 例如负载均衡等.

服务配置与刷新

  1. 添加依赖
xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<!-- 如果我们选择将一些启动相关的配置信息放置在bootstrap文件中, 则需要改依赖, 相应的是, 如果添加了该依赖, 就需要把部分配置文件放在bootstrap文件中, 否则启动会报错 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
  1. 添加配置 添加了bootstrap依赖的配置需要将相关配置放在bootstrap.yml文件中
yaml 复制代码
spring:
  application:
    name: order-svc
    ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}
      config:
        profile-separator: '-' # default value is ",",we update '-'
        format: YAML
        watch:
          wait-time: 3

未添加依赖的配置需要放到application.yml中

yaml 复制代码
spring:
  config:
    import: 'optional:consul:localhost:8500'
  application:
    name: order-svc
    ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}
      config:
        profile-separator: '-' # default value is ",",we update '-'
        format: YAML
        watch:
          wait-time: 3

两者的效果是一致的

  1. 测试
java 复制代码
@GetMapping("/config")
public ResultData<String> getConfigFromConsul(@Value("${example.name}") String exampleName) {
    return ResultData.success(exampleName);
}

一开始我尝试把测试值放在类中, 发现配置的刷新不生效. 但是从日志可以看到服务确实是感知到了配置的变化, 所以最后修改为在方法调用的时候去拿example.name这个值, 才能体现配置动态刷新的效果.

  1. 配置中心配置的持久化

git2consul with Config

从官方文档中可以看到, consul支持从gti 仓库中去读取配置, 具体可以参考spring cloud consul 文档

总结

HashiCorp Consul 是一种服务网络解决方案,主要作用包括服务发现、负载均衡、分布式配置中心和分布式控制总线。总的来说,Consul 提供了一套完整的解决方案,使得服务之间的通信和配置管理更加简单和高效。

参考文档

Consul 文档地址

Spring Cloud Consul 文档地址

尚硅谷周阳 Spring Cloud

相关推荐
fanly113 小时前
surging 发布命令行工具
微服务·surging
stark张宇7 天前
微服务架构必备:Gin + gRPC + Consul + Nacos + GORM 打造用户服务
微服务·gin·grpc
阿里云云原生11 天前
MSE Nacos Prompt 管理:让 AI Agent 的核心配置真正可治理
微服务·云原生
阿里云云原生11 天前
阿里云微服务引擎 MSE 及 API 网关 2026 年 1 月产品动态
微服务
追风筝的人er11 天前
企业管理系统如何实现自定义首页与千人千面?RuoYi Office 给出了完整方案
vue.js·spring boot·spring cloud
麦聪聊数据11 天前
统一 Web SQL 平台如何收编企业内部的“野生数据看板”?
数据库·sql·低代码·微服务·架构
云司科技codebuddy11 天前
技术支持过硬Trae核心代理
大数据·运维·python·微服务
递归尽头是星辰11 天前
微服务事务分级治理:从 Seata 全模式到 TDSQL 实战
微服务·云原生·架构·分布式事务·事务分级治理
没有bug.的程序员11 天前
订单系统重构史诗:从单体巨兽到微服务矩阵的演进、数据一致性内核与分布式事务
java·微服务·矩阵·重构·分布式事务·数据一致性·订单系统
江西理工大学小杨12 天前
高性能 C++ 社交平台4:基于 Boost.Beast 的 WebSocket 网关实现
c++·websocket·微服务