1、为什么使用配置中心
服务配置的现状:
在微服务系统中,每个微服务不仅仅只有代码,他还需要连接其他资源,例如数据库的配置或功能性的开关等等。
但是随着微服务系统的不断迭代,整个微服务系统可能会成为一个网状结构,
这个时候就要考虑整个微服务系统的扩展性、伸缩性、耦合性等等。其中一个很重要的环节就是配置管理的问题。
常见的配置类型
配置大类 |
常见配置类型 |
服务配置 |
数据库配置 |
MQ队列配置 |
redis缓存配置 |
各类开关 |
功能开关 |
业务开关 |
服务开关 |
业务配置 |
模块A |
模块B |
模块C |
常用的配置管理解决方案的缺点:
1.硬编码【缺点:需要修改代码、繁琐、风险大】
2.写在properties里面【缺点:在集群环境下,需要替换和重启】
3.写在xml配置文件中,一般和应用一起打包【缺点:需要重新打包和重启】
为什么要使用spring cloud config 配置中心?
由于常用的配置管理有很大的缺点,故spring
spring cloud config配置中心,在微服务分布式系统中,
采用服务端和客户端来提供可扩展的配置服务。配置中心负责管理所有的服务的各种环境配置文件。
配置服务中心默认采用Git的方式存储配置文件,因此我们很容易部署修改,有助于对环境配置进行版本管理。
spring cloud config 配置中心,它解决了什么问题?
Spring Cloud Config它解决了微服务配置的中心化、版本控制、平台独立、语言独立等问题。
其特性如下:
1.提供服务端和客户端支持(spring cloud config server和spring cloud config client)
2.集中式管理分布式环境下的应用配置
3.基于Spring环境,无缝与Spring应用集成
4.可用于任何语言开发的程序
5.默认实现基于git仓库,可以进行版本管理
配置中心原理

配置 文件命名规则
/{application}/{profile}[/{label}] |
/{application}-{profile}.properties |
/{label}/{application}-{profile}.properties |
/{application}-{profile}.yml |
/{label}/{application}-{profile}.yml |
application:表示目标服务的名称
profile:表示获取指定环境下配置,例如开发环境、测试环境、生产环境 默认值default,
实际开发中可以是 dev、test、prodn等
label: git标签,默认值master
3、对称加密
一、对称加密介绍
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。
二、检查加密环境
http://127.0.0.1:9030/encrypt/status
检查结果:{"description":"No key was installed for encryption service","status":"NO_KEY"}
没有为加密服务安装密钥。
三、加密环境3种解决方案
1.设置秘钥KEY
encrypt.key=agan
2.未配置JCE
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载解压后,把jar文件上传到需要安装jce机器上JDK或JRE的security目录下,覆盖源文件即可。
JDK:将两个jar文件放到%JDK_HOME%\jre\lib\security下
JRE:将两个jar文件放到%JRE_HOME%\lib\security下
3.spring cloud bug
Dalston.SR4、Dalston.SR3、Dalston.SR2版本不能对配置文件加密,若需要调整到Dalston.SR1
https://github.com/spring-cloud/spring-cloud-config/issues/767
四、加密演示
加密(post请求):http://127.0.0.1:9030/encrypt
解密(post请求):http://127.0.0.1:9030/decrypt
4、非对称加密
对称和非对称加密的区别?
1.对称加密算法在加密和解密时使用的是同一个秘钥;
2.非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
非对称加密的例子
甲乙之间使用非对称加密的方式完成了重要信息的安全传输。
1、乙方生成一对密钥(公钥和私钥)并将公钥向其它方公开。
2、得到该公钥的甲方使用该密钥对机密信息进行加密后再发送给乙方。
3、乙方再用自己保存的另一把专用密钥(私钥)对加密后的信息进行解密。
(注:)乙方只能用其专用密钥(私钥)解密由对应的公钥加密的信息。
在传输过程中,即使攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。
同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。

5、配置中心运作流程
首先我接触到的,包括现在好多老的项目都在用xml配置bean,配置过滤器,拦截器等等但是要维护的话繁琐且庞杂
然而spring注解方式的出现打破了这种状况,有Autowired @Bean @Primary 把所有关于依赖注入的项从配置中解放出来
现在的项目只需要关注项目属性的配置就可以了,可以说非常方便了
但是当你有了多个环境的时候,管理配置文件就变的繁多
再有就是配置文件多静态部署到项目中去,如若修改,就需要重新打包发布,多个版本环境导致了复杂度。
Config Server 核心功能
作为springcloud 官方制定产品
提供了三种服务
统一配置,环境隔离,动态刷新
统一配置提供了一个集中的配置中心,将不同环境和不同项目的配置,放在一起
环境隔离,cLient可以通过自已的环境加载对应的配置文件
动态刷新 支持运行期变更并生效配置
1.1 配置中心用户安全认证
使用浏览器直接访问可以看到明文账号密码,不安全

1.1.1 服务端config-server-encrypt-security

1.1.1.1 pom.xml
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.agan.springcloud</groupId>
<artifactId>config</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>config-server</artifactId>
<name>config-server</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.1.1.1.1 application.properties
spring.application.name=config-server
server.port=9030
eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/
#默认是hostname 注册,改成IP 注册
eureka.instance.perferIpAddress=true
spring.cloud.config.server.git.uri=https://gitee.com/agan\_jiagou/config
#spring.cloud.config.server.git.username=
#spring.cloud.config.server.git.password=
encrypt.key=agan
# 安全认证
#开启基于http basic的安全认证
security.basic.enabled=true
security.user.name=user
security.user.password=123456
1.1.1.1 启动类
package com.agan.book.config;
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;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/\*\*
\* @author 阿甘 http://study.163.com/instructor/1016671292.htm
\* @version 1.0
\*/
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
1.1.1.1 测试效果


1.1.1 生产者config-encrypt-security-product-core
spring.application.name=e-book-config-product
server.port=8083
eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/
#默认是hostname 注册,改成IP 注册
eureka.instance.perferIpAddress=true
#--------------db----------------
~~mybatis.type-aliases-package=com.agan.book.product.domain~~
~~mybatis.mapper-locations=classpath:mybatis/com/agan/book/product/\*.xml~~
~~ ~~
~~spring.datasource.driverClassName=com.mysql.jdbc.Driver~~
~~spring.datasource.url=jdbc:mysql://mysql.yun:3306/book-product?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull~~
~~spring.datasource.username=root~~
~~spring.datasource.password=agan~~
~~ ~~
#默认false,这里设置true,表示开启读取配置中心的配置
spring.cloud.config.discovery.enabled=true
#对应eureka中的配置中心serviceId,默认是configserver
spring.cloud.config.discovery.serviceId=config-server
~~ ~~
~~ ~~
#安全保护
spring.cloud.config.username=user
spring.cloud.config.password=123456