1.什么是consul
Consul 是一种由HashiCorp开发的开源工具,由go语言开发,用于实现服务发现、配置和分布式系统的基础设施服务。它被设计用来帮助构建和管理现代分布式应用程序的核心组件之一。
Consul 提供了以下主要功能:
- 服务发现和健康检查: Consul 允许服务在整个分布式环境中进行注册和发现。服务可以注册到 Consul 中心节点,并使用 DNS 或 HTTP 接口让其他服务或客户端发现它们的位置和可用性。此外,Consul 还能定期检查服务的健康状态,以便及时发现和处理故障。
- KV 存储: Consul 提供了一个分布式的键值存储系统,可以用来存储动态配置、特征标志和其他元数据。这些数据可以通过简单的 HTTP API 进行读写,使得应用程序可以动态地获取和修改配置,而不需要重新部署。
- 安全服务通信: Consul 支持基于 TLS 的加密通信和服务间的安全连接。它可以生成和分发 TLS 证书,用于验证和加密服务之间的通信,从而提高整个系统的安全性。
- 多数据中心支持: Consul 被设计为支持跨多个数据中心的部署。它能够轻松地管理和维护分布式系统的多个实例,并确保跨数据中心的服务发现和通信。
- 分布式一致性: Consul 使用 Raft 协议来实现分布式一致性,确保数据的可靠性和一致性。这使得 Consul 在面对网络分区和节点故障时能够保持系统的稳定性和可用性。
2.下载和运行
下载地址:developer.hashicorp.com/consul/inst…
window系统下载其中的386版本
然后解压到相应文件夹后在consul.exe目录下打开cmd窗口查看是否安装对的版本
输入
consul -version
如果显示出版本号数据那么就是下载对了
启动 consul,输入
consul agent -dev
打开UI界面
浏览器输入localhost:8500 (端口号可以在consul官网中查询到)
打开后就能看到一个酷炫的服务注册中心了,其中consul打了绿色的勾勾
3.consul在springcloud中的应用:
1.项目配置
导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
可以自己设置版本号,建议去官网查查版本的对应关系,以防出现启动时版本冲突的问题
服务配置:
系统拆分之后,会产生大量的微服务。每个微服务都有其对应的配置文件yml。如果其中的某个配置项发生了修改,一个一个微服务修改会很麻烦。因此一套集中式的、动态的配置管理设施是必不可少的。从而实现一次修改,处处生效。
在resource中重新创建一个bootstrap.yml文件
bootstrap.yml 是 Spring Boot 应用程序中一个特殊的配置文件,它的作用在于提供应用程序的基础配置信息,主要用于以下几个方面:
- 加载顺序优先级高:
bootstrap.yml文件的加载顺序优先于application.yml或application.properties文件。这意味着在应用程序启动时,Spring Boot 首先加载并应用bootstrap.yml中的配置,然后再加载application.yml或application.properties中的配置。这种机制允许在应用程序启动之前配置一些基础设施相关的配置项,如连接配置、加密解密配置等。 - 配置外部化:
bootstrap.yml通常用于配置连接到远程配置服务器(如 Spring Cloud Config Server)的详细信息。这使得应用程序能够在启动时从远程服务器获取配置信息,例如数据库连接信息、服务端口等。通过这种方式,可以将应用程序的配置信息从代码中分离出来,实现了配置的外部化管理和集中化管理。 - Spring Cloud 集成: 当应用程序使用 Spring Cloud 框架时,
bootstrap.yml也用于配置注册中心的连接信息(例如 Consul、Eureka 等),从而使应用程序能够注册和发现其他微服务。此外,还可以配置分布式系统中的分布式配置管理,例如使用 Consul 作为配置中心,从而动态获取应用程序的配置信息。 - 特定环境的配置:
bootstrap.yml可以根据不同的环境(如开发、测试、生产)进行不同的配置。例如,可以在开发环境中使用本地的配置信息,而在生产环境中使用远程配置服务器的信息,以便实现灵活的部署和管理。
总之,bootstrap.yml 是用于在应用程序启动时加载并应用的特殊配置文件,主要用于配置连接信息、外部化配置和集成分布式系统的基础设施配置。
spring:
application:
name: cloud-payment-service # 服务名,自定义
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
config:
#这个是配置文件名以-连接【consul的k-v存储用到】,例如:cloud-payment-service
profile-separator: '-'#文件分割符
format: YAML #指定为yaml形式配置
application.yml中在spring下一级加入
profiles:
active: dev # 多环境配置加载内容,不写就是默认default配置
然后在consul UI界面中key/value界面中增加config/name-dev(name为yml文件中的值)/data
其中data值为yaml形式的
注意:yaml形式主义间隔符的使用
如果修改了data中的数据想要项目中及时更新可以在主启动类上加入 @RefreshScope注解,可以动态刷新配置
你也可以将其他服务添加至consul管理就可以实现服务之间的调用
例如
@RestController
public class OrderController {
// private String paymentSrc_URL="http://localhost:8001";
private String paymentSrc_URL="http://cloud-payment-service";
@Resource
private RestTemplate restTemplate;
//使用httpclient调用pay模块的相关接口
@GetMapping("/consumer/pay/add")
public ResultData addOrder(PayDTO payDTO) throws IOException {
return restTemplate.postForObject(paymentSrc_URL+"/pay/add",payDTO,ResultData.class);
}
@GetMapping("/consumer/pay/get/{id}")
public ResultData getPayInfo(@PathVariable("id") Integer id) throws IOException {
return restTemplate.getForObject(paymentSrc_URL+"/pay/get/"+id,ResultData.class,id);
}
}
我们添加了一个cloud-payment-service服务进入,我们可以直接使用服务名进行使用 启动服务时记得将consul启动
只要consul中有这个服务我们就可以动态的调用从而实现多模块的分工