前言:想将项目放入到服务器内跑起来,此处用到配置中心SpringCloud Config;
一、概念
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。
由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。
Spring Cloud 提供了 ConfigServer来解决这个问题.
Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
SpringCloud Config 分为服务端和客户端两部分。
服务端也称为分布式配置中心,他是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密 信息等访问接口。
客户端则是通过制定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
一个使用微服务架构的应用系统可能会包括成百上千个微服务,配置各部相同,需求各不相同:
不同环境不同配置:例如数据源在不同的环境(开发,测试,生产)是不同的,可以通过配置中心运行期间可以动态调整。例如根据各个微服务的负载状况,动态调整数据源连接池大小或者熔断阀值,并且调整时不停止微服务(配置修改后可以自动更新)
二、将项目打包出去
1、先将父项目内导入的dto依赖项目导出
2、先将父项目导出
将pom文件中的认子注掉:
导包:
3、将子类生产者导包
将此jar包拿出
4、就可在cmd内运行
三、解决
1、问题:多个项目依赖与一些配置,若一个配置改变,还要去改变项目的源码
2、解决:使用配置中心(SpringCloud config)
对比:
3、演示
①、在父项目内导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
将认子放开:
②、新建一个客户端项目
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lv</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<artifactId>cloud01</artifactId>
<groupId>org.lv</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<mainClass>com.lv.configclient.ConfigClientApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
③、新建配置
注意:nacos服务中的application.properties文件中,连接数据库的密码需要注意
email:
host: qq.com
username: root
password: 123456
④、从项目中读取配置中心的内容
新建application.yml与bootstrap.yml文件
SpringBoot默认支持properties和YAML两种格式的配置文件。
bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml 先于 application.yml 加载
在父类导入依赖:
<dependency>
??<groupId>org.springframework.cloud</groupId>
??<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
bootstrap.yml文件:
server:
port: 8083
spring:
application:
# 会自动根据服务名拉取data-id对应的配置文件.如果data-id跟服务名不一致 就需要手动指定data-id
# 跟服务名相同的data-id的配置文件,称之为默认的配置文件
# 除了默认的配置文件,其他配置文件必须写上后缀
name: config-client
cloud:
nacos:
discovery: #注册中心
server-addr: 127.0.0.1:8848
# username: nacos
# password: nacos
config: #配置中心
prefix: ${spring.application.name}
#指定nacos配置中心地址
server-addr: 127.0.0.1:8848
file-extension: yml # 使用的 nacos 配置集的 dataId 的文件拓展名,同时也是
# Nacos 配置集的配置格式,默认为 properties
# namespace: f1896568-xxxx-45d8-8a93-a64c5bcc22ff ?# 使用的 nacos 的命名空间,默认为 null
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP共享配置集数组
# shared-configs:
# - data-id: shared-dataId-01.yaml
# group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
# refresh: true # 是否自动刷新配置,默认为 false@RefreshScope 实现配置实时更新
在此启动类注入:
@EnableDiscoveryClient
@SuppressWarnings("all")
// 自动填充
@Configuration
@Data
@ConfigurationProperties(prefix = "email")
public class EmailProperties{
private String host;
private String username;
private String password;
}
新建测试类,拿取数据:
将配置中心直接拿取到application.yml文件
package com.lv.configclient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SuppressWarnings("all")
//刷新配置
@RefreshScope
public class TestController {
// yml注入
@Value("${email.host}")
private String host;
@Value("${email.username}")
private String username;
@Value("${email.password}")
private String password;
// 注入EmailProperties
@Autowired
private ConfigClientApplication.EmailProperties properties;
@RequestMapping("/test01")
public String test01(){
StringBuffer sb=new StringBuffer();
sb.append("<b>host</b>:"+host);
sb.append("<br><b>username</b>:"+username);
sb.append("<br><b>password</b>:"+password);
sb.append("<br><b>properties</b>:"+properties);
return sb.toString();
}
}
⑤、远程配置读取
Ⅰ、新增配置中心
Ⅱ、共享配置集数组
bootstrap.yml:
# 共享配置集数组
shared-configs:
- data-id: config-redis.yml
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
refresh: true # 是否自动刷新配置,默认为 false@RefreshScope 实现配置实时更新
Ⅲ、测试类TestController
@Value("${redis.host}")
private String redisHost;
@Value("${redis.port}")
private String redisPort;
@RequestMapping("/test01")
public String test01(){
StringBuffer sb=new StringBuffer();
sb.append("<b>host</b>:"+host);
sb.append("<br><b>username</b>:"+username);
sb.append("<br><b>password</b>:"+password);
sb.append("<br><b>properties</b>:"+properties);
sb.append("<br><b>host</b>:"+redisHost);
sb.append("<br><b>port</b>:"+redisPort);
return sb.toString();
}
⑥、切环境
找到命名空间:
新建几个空间:
将两个配置列表分配到测试和开发的空间:
注:需要到空间里将克隆的文件改成yml文件
需要哪个空间就填入哪个命名空间id
namespace: f1896568-xxxx-45d8-8a93-a64c5bcc22ff # 使用的 nacos 的命名空间,默认为 null
运行为开发环境:
⑦、共享位置+环境
将config-client项目导出:
拿出jar包:
运行jar包:
将此yml文件取消,不定死
namespace: f1896568-xxxx-45d8-8a93-a64c5bcc22ff # 使用的 nacos 的命名空间,默认为 null
直接到文件运行执行以下语句,
jar
java -jar xx.jar
java -jar xx.jar –spring.cloud.nacos.config.namespace=命名空间id
启动成功:
注意:在nacos配置中心的配置内容,不能出现中文,否则报错
本期内容结束~~~~