SpringCloud学习

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

image.png

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部分

 
        
            org.springframework.cloud
            spring-cloud-starter-eureka-server
        
        
            org.springframework.boot
            spring-boot-starter-security
        
        
            net.logstash.logback
            logstash-logback-encoder
        
    

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的启动


idea配置

启动的激活的条件不同,那么使用的配置文件就不同
--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的配置说明


eureka.client配置

你可能感兴趣的:(SpringCloud学习)