目录
1 consul安装与运行
1.1 下载方式
1.2 安装
1.3 启动
1.4 访问方式
2 consul 实现服务注册与发现
2.1 引入
2.2 服务注册
2.3 服务发现
3 consul配置中心
3.1 基础配置
Eureka已经停止更新了,consul是独立且和微服务功能解耦的注册中心,而不是单独作为一个独立微服务嵌入到系统中。
1 consul安装与运行
1.1 下载方式
官网下载:https://www.consul.io/downloads
百度网盘链接:https://pan.baidu.com/s/1gKdyGMgpLU-jGMN_0s8R0Q 提取码:cvol
1.2 安装
下载之后就只有一个consul.exe文件,在对应路径下输出cmd进行终端,输出命令:
consul --version
consul --version 显示正常的版本信息,说明consul下载及安装完成
1.3 启动
consul agent -dev
consul agent -dev,输入该命令,使用开发模式启动consul
1.4 访问方式
通过地址http://localhost:8500访问到consul的首页。
2 consul 实现服务注册与发现
2.1 引入
通过下面的方式将一个微服务的IP地址和端口号硬编码另一个微服务中(例如订单微服务调用支付微服务),会存在这许多的问题:
/*** 这里采用的是硬编码的地址,可扩展性低下*/
public static final String PAYMENT_SERVICE_URL = "http://localhost:8001";
① 如果订单微服务和支付微服务的IP地址或者端口号发生了变化,则支付微服务将变得不可用,需要同步修改订单微服务中调用支付微服务的IP地址或端口。
② 如果系统中提供了多个订单微服务和支付微服务,则无法实现微服务的负载均衡。
③ 如果系统需要支持高并发,需要部署更多的订单微服务和支付微服务,硬编码订单服务则后续的维护会变得异常复杂。
所以,在微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。
2.2 服务注册
第一步,修改pom.xml文件添加相关的依赖:
<!--引入consul-discovery-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
第二步,在application.yml文件中添加相关的配置项:
spring:application:# 设置服务名称name: cloud-payment-servicecloud:# 配置consulconsul:# consul所在的IP地址host: localhost# consul所在的端口号port: 8500discovery:# 服务以什么名字注册到 consul 中service-name: ${spring.application.name}# 验证tokenacl-token: xxxxxx# 开启心跳模式,如果不开启服务注册后一直是红×heartbeat:enabled: true
第三步,启动微服务,并且访问http://localhost:8500查看服务是否注册成功:
2.3 服务发现
这个时候所有的微服务都注册到了consul注册中心中了,我们可以将上面的硬编码的代码修改为下面的代码了:
//注意这里的 cloud-payment-service 必须和上面你注册到 consul 中微服务名字保存一直。
public static final String PAYMENT_SERVICE_URL = "http://cloud-payment-service";
通过上面的步骤,Feign微服务或者Http请求都可以注册到consul上,进行微服务之间的调用。
3 consul配置中心
3.1 基础配置
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。比如某些配置文件中的内容大部分都是相同的,只有个别的配置项不同。就拿数据库配置来说吧,如果每个微服务使用的技术栈都相同,则每个微服务中关于数据库的配置几乎都是相同的,有时候主机迁移了,我希望一次修改,处处生效。
consul提供了通用全局配置信息的功能,直接注册进consul服务器,从consul获取。
第一步,修改pom.xml文件添加相关的依赖:
<!--引入consul-config-->
<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>
第二步,新增配置文件bootstrap.yml,将application.yml文件中的通用的配置信息放到文件中:
- applicaiton.yml是用户级的资源配置项
- bootstrap.yml是系统级的,优先级更加高
- Spring Cloud会创建一个"Bootstrap Context",作为Spring应用的Application Context的父上下文。初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment。
- Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap context和Application Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap Context和Application Context配置的分离。
- 将application.yml文件改为bootstrap.yml这是很关键的或者两者共存
因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml
- bootstrap.yml
spring:application:# 设置服务名称name: cloud-payment-servicecloud:# 配置consulconsul:# consul 所在的IP地址host: localhost# consul 所在的端口号port: 8500discovery:# 服务以什么名字注册到 consul 中service-name: ${spring.application.name}# 开启心跳模式,如果不开启服务注册后一直是红×heartbeat:enabled: true# 分布式配置config:enabled: true #是否开启配置中心format: yaml #配置文件格式,这里用的yamlprofile-separator: "-" #例如: service-provider和dev中间的符号 用-就是service-provider-devdata-key: data #默认的值就是data 是config的key 写上方便阅读prefix: config #默认的值就是config 是配置的前缀 写上方便阅读
第三步,consul
服务器key/value
配置填写
config是前缀,order-service是应用名,dev是环境,data是数据配置
第四步,测试
@Value("${test.num}")
private String num;
第五步,consul控制台修改配置值之后,代码中也会动态刷新
参考:
SpringCloud——consul_consul怎么安装-CSDN博客
入门Consul注册、配置中心(代码演示)_consul配置-CSDN博客