Spring Cloud:微服务工具包,为开发者提供了在分布式系统的配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌,全局锁,领导选举,分布式 会话,群集状态等开发工具包。
Spring Boot:旨在简化创建产品级的 Spring 应用和服务,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用微服务功能,可以和spring cloud联合部署。
Spring Cloud专注于为经典用例和扩展机制提供良好的开箱即用
- 分布式/版本配置
- 服务注册与发现
- 路由选择
- 服务调用
- 负载均衡
- 熔断机制
- 全局锁
- 领导人选举和集群状态
- 分布式消息
- Spring Cloud Config:配置管理开发工具包,可以让你把配置放到远程服务器,目前支持本地存储、Git以及Subversion。
- Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。
- Spring Cloud Netflix:针对多种Netflix组件提供的开发工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
- Netflix Eureka:云端负载均衡,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。
- Netflix Hystrix:容错管理工具,旨在通过控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
- Netflix Zuul:边缘服务工具,是提供动态路由,监控,弹性,安全等的边缘服务。
- Netflix Archaius:配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
- Spring Cloud for Cloud Foundry:通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。
- Spring Cloud Sleuth:日志收集工具包,封装了Dapper,Zipkin和HTrace操作。
- Spring Cloud Data Flow:大数据操作工具,通过命令行方式操作数据流。
- Spring Cloud Security:安全工具包,为你的应用程序添加安全控制,主要是指OAuth2。
- Spring Cloud Consul:封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。
- Spring Cloud Zookeeper:操作Zookeeper的工具包,用于使用zookeeper方式的服务注册和发现。
- Spring Cloud Stream:数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。
- Spring Cloud CLI:基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。
1、Codebase:从一个代码库部署到多个环境。
2、Dependencies:使用显式的声明隔离依赖,即模块单独运行,并可以显式管理依赖。
3、Config:在系统外部存储配置信息。
4、Backing Services:把支持性服务看做是资源,支持性服务包括数据库、消息队列、缓冲服务器等。
5、Build, release, run:严格的划分编译、构建、运行阶段,每个阶段由工具进行管理。
6、Processes:应用作为无状态执行。
7、Port binding:经由端口绑定导出服务,优先选择 HTTP API 作为通用的集成框架。
8、Concurrency:并发性使用水平扩展实现,对于web就是水平扩展web应用实现。
9、Disposability:服务可处置性,任何服务可以随意终止或启动。
10、Dev/prod parity:开发和生产环境保持高度一致,一键式部署。
11、Logs:将日志看做是事件流来管理,所有参与的服务均使用该方式处理日志。
12、Admin processes:管理任务作为一次性的过程运行(使用脚本管理服务启动和停止)。
Spring Cloud是一个拥有诸多子项目的大型综合项目,原则上其子项目也都维护着自己的发布版本号。那么每一个Spring Cloud的版本都会包含不同的子项目版本,为了要管理每个版本的子项目清单,避免版本名与子项目的发布号混淆,所以没有采用版本号的方式,而是通过命名的方式。
这些版本名字采用了伦敦地铁站的名字,根据字母表的顺序来对应版本时间顺序,比如:最早的Release版本:Angel,第二个Release版本:Brixton,以此类推……
经过上面的解释,不难猜出,之前所提到的Angel.SR6,Brixton.SR5中的SR6、SR5就是版本号了。
当一个版本的Spring Cloud项目的发布内容积累到临界点或者一个严重bug解决可用后,就会发布一个“service releases”版本,简称SRX版本,其中X是一个递增数字。
通过下表,我们可以快速查阅当前各版本所包含的子项目,以及各子项目的版本号,通过此来决定需要选择怎么样的版本。
Component | Angel.SR6 | Brixton.SR5 | Camden.M1 | Camden.BUILD-SNAPSHOT |
---|---|---|---|---|
spring-cloud-aws | 1.0.4.RELEASE | 1.1.1.RELEASE | 1.1.1.RELEASE | 1.1.2.BUILD-SNAPSHOT |
spring-cloud-bus | 1.0.3.RELEASE | 1.1.1.RELEASE | 1.2.0.M1 | 1.2.0.BUILD-SNAPSHOT |
spring-cloud-cli | 1.0.6.RELEASE | 1.1.5.RELEASE | 1.2.0.M1 | 1.2.0.BUILD-SNAPSHOT |
spring-cloud-commons | 1.0.5.RELEASE | 1.1.1.RELEASE | 1.1.1.RELEASE | 1.1.2.BUILD-SNAPSHOT |
spring-cloud-contract | 1.0.0.M2 | 1.0.0.BUILD-SNAPSHOT | ||
spring-cloud-config | 1.0.4.RELEASE | 1.1.3.RELEASE | 1.2.0.M1 | 1.2.0.BUILD-SNAPSHOT |
spring-cloud-netflix | 1.0.7.RELEASE | 1.1.5.RELEASE | 1.2.0.M1 | 1.2.0.BUILD-SNAPSHOT |
spring-cloud-security | 1.0.3.RELEASE | 1.1.2.RELEASE | 1.1.2.RELEASE | 1.1.3.BUILD-SNAPSHOT |
spring-cloud-starters | 1.0.6.RELEASE | |||
spring-cloud-cloudfoundry | 1.0.0.RELEASE | 1.0.0.RELEASE | 1.0.1.BUILD-SNAPSHOT | |
spring-cloud-cluster | 1.0.1.RELEASE | |||
spring-cloud-consul | 1.0.2.RELEASE | 1.1.0.M1 | 1.1.0.BUILD-SNAPSHOT | |
spring-cloud-sleuth | 1.0.6.RELEASE | 1.0.6.RELEASE | 1.0.7.BUILD-SNAPSHOT | |
spring-cloud-stream | 1.0.2.RELEASE | Brooklyn.M1 | Brooklyn.BUILD-SNAPSHOT | |
spring-cloud-zookeeper | 1.0.2.RELEASE | 1.0.2.RELEASE | 1.0.3.BUILD-SNAPSHOT | |
spring-boot | 1.2.8.RELEASE | 1.3.7.RELEASE | 1.4.0.RELEASE | 1.4.0.RELEASE |
spring-cloud-task | 1.0.2.RELEASE | 1.0.2.RELEASE | 1.0.3.BUILD-SNAPSHOT |
最初的Angel版本相对来说拥有的子项目较少,Brixton、Camden则拥有更全的子项目,所提供跟多的组件支持。Brixton发布的子项目更稳定,Camden则更具前瞻性
主要有两种方式:通过HTTP发送shutdown信号,或者通过service stop的方式
该方式主要依赖Spring Boot Actuator的endpoint特性
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
开启shutdown endpoint
#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false
需要停止服务时,post请求host:port/shutdown即可:
curl -X POST host:port/shutdown
正式使用时,必须对该请求进行必要的安全设置,比如借助spring-boot-starter-security进行身份认证:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
开启安全验证
#开启shutdown的安全验证
endpoints.shutdown.sensitive=true
#验证用户名
security.user.name=admin
#验证密码
security.user.password=secret
#角色
management.security.role=SUPERUSER
#指定shutdown endpoint的路径
endpoints.shutdown.path=/stop
#也可以统一指定所有endpoints的路径`management.context-path=/manage`
#指定管理端口和IP
management.port=8081
management.address=127.0.0.1
该方式主要借助官方的spring-boot-maven-plugin创建"Fully executable" jar ,这中jar包内置一个shell脚本,可以方便的将该应用设置为Unix/Linux的系统服务(init.d service),官方对该功能在CentOS和Ubuntu进行了测试,对于OS X和FreeBSD,可能需要自定义。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
sudo ln -s /var/app/user.jar /etc/init.d/user
chmod u+x user.jar
sudo service user start|stop
默认PID文件路径:/var/run/user/user.pid
默认日志文件路径:/var/log/user.log
可以使用自定义的.conf文件来变更默认配置
在jar包相同路径下创建一个与.jar的名称相同conf文件,如user.conf
JAVA_HOME=/usr/local/jdk
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log
作为应用服务,安全性是一个不能忽略的问题,基础设置参考:
-
为服务创建一个独立的用户,同时最好将该用户的shell绑定为/usr/sbin/nologin
-
赋予最小范围权限:chmod 500 user.jar
-
阻止修改:sudo chattr +i user.jar
-
设置权限所属:
chmod 400 user.conf chown root:root user.conf
-
实现接口:DisposableBean, ExitCodeGenerator
-
使用注解@PreDestroy
spring cloud中文社区