Spring Cloud config
配置中心服务端
配置pom依赖
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-config-server
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client
</artifactId>
</dependency>
<dependency>
<groupId>com.atguigu.springcloud
</groupId>
<artifactId>cloud-api-commons
</artifactId>
<version>${project.version}
</version>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-actuator
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-devtools
</artifactId>
<scope>runtime
</scope>
<optional>true
</optional>
</dependency>
<dependency>
<groupId>org.projectlombok
</groupId>
<artifactId>lombok
</artifactId>
<optional>true
</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-test
</artifactId>
<scope>test
</scope>
</dependency>
配置yml
server:
port: 3344
spring:
application:
name: springcloud
-config
-server
cloud:
config:
server:
git:
uri: https
://gitee.com/himitzh0730/springcloud
-config.git
label: master
eureka:
client:
service-url:
defaultZone: http
://eureka7001.com
主启动类,配置完就启动,等待其它微服务通过本配置中心去远程仓库获取配置。
@SpringBootApplication
@EnableConfigServer
public class Config_Server_3344 {
public static void main(String
[] args
) {
SpringApplication
.run(Config_Server_3344
.class,args
);
}
}
微服务读取配置方式 推荐:/{label}/{application}-{profile}.yml微服务需要添加pom依赖spring-cloud-starter-config
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-config
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-actuator
</artifactId>
</dependency>
微服务配置需要用到bootstrap.yml(系统级上下文管理),这样才能在启动前通过配置中心获取远程仓库的配置。
server:
port: 3355
spring:
cloud:
config:
name: config
-eureka
label: master
profile: dev
uri: http
://localhost
:3344
eureka:
client:
service-url:
defaultZone: http
://eureka7001.com
:7001/eureka
management:
endpoints:
web:
exposure:
include: "*"
在控制层controller加上注解@RefreshScope 动态刷新配置
@RefreshScope
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo
;
@GetMapping("/configInfo")
public String
getConfigInfo(){
return configInfo
;
}
}
每次修改都得发送一个POST请求 "http://localhost:3355/actuator/refresh"去提醒微服务配置已更新,可以避免每次配置更改,都要重启服务。
curl -X POST
"http://localhost:3355/actuator/refresh"
如果有多个微服务配置都要更新呢,总不能一个一个提醒微服务吧?能不能一键提醒所有微服务呢?有的,springcloud 的另一组件spring cloud bus消息总线配合MQ消息中间件可以做到一键刷新所有微服务配置。 原理大概: 触发一个服务端ConfigServer的/bus/refresh端点,通过消息总线告知每个微服务,而刷新所有客户端微服务的配置 给配置中心服务和各微服务都加上消息总线的pom依赖
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-bus-amqp
</artifactId>
</dependency>
消息中间件用的是RabbitMQ,在这之前需要先安装RabbitMQ和相关环境,之后配置中心和各微服务都要在yml加上相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
启动配置中心,各微服务,然后在远程仓库修改配置文件,然后依旧发送post请求 "http://localhost:3344/actuator/bus-refresh,通过告知配置中心,配置中心通过消息总线去通知全部微服务。达到一键动态更新所有微服务的配置。
curl -X POST "http://localhost:3344/actuator/bus-refresh
nacos实现配置中心功能
啊,启动nacos,这个就不说了,有需要的去看本系列的第一篇学习记录,启动相当于开启了注册与发现,配置中心的功能。(还不止,应该再加上bus,因为nacos实现了一键动态更新所有微服务配置),然后在nacos控制台可视化添加配置文件即可~ 点击添加,填写配置,点击发布即可,Data UD必须为“微服务名-生产环境.文件后缀"格式===>${spring.application.name}-${spring.profile.active}.${spring.cloud.naces.config.file-extension} 微服务导入spring cloud alibaba的nacos的配置中心依赖spring-cloud-starter-alibaba-nacos-config。顺便也导入了注册与发现的依赖spring-cloud-starter-alibaba-nacos-discovery
<dependency>
<groupId>com.alibaba.cloud
</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config
</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud
</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-actuator
</artifactId>
</dependency>
配置yml,依旧需要系统级别的上下文管理bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos
-config
-client
cloud:
nacos:
discovery:
server-addr: 129.204.177.72
:8848
config:
server-addr: 129.204.177.72
:8848
file-extension: yml
group: DEFAULT_GROUP
application.yml来配置指定获取的配置环境
spring:
profiles:
active: test
控制层加上@RefreshScope注解,让微服务可以自动检测刷新配置。
@RestController
@RefreshScope
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo
;
@GetMapping("/config/info")
public String
getConfigInfo() {
return configInfo
;
}
}
主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class CloudAlibabaConfigClient3377 {
public static void main(String
[] args
) {
SpringApplication
.run(CloudAlibabaConfigClient3377
.class, args
);
}
}
完事,使用确实很简单,只要每次在nacos里面修改一下对应的配置文件,获取该配置文件的各微服务都会动态更新相应配置,当然如何让配置持久化呢?那就应该写入mysql等数据库,让nacos集群都从mysql获取相同的配置,让每个微服务获取的配置都能保持一致性。