1.部分依赖
//这个依赖项是所有Spring Cloud 项目使用的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
// 包含了spring-cloud-server 的核心库 前两个可以构成config的作用 将信息注册到git 之类的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
//调用方使用 包含了与Spring Cloud配置服务器交互所需的所有类
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
2.@EnableConfigServer
使服务称为SpringCloud Config 的服务
3.服务端配置 application.xml (参考)
server:
port: 8888
spring:
cloud:
config:
server:
encrypt.enabled: false
git:
uri: https://github.com/carnellj/config-repo/ #uri 提供要连接的存储库
searchPaths: licensingservice,organizationservice #告诉config在云配置服务器启动时应该在Git存储库中搜索的相对路径 逗号分隔的由配置服务托管的服务列表
username: native-cloud-apps
password: 0ffended
####
#Classpath and file-based solution
####
#server:
# port: 8888
#spring:
# profiles:
# active: native
# cloud:
# config:
# server:
# native:
# searchLocations: file://<chapter 3>/confsvr/src/main/resources/config/licensingservice,
# file://<chapter 3>confsvr/src/main/resources/config/organizationservice
### #searchLocations: classpath:config/,classpath:config/licensingservice
4.建立许可证服务对Spring Cloud Config服务器的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
增加依赖 配置boostrap.yml
spring:
application: 指定许可证服务的名称,以便Config 客户端知道正在查找哪个服务
name: licensingservice 这里的应用的名字则是 licensingservice .yml 配置在远程仓库git上面的
profiles:
active:
default 指定服务应该运行的默认profile oprofile映射到环境
cloud: 指定Spring Cloud Config 服务器的位置
config:
uri: http://localhost:8888
使用mvn spring-boot: run
默认自动尝试使用端点 http://localhosst:8888 和 对应bootstrap.yml 文件中活跃的profile
想覆盖的话可以使用
java -Dspring.cloud.config.uri=http:8888
-Dsrping.profiles.active=dev
-jar target/licensing-service-0.0.1-SNAPSHOT.jar
5.可以使用@Value直接读取属性
@Component
public class ServiceConfig{
@Value("${example.property}")
private String exampleProperty;
public String getExampleProperty(){
return exampleProperty;
}
}
6.SpringCloud 配置服务器刷新属性 @RefreshScope
始终获得最新的配置属性
@SpringBootApplication
@RefreshScope
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
该注解只会冲洗加载应用程序配置中的自定义Spring属性。
该注解允许开发团队访问/refresh端点,强制springboot应用程序重新读取配置。
问题:同一服务的多个实例正在运行,需要使用新的应用程序偶配置刷新所有的服务。
解决:
1.Springcloud 配置服务确实提供了一种称为Springcloud BUs的“推送”机制,
使Springcloud配置服务器能够向所有 使用服务的客户端发布有更改发生的信息。
Springcloud配置需要一个恩爱的中间件(RabbitMQ)运行。这是监测更改的非常有用。
但并不是所有的SpringCloud配置后端都支持这种"推送”机制。(也就是Consul服务器)
2.编写简单脚本来查询服务发现引擎以查找服务的所有实例,并直接调用/refresh端点。
3.重新启动所有服务器或容器来接受新的属性。特别是Docker等容器服务中运行服务时。
重新启动Docker容器差不多需要几秒,然后将强制重新读取应用程序配置。
7.保护敏感的配置信息 加密解密
(1)下载并安装加密所需的Oracle JCE jar。
(2)创建加密密钥 设置一个对称加密秘钥
export ENCRYPT_KEY=IMSYMMETRIC
对称秘钥:1、对称秘钥的长度应该是12个或更多个字符,最好是一个随机的字符集。
2、不要丢失对称秘钥。一旦使用加密秘钥加密某些东西,如果没有对称秘钥就无法解密。
(3)加密和解密属性
其中要加密密码 一下是 Docker-compose.yml中配置了密码
version: '2'
services:
database:
extends:
file: ../common/docker-compose.yml
service: database
environment:
POSTGRES_USER: "postgres_dev"
POSTGRES_PASSWORD: "p0stgr@s_dev"
POSTGRES_DB: "eagle_eye_dev"
configserver:
extends:
file: ../common/docker-compose.yml 下面有 另一个docker-compose.yml的配置
service: configserver
licensingservice:
image: ch3-thoughtmechanix/licensing-service
ports:
- "8080:8080"
environment:
PROFILE: "dev"
CONFIGSERVER_URI: "http://configserver:8888"
CONFIGSERVER_PORT: "8888"
DATABASESERVER_PORT: "5432"
http://localhost:8888/encrypt
加密p0stgr@s
返回一段加密后的结果4788dfe1ccbe6485934aec2ffeddb06163ea3d616df5fd75be96aadd4df1da91
前面的 licensingservice.yml (git上面的配置文件)如下
example.property: "I AM IN THE DEFAULT"
spring.jpa.database: "POSTGRESQL"
spring.datasource.platform: "postgres"
spring.jpa.show-sql: "true"
spring.database.driverClassName: "org.postgresql.Driver"
spring.datasource.url: "jdbc:postgresql://database:5432/eagle_eye_local"
spring.datasource.username: "postgres"
spring.datasource.password: "{cipher}4788dfe1ccbe6485934aec2ffeddb06163ea3d616df5fd75be96aadd4df1da91"
spring.datasource.testWhileIdle: "true"
spring.datasource.validationQuery: "SELECT 1"
spring.jpa.properties.hibernate.dialect: "org.hibernate.dialect.PostgreSQLDialect"
redis.server: "redis"
redis.port: "6379"
signing.key: "345345fsdfsf5345"
要求所有已加密的属性前面加上{cipher}
它会告诉SpringCloud配置服务器它正在处理已加密的值。
但是在查询http://localhost:8888/licensingservice/defalult 的时候 发现密码被解密了。有问题
(4)配置微服务已在客户端使用加密
一、配置SpringCloud Config 不要再服务器端解密属性
server:
port: 8888
spring:
cloud:
config:
server:
encrypt.enabled: false !!!!!!服务器端设置
git:
uri: https://github.com/carnellj/config-repo/
searchPaths: licensingservice,organizationservice
username: native-cloud-apps
password: 0ffended
二、在许可证服务器上设置对称秘钥。
因为许可证服务现在负责解密已加密的属性,所以需要先在许可证服务上设置对称秘钥,方式是确保ENCRYPT_KEY
环境变量与 SpringCloud Config服务器使用的对称秘钥相同(如前面的IMSYMMETRIC)
./common/docker-compose.yml中配置了
version: '2'
services:
configserver:
image: johncarnell/tmx-confsvr:chapter3
ports:
- "8888:8888"
environment:
ENCRYPT_KEY: "IMSYMMETRIC" ##这里给许可证服务配置对称秘钥的信息
database:
image: postgres:9.5
ports:
- "5432:5432"
environment:
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: "p0stgr@s"
POSTGRES_DB: "eagle_eye_local"
licensingservice:
image: johncarnell/tmx-licensing-service:chapter3
ports:
- "8080:8080"
environment:
PROFILE: "default"
CONFIGSERVER_URI: "http://configserver:8888"
CONFIGSERVER_PORT: "8888"
DATABASESERVER_PORT: "5432"
ENCRYPT_KEY: "IMSYMMETRIC"
三、将Spring-security-rsa JAR增加到许可证服务的pom.xml文件中
增加依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-rsa</artifactId>
</dependency>
学习与Spring微服务实战