[TOC]
什么是SpringCloud?
答:SpringCloud是在SpringBoot的基础上构建的,目标是协调任何服务,简化分布式系统开发
。
SpringCloud的作用是什么?
SpringCloud对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性、可靠、协调的应用程序
;
SpringCloud是一系列框架的有序集合,它基于SpringBoot的便利性融合了一整套实现微服务的框架并提供了服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等组件。 SpringCloud的官网:https://spring.io/projects/spring-cloud
SpringCloud优点:
配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,领导选举,分布式会话,集群状态
等。Spring整体架构:
WeiyiGeek.整体架构
SpringCloud的版本关系 描述:SpringCloud是一个由许多子项目组成的综合项目,各子项目有不同的发布节奏。为了避免SpringCloud版本号与子项目版本号混淆,SpringCloud版本采用了名称而非版本号的命名; 比如当前SpringCloud版本Greenwich SR3,其中SR3是当SpringCloud的发布内容积累到临界点或者一个重大BUG被解决后,会发布一个”service releases”版本,简称SRX版
SpringCloud和SpringBoot版本对应关系
SpringCloud SpringBoot
Hoxton 2.2.x
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x
SpringCloud子项目简介:
SpringCloud子项目组织架构
WeiyiGeek.
注意事项:
描述:配置文件中有些敏感数据需要加密处理,在使用SpringCloud中实现SpringCloud config配置文件加密
#下载jce替换java_home/jre/lib/security下的两个jar包
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
#配置文件添加
encrypt:
key-store:
alias: mytestkey
location: server-rsa.jks
password: pppppppp
secret: ssssssss
测试加密解密启动eureka、config-server 可以使用curl和postman测试/enrypt、/derypt,如果加密解密结果一致就没问题。
生成证书
keytool -genkeypair -alias mytestkey -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass ssssssss -keystore server-rsa.jks -storepass pppppppp
在文件夹找到生成的server-rsa.jks,复制到项目classpath。
配置中心加密test
在rsatest-dev.yml添加以下内容
# {cipher}后的内容是待解密内容
profile: '{cipher}AQCjXw/kh/GoWo/rjBB48ISnT1A74hsXg1AaVZRuOfJN0BmoiKSqJYtY/ivwe6mCOXTT3rb6ttI+fmz1zUYkjyomlU2owwz6uG6nBMuMSQdiS2ExMFGPfZwovfYbg/0IijxQ2+UDr51nNzDtTXAvAo6DhlkoCGC1MEHcRyakOg7SD1hYwUoAxls5A2v+8934iKIP2tVd+YEzHkDMYG5BS1XkiXLBV6ctVRerdlNO5XYqR7l9k8KP4uehTkZDYnuF3oJpf3ZMDHnimk9KH0KKgds3CC63X4bPPb9Ytetx/CrdZlpK9/VwQqe6b4HIu7KLM4TfsWKKiyI6n2jZ+8gEuLigfRovFQjCkG+EvMmMJKNDll/x0q47T2S1+CX4JXNAMd0='
访问ip:port/rsatest-dev.yml
key-store配置正确情况下,可以看到profile: test
配置错误,会看到 invalid: profile
另一种配置文件加密 jasypt安全框架继承springboot,可以实现配置加载前解密。 具体操作:
#添加pom
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.16</version>
</dependency>
// 密钥
private static final String KEY = "1234567a?";
public static void main(String[] args) {
String ciphertext1 = encrypt("abcdefg"); // Wu11fsC0gpgSET5aU8GXUA==
String ciphertext2 = encrypt("abcdefg"); // ESXlHsVk2YM7mGcHy2ccGg==
System.out.println(ciphertext1);
System.out.println(ciphertext2);
String text1 = decrypt(ciphertext1);
String text2 = decrypt(ciphertext2);
System.out.println(text1); // abcdefg
System.out.println(text2); // abcdefg
}
/**
* 加密
*
* @param text 明文
* @return 密文
*/
public static String encrypt(String text) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword(KEY);
return encryptor.encrypt(text);
}
/**
* 解密
*
* @param ciphertext 密文
* @return 明文
*/
public static String decrypt(String ciphertext) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("e!Jd&ljyJ^e4I5oU");
return encryptor.decrypt(ciphertext);
配置加上
jasypt:
encryptor:
password: e!Jd&ljyJ^e4I5oU # 密钥
xxx:
password: ENC(jWgGELCkuxRuCI2Aqa6cF9VCxYpuKEZr)
ENC()里是待解密内容。
附录1:SpringCloud与Dubbo的比较
核心要素 | SpringCloud | Dubbo |
---|---|---|
服务注册中心(Service Register) | SpringCloud Netflix EureKa(单一) | Zookeeper/Redis |
服务调用方式 | REST API | RPC |
服务网关 | SpringCloud Netflix Zuul | 无 |
断路器(Breaker) | SpringCloud Netflix Hystrix | 未完善 |
分布式配置 | SpringCloud Config | 无 |
分布式跟踪系统 | SpringCloud Sleuth | 无 |
消息总线 | SpringCloud Bus | 无 |
数据流 | SpringCloud Stream(Redis/Rabbit/kafka信息微服务) | 无 |
批量任务 | SpringCloud Task | 无 |
占用带宽 | 比较多(HTTP协议传输) | 较少(二进制传输) |
开发依赖 | 接口协议约定比较自由且松散 | 发难度较大以及Jar包依赖问题 |