拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SpringCloud---Consul

(一).Consul介绍Consul是一个服务注册/服务发现的组件和EurekaNacos类似。Consul时HashiCorp开发的一款开源的组件主要用于服务发现配置管理和分布式系统的健康检查。服务注册/发现服务在启动的时候向Consul注册并在需要时向Consul查询其他服务的地址和状态。健康检查Consul提供了健康检查机制确保只有健康的实例对外提供服务防止服务转发到故障的服务。配置管理Consul提供了一个Key/Value存储系统用于存储配置数据和其他需要共享的信息。服务分段Consul支持服务分段允许创建隔离的环境例如开发测试生产等环境(二).Consul安装1.下载Consul安装 | 领事 | HashiCorp 开发者 --- Install | Consul | HashiCorp Developer通过上面的地址下载相应的安装包2.安装Consul这是我下载完成并配置完“环境变量”之后通过cmd查看的Consul版本然后通过“consul agent -dev”命令就可以启动Consul然后通过Consul by HashiCorp链接就要可以访问到到Consul界面了如果想要在linux系统上安装wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP (?UBUNTU_CODENAME).* /etc/os-release || lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update sudo apt install consul直接将上面的三条命令分别粘贴到ubuntu上即可可以看到已经安装好了通过上面的命令启动consul可以看到也是可以启动成功的(三).服务注册/服务发现Consul提供了服务注册和发现的功能下面的演示还是以订单服务和商品服务的代码为例1.添加依赖!-- 添加Consul依赖 -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-consul-discovery/artifactId /dependency !-- 添加健康检查依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency这里添加健康检查的依赖是因为,Consul支持健康检查,来确保只有健康的服务实例才可以被发现,Consul使用了actuator提供服务的健康检查,所以还需要引入actuator的依赖2.添加配置cloud: consul: host: localhost port: 8500 discovery: service-name: product-service在配置文件中添加相应的信息这里我们使用的是本机的consul当然也可以使用服务器的consul都可以。3.添加注解在启动类上添加EnableDiscoveryClient注解4.启动服务启动product-service服务观察consul页面可以看到product-service服务已经注册成功了当我将健康检查的依赖注释掉后重新刷新页面可以发现是没有进行健康检查的(四).服务配置和刷新Consul除了服务注册和发现之外还可以作为配置中心。服务的配置信息存储在Consul中然后服务从Consul中获取配置信息Consul在特殊的“bootstrap”阶段配置信息会被加载到Spring环境中默认情况下存储在/config文件夹中然后根据应用程序的名称和激活的配置文件创建多个PropertySource实例。当前配置在应用程序启动时读取向/refresh发送HTTP POST 请求将导致配置重新加载Config Watch 也会自动检测变化并重新加载应用程序的上下文1.初始化配置(1).创建目录使用Consul作为配置中心首先我们要先创建目录把配置信息存储到Consul中(2).创建应用目录进入config文件夹然后点击create按钮创建 product-service/应用目录存储对应微服务应用的default环境配置信息。如果项目中有多个环境例如defaultdevprod那么就在config目录下创建对应的多环境目录config/product-service对应使用config前缀的名称为product-service的应用config/product-service,dev对应使用config前缀的名称为product-service并且profile属性设置为dev的应用config/product-service,prod对应使用config前缀的名称为product-service并且profile属性设置为prod的应用(3).添加配置信息在product-serviceproduct-service,devproduct-service,prod中创建相应的文件并添加相应的配置信息注意设置的时候Key的默认名称为“data”如果不想用data会在下面具体介绍2.项目配置这里要做的主要就是添加依赖这里除了要添加consul-config的依赖之外还需要添加bootstrap的依赖。因为Spring Cloud 会创建一个Bootstrap Context作为Spring应用“Application Context”的父上下文。在Spring应用启动的初始化阶段Bootstrap Context负责从外部源(例如Consul)加载配置属性并解析配置。dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-consul-config/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-bootstrap/artifactId /dependency3.配置文件Bootstrap属性具有高优先级即 bootstrap.yml的优先级要高于application.yml。所以我们需要创建bootstrap.yml并且添加相应的配置信息spring: application: name: product-service profiles: active: dev cloud: consul: host: 127.0.0.1 port: 8500 config: format: YAMLSpring 在启动的时候在bootstrap结尾段会通过Consul去获取 key 为“config/product-service,dev/data”对应的valuevalue的格式为yaml4.测试package org.com.spring.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RequestMapping(/consul) RestController public class ConsulController { Value(${service-name}) private String serviceName; Value(${output.info}) private String outputInfo; RequestMapping(/getMsg) public String getMsg(){ return String.format(从配置文件中获取数据 serviceName : %s , outputInfo : %s,serviceName,outputInfo); } }可以看到拿到的东西信息是一样的图中的关系都是要对应起来的5.动态刷新Consul也是支持动态刷新配置的我们只需要在配置类上加上 RefreshScope注解可以标记需要动态刷新的Bean。当接收到刷新事件时这些Bean会重新加载最新的配置可以看得到是可以获取到修改之后的数据的注意默认的检查频率是1000单位毫秒当然我们也可以自己设定6.其他配置默认的情况下consul配置的路径前缀是 /config不同的application和profile对应不同的配置路径。例如 product-service 和 dev 的配置consul在扫描的时候会涉及到以下路径config/product-serivce,dev/config/product-service/config/application,devconfig/application这个列表从上往下分别对应的配置优先级从高到低优先级高的同样配置项会覆盖优先级低的配置项。对于 config/application 是全局公共配置对应使用config前缀的所有应用对于 config/product-serivce,dev/ 是全局dev公共配置对应使用config前缀的所有且profile为dev的应用下面开始具体的测试然后重启服务开始测试在日志中也可以看到可以发现优先级最高的是product-service-dev然后我将product-service-dev删除了然后访问到的就是product-service-default剩下的以此类推同样当我将product-service中的配置添加到order-service中的时候再运行可以发现也是可以访问成功的这里我们要注意一点前面介绍的动态刷新只针对修改配置文件不针对新增或者删除配置文件所以但我们删除配置文件之后我们要重启服务当然关于consul的配置还有很多属性这里逐一介绍spring: cloud: consul: host: 127.0.0.1 port: 8500 config: # 是否启用配置中心默认值 true 开启 enabled: true # 设置配置的基本文件夹默认值 config 可以理解为配置文件所在的最外层文件夹 prefix: config # 配置环境分隔符默认值 , 和 default‑context 配置项搭配 # 例如应用 product‑service 分别有环境 default, dev, prod # 需在 config 文件夹下创建 product‑serviceproduct‑service‑dev # product‑service‑prod 文件夹即可 profile‑separator: - # 指定配置格式为 yaml format: YAML # Consul 的 Key/Values 中的 KeyValue 对应整个配置文件 data‑key: productConfig # 以上配置可以理解为加载 config/product‑service/ 文件夹下 Key 为 productConfig 的 Value 对应的配置信息 watch: # 是否开启自动刷新默认值 true 开启 enabled: true # 刷新频率单位毫秒默认值 1000 delay: 1000由于有些属性是有默认值的所以在前面没有配置例如 prefisenabled等等(五).Consul配置持久化但是现在consul有一个问题。当我将consul关闭之后然后再重启现在我重启了发现所有的配置文件都没有了。这和我们的启动命令有关我们启动的时候使用的是 consul agent -dev 启动的-dev表示的是 开发环境关闭所有持久化选项用于快速开启consul代理-server表示的是 以服务器模式启动consul代理-client表示的是 以客户端模式启动consul代理-ui表示的是 启用consul的Web用户界面-bootstrap-expect表示的是 设置期望加入的服务器节点数用于初始化集群-date-dir表示的是 指定数据存储目录所以说我们可以指定consul数据的存储目录consul agent -server -bootstrap-expect 1 -ui -data-dirE:\SpringCloudCode\consul_data -bind127.0.0.1 -advertise127.0.0.1上面的命令是我通常使用的命令大家可以自定义
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门