【SpringCloud】Consul-服务注册中心及配置中心快速入门
文章目录
1. 下载安装及启动
Consul下载地址:下载地址
Spring Cloud Consul 文档地址:文档地址
下载完毕,以开发模式启动Consul:
consul agent -dev
启动成功,进入可视化界面:http://localhost:8500:
2. 服务注册
2.1 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2.2 yml配置
spring:
application:
name: cloud-payment-service
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
2.3 启动类配置
在启动类上添加 @EnableDiscoveryClient
注解开启服务发现:
@SpringBootApplication
@EnableDiscoveryClient
public class Main8001 {
public static void main(String[] args) {
SpringApplication.run(Main8001.class, args);
}
}
2.4 测试
启动SpringBoot服务,检查服务是否注册成功。
修改接口,测试接口调用是否成功:
@RestController
public class OrderController {
//public static final String PaymentSrv_URL = "http://localhost:8001";//先写死,硬编码
public static final String PaymentSrv_URL = "http://cloud-payment-service";//改成服务名
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/pay/get/{id}")
public ResultData getPayInfo(@PathVariable("id") Integer id) {
return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/" + id, ResultData.class);
}
}
在测试之前,别忘了将 RestTemplate
添加一个 @LoadBalanced
负载均衡注解,因为该服务可能有多个,所以要使用负载均衡策略:
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
测试该接口,发现测试成功:
3. 服务配置
3.1 引入依赖
<!--SpringCloud 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>
3.2 yml配置
原配置文件 application.yml
的内容:
server:
port: 8001
# ==========applicationName + druid-mysql8 driver===================
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: root
password: 123456
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
# ========================mybatis===================
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.zhj.cloud.entities
configuration:
map-underscore-to-camel-case: true
改造后的配置文件分为两部分:
- application.yml:
- bootstrap.yml
application.yml:
server:
port: 8001
# ==========applicationName + druid-mysql8 driver===================
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: root
password: 123456
profiles:
active: dev # 多环境配置加载内容dev/prod,不写就是默认default配置
# ========================mybatis===================
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.zhj.cloud.entities
configuration:
map-underscore-to-camel-case: true
bootstrap.yml
spring:
application:
name: cloud-payment-service
####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 '-';比如默认是cloud,payment,ervice 修改后为cloud-payment-service
format: YAML
# config/cloud-payment-service/data
# /cloud-payment-service-dev/data
# /cloud-payment-service-prod/data
3.3 创建配置文件
打开 Consul 可视化界面,点击 Create:
以官网配置为例:
首先要创建一个 Config 文件夹,然后创建各个子文件夹,最后的data文件就是配置文件。
我们创建这三个配置文件:
- config/cloud-payment-service/data:默认环境,default
- config/cloud-payment-service-dev/data:开发环境,dev
- config/cloud-payment-service-prod/data:生产环境,prod
注意:如果输入结尾是’/',则当前为文件夹,下方的文本框会消失。
以 config/cloud-payment-service/data
为例,默认环境的配置如下,其他几个环境操作都相同。
3.4 动态刷新配置
在启动类上添加 @RefreshScope
注解即可开启动态刷新配置的功能,默认每隔55s刷新一次配置。
3.5 测试
在控制器中添加如下代码:
@Value("${server.port}")
private String port;
@GetMapping(value = "/pay/get/info")
private String getInfoByConsul(@Value("${com.zhj}") String str) {
return "com.zhj: " + str + "\t" + "port: " + port;
}
调用该接口:
修改配置文件的 spring.profiles.active
的值为 prod
,再次测试:
4. 数据持久化
每当 Consul 重启之后,上次配置的内容都会丢失。这是由于 Consul 没有配置数据持久化。现在配置数据持久化。
在 Consul 文件夹下创建两个文件:
- mydata文件夹
- consul_start.bat 文件
编辑 consul_start.bat 文件的内容如下:
@echo.服务启动......
@echo off
@sc create Consul binpath= "D:\program\consul\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect 1 -data-dir D:\program\consul\mydata "
@net start Consul
@sc config Consul start= AUTO
@echo.Consul start is OK......success
@pause
注意:在第三行中使用自己的路径。
右键bat文件,点击 以管理员身份运行
。弹出命令窗口,提示成功。如果没有提示成功,则说明失败了,自己找找原因。
此时,Consul 就以后台进程的方式运行了,并且支持数据持久化了。
那么我们以后就不用刻意去启动Consul了,每次关机重启之后Consul都会自己启动。