• Spring Cloud Consul


    Consul简介

    Consul 是一个分布式高可用的系统,它包含多个组件,但作为一个整体在微服务架构中提供服务发现和服务配置的工具。Spring Cloud Consul 项目是针对Consul的服务治理实现,是Eureka的替代方案,有比Consul跟全的功能:

    1. 服务发现
    2. 健康检查
    3. key/value 存储
    4. 多数据中心

    Consul 角色

    client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。

    server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯。

    在这里插入图片描述

    1、当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port

    2、Consul 接收到 Producer 的注册后,每隔10s(默认)会向 Producer 发送一个健康检查的请求,检验Producer是否健康

    3、当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address

    4、该临时表每隔10s会更新,只包含有通过了健康检查的 Producer

    Spring Cloud Consul 项目是针对 Consul 的服务治理实现。Consul 是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。

    Consul与Eureka的区别
    在这里插入图片描述

    Spring Cloud 支持很多服务发现的软件,Eureka 只是其中之一,下面是 Spring Cloud 支持的服务发现软件以及特性对比:

    在这里插入图片描述

    Consul下载与安装

    Consul下载官网

    在这里插入图片描述
    在这里插入图片描述
    下载完成后解压到对应目录,目录下只有一个consul.exe的启动程序。

    也可以通过doc命令启动,并配置一些参数:

    //开发模式下监听任意地址的注册
    consul agent -dev -client=0.0.0.0
    
    • 1
    • 2

    Consul的后台管理界面的地址是:http://ip:8500

    在这里插入图片描述
    在这里插入图片描述
    只能以开发者模式开启才能使用postman工具即可模拟注册与发现。

    consul服务注册的地址是http://ip:8500/v1/catalog/register,请求方式是``put```。

    consul服务发现的地址是http://ip:8500/v1/catalog/services,请求方式是get

    通过postman工具可以模拟服务的注册与发现过程。实际运用是,注册与发现地址隐藏了。

    服务注册与发现

    spring-boot-starter-actuator健康检查依赖于此包。

    spring-cloud-starter-consul-discovery Spring Cloud Consul 的支持。

    Consul还支持kv存储:

    在这里插入图片描述

    如何在consul上注册服务?

    1. 导入相关依赖
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-consul-discoveryartifactId>
        <version>2.2.8.RELEASEversion>
    dependency>
    
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
        <version>2.6.6version>
    dependency>
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 配置注册中心
    # 服务注册到注册中心
    
    # 服务名称
    spring.application.name=bill-service
    
    # 配置服务端口
    server.port=8081
    
    # consul的相关配置
    
    # consul所在的服务器的ip地址
    spring.cloud.consul.host=127.0.0.1
    
    # consul所在的服务器的端口
    
    spring.cloud.consul.port=8500
    
    # consul服务器实例相关配置
    
    # 是否将自己注册
    spring.cloud.consul.discovery.register=true
    
    # 实例id
    spring.cloud.consul.discovery.instance-id=${spring.application.name}-${server.port}
    
    # 实例名称
    spring.cloud.consul.discovery.service-name=${spring.application.name}
    
    # 实例端口
    spring.cloud.consul.discovery.port=${server.port}
    
    # 是否指定ip注册
    spring.cloud.consul.discovery.prefer-ip-address=true
    
    # 当前服务的ip地址
    spring.cloud.consul.discovery.ip-address=127.0.0.1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    1. 启动Consul服务器
      在这里插入图片描述
    2. 启动服务

    在这里插入图片描述

    启动服务注意别忘了在启动类上加@EnableDiscoveryClient注解。启动时还遇到了一个小错误Failed to introspect Class org.springframework.cloud.context.properties.ConfigurationPropertiesBean
    5. 查看服务

    在这里插入图片描述
    服务已成功注册到注册中心。

    相关配置详解

    # 直接指定服务的 consul service id(即 instance id).
    # 默认情况下为 spring.application.name + server.port, 如果在多个服务器上同一个服务, 因为应用名和端口都一致, 会导致service id 会重复, 所以一般情况都需要引入一个随机数避免重复 . 
    spring.cloud.consul.discovery.instance-id=${spring.application.name}-${random.value}
    
    # 指定服务的 consul service name 
    spring.cloud.consul.discovery.service_name=some_name
    
    # consul 服务器主机名 
    spring.cloud.consul.discovery.hostname=your_host
    
    # consul 服务器端口
    spring.cloud.consul.discovery.port=8500
    
    # 维护 tags
    $ 下面示例的 tag map 是:  foo->bar 和 baz->baz
    spring.cloud.consul.discovery.tags:foo=bar, baz
    
    # 是否启用服务发现 
    spring.cloud.consul.discovery.enabled=true 
    
    # 使用 consul 服务器 IP, 而不是 hostname, 需要搭配 prefer-ip-address 属性
    spring.cloud.consul.discovery.ip-address=127.0.0.1
    
    # 在注册时使用 consul IP, 而不是 hostname
    spring.cloud.consul.discovery.prefer-ip-address=false
    
    #设定 consul acl token 值
    spring.cloud.consul.discovery.acl-token=4efb1523-76a3-f476-e6d8-452220593089
    
    # 健康检查的频率, 默认 10 秒
    spring.cloud.consul.discovery.health-check-interval=10s
    
    # actuator 健康检查的 url 路径
    # 默认为 为${management.endpoints.web.base-path} +/health
    spring.cloud.consul.discovery.health-check-path=
     
    # 自定义健康检查的 url(适合于不适用 actuator 的场景)
    spring.cloud.consul.discovery.health-check-url=
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    总结

    **首先pom文件加载必须的依赖,一个使发现并连接Consul的依赖,一个健康信息检查的依赖;然后在配置注册中心,其中最重要的是consul服务器的ip和服务ip,主类启动时@EnableDiscoveryClient的自动配置会根据导入的第一个依赖,完成配置,并根据conusl配置的服务器ip发现consul服务器并将服务注册到服务器,因此必须要先启动下载的consul服务器,注册的细节隐藏了。

    如何从consul上获取服务列表?

    基于Eureka的案例,从服务器获取服务都需要负载均衡的优先分配,同理consul作为注册中心时也需要。消费端获取服务只能从consul上,conusl是否集成了Ribbon呢?答案是肯定的毕竟咱spring 这么优秀!!!

    既然集成了,那么只需要修改导入依赖和修改配置就可以使用!

    导入依赖:

            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-consul-discoveryartifactId>
                <version>3.0.3version>
            dependency>
    
    		<dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
                
            dependency>
    		
    		
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    配置文件:

    # consul的相关配置
    
    # consul所在的服务器的ip地址
    spring.cloud.consul.host=127.0.0.1
    
    # consul所在的服务器的端口
    
    spring.cloud.consul.port=8500
    
    # consul服务器实例相关配置
    
    # 是否将自己注册
    spring.cloud.consul.discovery.register=true
    
    # 实例id
    spring.cloud.consul.discovery.instance-id=${spring.application.name}-${server.port}
    
    # 实例名称
    spring.cloud.consul.discovery.service-name=${spring.application.name}
    
    # 实例端口
    spring.cloud.consul.discovery.port=${server.port}
    
    # 是否指定ip注册
    spring.cloud.consul.discovery.prefer-ip-address=true
    
    # 当前服务的ip地址
    spring.cloud.consul.discovery.ip-address=127.0.0.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    启动类添加注解和使用Ribbon一样都是@EnableDiscoveryClient@LoadBalanced

    @SpringBootApplication
    //@EnableEurekaClient
    @EnableDiscoveryClient
    public class TestModuleApplication {
    
        //java代码访问url获取返回值的对象
        @LoadBalanced  //spring cloud提供连接Ribbon的注解
        @Bean
        public RestTemplate getRestTemplate(){ return new RestTemplate(); }
    
        public static void main(String[] args) {
            SpringApplication.run(TestModuleApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    服务调用成功:
    在这里插入图片描述
    在这里插入图片描述
    Consul注册中心也搭建完成了~。

  • 相关阅读:
    数据结构(高阶)—— 二叉搜索树
    第四章 文件管理 六、文件的基本操作
    【Vue渲染】 条件渲染 | v-if | v-show | 列表渲染 | v-for
    Vulnhub | DC: 9 |【实战】
    双胶合透镜初始设计
    思科设备配置策略路由
    〖Python网络爬虫实战㉟〗- 极验验证码的识别
    异地局域网对接:异地组网原理与实操
    基于nodejs+vue驾校预约管理系统
    GRPC 和 http
  • 原文地址:https://blog.csdn.net/xwh3165037789/article/details/126038490