Spring Cloud的微服务框架中涉及到配置管理、服务治理、路由管理、微代理、控制总线等.是一个成熟的兼容的分布式框架.
- Spring Cloud Config: 配置中心,可以从git直接配置配置文件等存储信息,可以使用配置中心实现结合profile标签很容易实现生产和测试的隔离.
- Spring Cloud Netflix: Spring Cloud的核心组件
- Eureka: 服务治理组件,包含了服务的发现和注册机制
- Hystrix: 容错管理组件,包含了服务的快速熔断,实现了断路器模式。
- Ribbon: 负载均衡组件
- Feign: 基于Ribbon和Hystrix的声明式服务调用组件
- Zuul: 网关组件 提供访问过滤等功能(被gateway替换掉了)
- Archaius: 外部化配置组件
- Spring Cloud Bus: 事件、消息总线,用于提供集群之间的信息传递和状态变化或者事件。
- Spring Cloud Cluster: 基于zk、redis、Hazelcast、Consul的集群之间的选举算法的实现
- Spring Cloud Consul: 服务发现与配置管理工具
- Spring Cloud Stream: 通过redis、kafka、rabbit等通讯工具实现消费的微服务,通过简单的配置声明即可使用
- Spring Cloud Security: 安全组件 提供对zuul代理的oauth2请求的过滤
- Spring Cloud Sleuth: SpringCloud的分布式的服务追踪,可以整合zipkin
- Spring Cloud Zookeeper: 基于Zookeeper的服务发现和配置管理组件
所有组件在springCloud官网: 点击这里
Spring Cloud的历代版本更迭
注意:使用springboot 1.3x 版本相应的可以匹配Brixton.SR7 如果要使用boot 1.4x 相应要使用Camden
Spring boot使用的一些小tips
要使用spring cloud的话那么一定离不开spring boot
- yml配置文件要优先于properties文件加载
- yml配置文件无法使用@PropertySource来加载
- 配置文件中可以使用
${random.int}、${random.long}、${random.value}、${random.int(10)}、${random.int[10,20]}来产生随机穿,通常用于秘钥的生成
- spring boot 加载顺序
1.命令行传入的参数
2.SPRING_APPLICATION_JSON中的属性,它是以JSON格式配置在系统环境变量中的
3.java:comp/env中的JNDI属性
4.java的系统属性,通过System.getProperties()来获取
5.操作系统的环境变量
6.通过random.*配置的随机属性
7.位于jar包之外,针对不同的{profile}环境的配置文件内容application-dev.yml
8.位于jar包之内,针对不同的{profile}环境的配置文件内容application-dev.yml
9.位于jar包之内,配置文件内容 application.yml
10.位于jar包之外,配置文件内容application.yml
11.在@Configuration注解修改的类,通过@PropertySource注解定义的属性
12.应用默认属性,使用SpringApplication.setDefaultProperties定义内容
Spring boot的原生监控:
在阿里巴巴的徐雷大神那里听到这个名词,是我初识actuator监控这个springboot提供的监控组件.该组件将一些原生的端点分为应用配置类,操作类,度量运行状态类.
- 应用配置类
1./autoconfig: 会获取到应用的自动配置信息
2./env:获取所有的可用的环境属性
3./mappings:所有的mvc控制器映射报告
4./info:返回应用的自定义信息 - 度量运行状态类
1./metrics:返回当前应用的内存、线程、垃圾回收信息等
2./healh:各类的健康指标信息,可以实现自定义的健康监控器,实现HealthIndicator接口,并且实现health和check接口即可
3./dump:暴露运行中线程信息
4./trace:返回基本的http的追踪信息,只保存最近的100条信息在内存中 - 操作控制类(最好不要将该端口暴露给他人,或者结合security给定权限)
1./shutdown:可以通过endpoints.shutdown.enabled = true开启
类似的监控和调试软件,目前我觉得最好用的是阿里巴巴开源的arthas
他有类的热替换,以及线程的信息dump和trace的追踪并且分析每一步的执行时间等等功能
arthas点击这里
服务治理组件 eureka
对于一个微服务的应用来说,服务的治理是不可或缺的,对于一个微服务的项目,可能在服务多的时候无法有效的管理,那么就无法保证项目高效稳定的运行.
- 服务的注册:服务注册时使用的是主机的端口号、版本号、通信协议等,注册中心按照服务名对这些信息进行分类,并且建立起对应关系,相当于一个二维的表格
- 服务的发现:当使用eureka服务治理框架的时候,我们只需要给出服务名,就可以通过注册时产生的对应关系找到服务的地址列表,会通过我们的负载均衡策略进行调用.
客户端与服务端的概念:
服务端:我们的注册中心就是eureka的服务端,支持集群配置,但是如果集群中有分片故障,eureka就会进入自我保护模式,但是如果以集群部署,准许提供服务的注册和发现,当有故障的分片恢复时,会自动同步服务。但是其同步服务状态策略为异步,在某个时间点内,服务的状态可能不同。
客户端:通过注解和配置嵌入在代码中,客户端想注册中心注册自己提供的服务并且周期性的发送心跳包,保证服务的可用,同时也可以通过注册中心刷新我们更改的状态,改变其自身提供服务的状态。
接下来也随手搭了一个eureka的聚合框架,既然要做就做一个聚合工程,为后期做其他项目做一个准备,目前的结构如下图
接下来是一个eureka所需要的maven依赖和yml的配置
maven依赖如下,只截取了dependencies部分
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
</dependency>
</dependencies>
yml配置如下
spring:
profiles:
#激活的标签
active: dev
application:
name :maturecloud-eureka
server:
#该项目占用的端口
port: 8761
eureka:
server:
#不进入自我保护模式<不注销服务,在生产环境请替换>
enable-self-preservation: false
#清楚失效的服务的时间,默认时间也是60000,源码中有
eviction-interval-timer-in-ms: 60000
instance:
hostname: localhost
client:
#服务端同时也是一个客户端,本身不注册
register-with-eureka: false
#不去拉取注册的服务,只管理服务
fetch-registry: false
service-url:
#这里其实是一个map,设置了serviceUrl,如果想自定义我们可以在client下自定义region,再进行设置(下面给示例) 因为这里使用了security所以要提供账号密码
defaultZone: http://root:root@${eureka.instance.hostname}:${server.port}/eureka
#为保证安全,集成了security框架,这里设置账号密码
security:
basic:
enabled: true
user:
name: root
password: root
下图可理解为集群状态下,向不同的zones注册
spring:
profiles:
active: dev
application:
name: "@pom.artifactId@"
server:
port: 8761
eureka:
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 60000
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
zz: http://${eureka.instance.hostname}:${server.port}/zz
zy: http://${eureka.instance.hostname}:${server.port}/zy
region: zzy
availability-zones:
zzy: zz,zy
security:
basic:
enabled: true
user:
name: root
password: root
eureka用在分布式项目中可以搭建一个高可用的注册中心,保证高可用,在某个结点宕机时不影响使用。
我们在这里搭建一个双节点的注册中心为例。
为此我创建了两个环境的eureka来单独启动,并让他们相互注册,那么就会在对方的地址注册分片,具体的流程如下。
第一个结点的配置如下
spring:
application:
name: maturecloud-eureka
server:
port: 8761
eureka:
server:
eviction-interval-timer-in-ms: 60000
instance:
hostname: eureka-master
client:
service-url:
defaultZone: http://root:root@eureka-spare:8762/eureka
第二个结点的配置如下
spring:
application:
name: maturecloud-eureka
server:
port: 8762
eureka:
server:
eviction-interval-timer-in-ms: 60000
instance:
hostname: eureka-spare
client:
service-url:
defaultZone: http://root:root@eureka-master:8761/eureka
另外使用idea配置两个server的启动
启动的激活的条件不同,那么使用的配置文件就不同
--spring.profiles.active=spare 使用application-spare.yml
--spring.profiles.active=master 使用application-master.yml
注意:这里如果要建立一个高可用的服务中心,那么一定要将我们单点注册的配置更改掉,如下可将配置改为true,或者不写(不配置默认为true)。
还有一点,如果有多个配置文件,如application.yml application-spare.yml application-master.yml 那么有一些配置是会被application.yml中的配置覆盖掉的
register-with-eureka: true
fetch-registry: true
搭建出来的每个结点是向其他结点注册的,这样就可以同步其他结点的状态与服务,不用担心单一结点挂掉导致的宕机,保证了高可用性。
如果我们想要让其他服务,我们需要对服务的配置文件进行一些修改。
我们需要对两个服务中心进行注册,如果其中一个服务中心挂掉不会影响我们服务的调用。
server:
port: 8099
spring:
application:
name: maturecloud-login
eureka:
client:
service-url:
defaultZone: http://root:root@eureka-master:8761/eureka/,http://root:root@eureka-spare:8762/eureka/
8761,8762效果图和下图一致
以下是关于eureka.client的配置说明