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

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


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配置
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容