11.4 创建Config Server
- 在基础工程spring-cloud-microservice 下,创建一个名为 microservice-cloud-config-server-8016的 maven 模块,并在其 pom.xml 中添加 Spring Cloud Config 客户端的依赖,配置内容如下。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-microservice</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microservice-cloud-config-server-8016</artifactId>
<dependencies>
<!--Spring Boot Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--devtools 开发工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--spring-boot test 测试只能在test包中测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--junit 测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- 修改后立即生效,热部署 这个热部署重启得更快 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
<!--日志-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!-- Spring Boot 监控模块,完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入 Eureka Client 的依赖,将服务注册到 Eureka Server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
<!--配置中心服务器依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>3.1.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 在 microservice-cloud-config-server-8016 类路径(/resources 目录)下,创建一个名为 application.yml 的配置文件,配置如下。
server:
port: 8016
spring:
application:
name: microServiceCloudConfigServer #微服务名称,对外暴漏的微服务名称,十分重要
cloud:
config:
server:
git:
# Git 地址, git@gitee.com:spacename/springcloud-config.git
# 码云(gitee)https地址 uri: https://gitee.com/spacename/springcloud-config.git (github 站点访问较慢,因此这里我们使用 gitee)
uri: git@gitee.com:spacename/springcloud-config.git
#仓库名
search-paths:
- springcloud-config
force-pull: true
# 如果Git仓库为公开仓库,可以不填写用户名和密码,如果是私有仓库需要填写
username: giteeUserName
password: giteePassword
#仓库分支名
default-label: master
#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
client:
fetch-registry: true
service-url:
#defaultZone: http://localhost:7001/eureka/ #这个地址是 7001注册中心在 application.yml 中暴露出来额注册地址 (单机版)
defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7002.com:7002/eureka/,http://eurekaserver7003.com:7003/eureka/ #将服务注册到 Eureka Server 集群
instance:
instance-id: microservice-cloud-config-server-8016 #自定义服务名称描述信息
prefer-ip-address: true #显示访问路径的 ip 地址
#zookeeper需要配置那些服务service被扫描,eureka则是将整个服务包注册进去了
ribbon:
eager-load:
enabled: true #关闭懒加载
# 指的是建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 6000
# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
ConnectTimeout: 6000
MaxAutoRetriesNextServer: 1
MaxAutoRetries: 1
# spring cloud 使用 Spring Boot actuator 监控完善信息
# Spring Boot 2.50对 actuator 监控屏蔽了大多数的节点,只暴露了 heath 节点,本段配置(*)就是为了开启所有的节点
# zuul中包含actuator依赖
management:
endpoints:
web:
exposure:
include: health,info,hystrix.stream #应包含的端点 ID 或 '' 全部,* 在yaml 文件属于关键字,所以需要加双引号
#include的值也可以改成*,但建议还是最小暴露原则,用啥开启啥
info:
env:
enabled: true #启用配置里的info开头的变量
info: #配置一些服务描述信息,监控信息页面显示,,可以判断服务是否正常
app.name: microservice-cloud-config-server-8016
company.name: cloud.zk.com
auth: zk
email: 123@qq.com
build.aetifactId: @project.artifactId@
build.version: @project.version@
- 在 microservice-cloud-config-server-8016 的主启动类上,使用 @EnableConfigServer 注解开启 Spring Cloud Config 配置中心功能,代码如下。
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer //开启 Spring Cloud Config 配置中心功能
public class MicroServiceCloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(MicroServiceCloudConfigServerApplication.class, args);
}
}
-
依次启动服务注册中心(集群)和 microservice-cloud-config-server-8016,使用浏览器访问“http://localhost:8016/master/application-test.yml”,结果如下图。 -
Spring Cloud Config 规定了一套配置文件访问规则,如下表。
访问规则 | 示例 |
---|
/{application}/{profile}[/{label}] | /config/dev/master | /{application}-{profile}.{suffix} | /config-dev.yml | /{label}/{application}-{profile}.{suffix} | /master/config-dev.yml |
-
访问规则内各参数说明如下。
- {application}:应用名称,即上传到仓库的配置文件的名称,例如application。
- {profile}:环境名,一个项目通常都有开发(dev)版本、测试(test)环境版本、生产(prod)环境版本,配置文件则以 application-{profile}.yml 的形式进行区分,例如 application-dev.yml、application-test.yml、application-prod.yml 等。
所以我们提交的配置文件可以是application-dev.yml、application-test.yml、application-prod.yml 多环境配置文件形式,也可以是多环境单配置文件形式
- {label}:Git 分支名,默认是 master 分支,当访问默认分支下的配置文件时,该参数可以省略,即第二种访问方式。
- {suffix}:配置文件的后缀,例如 config-dev.yml 的后缀为 yml。
-
鉴于这种访问规则,访问“http://localhost:8016/application-dev.yml”,结果如下图。
错误记录:服务启动时会报java.lang.SecurityException: Prohibited package name: java.com.example
很明显java.lang.ClassLoader.preDefineClass方法首先对类名进行了检查,双亲委派机制发现以java作为一级包名,则抛出安全异常:禁止使用的包名!
这条错误是由Java类加载的“双亲委派模型”所导致的。在双亲委派模型中,由父加载类加载的类,下层加载器是不能加载的,为了保护java的核心代码不被篡改
可以将这个java包删掉也可以放到com包下
11.5 创建 Config 客户端
- 在基础工程 spring-cloud-microservice 下,创建一个名为 microservice-cloud-config-client-8017 的 maven模块,并在其 pom.xml 中添加 Spring Cloud Config 客户端的依赖,配置内容如下。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-microservice</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microservice-cloud-config-client-8017</artifactId>
<dependencies>
<!--Spring Boot Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--devtools 开发工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--spring-boot test 测试只能在test包中测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--junit 测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- 修改后立即生效,热部署 这个热部署重启得更快 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
<!--日志-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!-- Spring Boot 监控模块,完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入 Eureka Client 的依赖,将服务注册到 Eureka Server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
<!--配置中心客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 在microservice-cloud-config-client-8017中类路径(/resources 目录)下,创建一个名为 bootstrap.yml 的配置文件,配置如下。
#bootstrap.yml 是系统级别的,加载优先级高于 用户级别application.yml ,负责从外部加载application.yml配置并解析
#对应了java的加载器,根加载器由于用户加载器
server:
port: 8017
spring:
application:
name: microServiceCloudConfigClient #微服务名称,对外暴漏的微服务名称,十分重要
cloud:
config:
label: master #仓库分支名
name: application #配置文件名称,如:application-dev.yml 中的 application,或application.yml集成配置文件
profile: dev #环境名 如:application-dev.yml 中的 application, 中的 dev,或application.yml继承环境中的dev
#别忘记添加 http:// 否则无法读取
##Spring Cloud Config Server地址
uri: http://localhost:8016
#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
client:
fetch-registry: true
service-url:
#defaultZone: http://localhost:7001/eureka/ #这个地址是 7001注册中心在 application.yml 中暴露出来额注册地址 (单机版)
defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7002.com:7002/eureka/,http://eurekaserver7003.com:7003/eureka/ #将服务注册到 Eureka Server 集群
instance:
instance-id: microservice-cloud-config-server-8016 #自定义服务名称描述信息
prefer-ip-address: true #显示访问路径的 ip 地址
#zookeeper需要配置那些服务service被扫描,eureka则是将整个服务包注册进去了
ribbon:
eager-load:
enabled: true #关闭懒加载
# 指的是建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 6000
# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
ConnectTimeout: 6000
MaxAutoRetriesNextServer: 1
MaxAutoRetries: 1
# spring cloud 使用 Spring Boot actuator 监控完善信息
# Spring Boot 2.50对 actuator 监控屏蔽了大多数的节点,只暴露了 heath 节点,本段配置(*)就是为了开启所有的节点
# zuul中包含actuator依赖
management:
endpoints:
web:
exposure:
include: health,info,hystrix.stream #应包含的端点 ID 或 '' 全部,* 在yaml 文件属于关键字,所以需要加双引号
#include的值也可以改成*,但建议还是最小暴露原则,用啥开启啥
info:
env:
enabled: true #启用配置里的info开头的变量
info: #配置一些服务描述信息,监控信息页面显示,,可以判断服务是否正常
app.name: microservice-cloud-config-server-8016
company.name: cloud.zk.com
auth: zk
email: 123@qq.com
build.aetifactId: @project.artifactId@
build.version: @project.version@
- 在com.example.controller中,创建一个名为 ConfigClientController 的类,通过该类获取配置文件中的配置,代码如下。
package com.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 读取配置中心指定配置文件的内容,并展示到页面
*/
@RestController
public class ConfigClientController {
@Value("${server.port}")
private String port;
@Value("${spring.application.name}")
private String applicationName;
@Value("${config.info}")
private String info;
@Value("${config.version}")
private String version;
@GetMapping("/getInfo")
public String getInfo(){
return "applicationName is:"+applicationName+" <br/>port is:"+port+"<br/>info is:"+info+"<br/>version is"+version;
}
}
- 最后在microservice-cloud-config-client-8017的主启动类上,使用 @EnableEurekaClient 注解开启 Eureka 客户端功能,代码如下。
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class MicroServiceCloudConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(MicroServiceCloudConfigClientApplication.class, args);
}
}
- 启动microservice-cloud-config-client-8017,,使用浏览器访问“http://localhost:8017/getInfo”,结果如下图。
问题记录:服务使用了bootstrap.yml 是系统级别的配置文件,启动时却无法加载,报错:springcloud config报错No spring.config.import set
问题原因:Spring Cloud 新版本默认将 Bootstrap 禁用,需要将 spring-cloud-starter-bootstrap 依赖引入到工程中:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
下一篇:SpringCloud-29-Spring Cloud Config手动刷新配置
|