最近在系统性的对Spring Cloud的基础配置进行学习。
为了加深对Spring Could的掌握,也为了将记忆留存,遂将Spring Cloud的相关配置进行梳理,并整理成文。
本系列文章只对Spring Cloud的基础配置进行记录,关于概念说明与源码解析请自行探索。
如果文章中有任何问题,请各位道友不吝赐教,共同进步。
在这里,对两个至关重要的版本(Spring Boot和Spring Cloud)进行统一说明:
- Spring Boot版本:
1.5.2.RELEASE
- Spring Cloud版本:
Dalston.SR1
在学习过程中,为了模拟服务高可用配置,需要在IDEA中对同一服务启动多个实例。
关于如何实现这种多实例启动,可以参考:Spring-Cloud笔记01:IDEA中同一个项目启动多个实例
通过Spring Cloud构建微服务的过程中,涉及多个服务,这些服务以Maven的多模块项目构建。
关于如何构建多模块的Maven项目,可以参考:Spring-Cloud笔记02:IDEA中构建多模块的Maven项目。
- Spring-Cloud笔记03:服务注册中心Eureka Server的简单配置、访问控制配置以及高可用配置
- 1.简单的服务注册中心Eureka Server与服务提供者Eureka Client
- 2.高可用的服务注册中心Eureka Server
- 3.安全认证的服务注册中心Eureka Server
- 服务消费Feign
- 1.负载均衡的服务消费方式Feign
- 服务降级Hystrix
- 1.断路器Hystrix
- 2.断路器仪表盘Hystrix Dashboard
- 3.断路器仪表盘聚合Turbine
- 路由网关Zuul
- 1.路由转发Zuul
- 2.过滤器ZuulFilter
- 配置中心Config
- 1.基础的配置中心Config Server、配置客户端Config Client与手动刷新refresh
- 2.高可用的配置中心Config Server
- 3.配置中心的自动刷新Bus
- 服务链路追踪Sleuth
- 1.HTTP模式的服务链路追踪
- 2.Stream模式的服务链路追踪
- 版本序列Release Trains:为了方便管理Spring Could中各种各样的依赖,制定了 依赖集合,即版本序列。
- 版本序列主要包含Spring Boot和Spring Cloud的版本,具体参考http://projects.spring.io/spring-cloud/
- 我的版本号:Spring Cloud:Dalston.RELEASE,Spring Boot:1.5.2.RELEASE
- cannot resolve symbol SpringBootApplication:找不到jar包,造成原因:版本序列不匹配 如果Spring Cloud:Dalston.RELEASE,Spring Boot:1.5.2.RELEASE,则不要使用各组件的最新版本。 如Eureka要使用spring-cloud-starter-eureka-server,而不是spring-cloud-starter-netflix-eureka-client
- 创建项目顺序:
- 创建一个Maven项目(类型无所谓,删除src目录)
- 右键项目->New->Module->Spring Initializer->选择组件->...
[TOC]
Eureka [juəˈri:kə] 我发现了,服务注册中心,服务提供者
- 组件:web、eureka
- @EnableEurekaServer注解使其成为服务注册中心Eureka Server
- application.yml配置(不能有中文,这里是注释)
#服务 server: #端口号 port: 8761 #服务注册配置 eureka: #实例 instance: #主机域名 hostname: localhost #Eureka Server也是一个Eureka Client,需要制定Server client: #是否通过eureka注册 register-with-eureka: false #是否获取注册 fetch-registry: false #注册中心地址 service-url: default-zone: http://${eureka.instance.hostname}:${server.port}/eureka/
- Eureka Server 地址:http://localhost:8761/
- 在yml文件中用---来区分多个文件,减少配置文件个数
- 多个实例共用一个服务名:spring.application.name=eureka-ha
- 每个实例都需要注册到其他的注册中心:
server: port: 8771 spring: profiles: peer1 application: name: eureka-ha eureka: instance: hostname: peer1 client: serviceUrl: defaultZone: http://peer2:8772/eureka/,http://peer3:8773/eureka/
- 在IDEA中,分别通过设置不同的Program arguments参数为--spring.profiles.active=peer1、 --spring.profiles.active=peer2、--spring.profiles.active=peer3启动这三个注册中心服务。
- Eureka Server与Eureka Client的配置文件全都采用驼峰命名
- 在Eureka Server中添加依赖spring-boot-starter-security
- 修改Eureka Server的配置,添加认证配置security
security:
basic:
enabled: true
user:
name: admin
password: admin
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/
- 修改Eureka Client配置,修改defaultZone=http://usr:pwd@host:ip/eureka/
- Eureka Server与Eureka Client的配置文件全都采用驼峰命名
- 组件:web、eureka
- @EnableEurekaClient注解表示当前服务是一个服务提供者
- 警告信息:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
- 本机测试时,server收到的心跳次数不足,认为服务挂掉了。
- 解决方法: server.renewal-percent-threshold: 0.49
- 测试地址:http://localhost:8762/hi?name=David
Feign [feɪn] 伪装,伪Http客户端,负载均衡,可插拔注解
- 组件:web、eureka、feign
- @EnableFeignClients注解表示当前服务开启了Feign功能
- @EnableDiscoveryClient表示当前服务是一个消息提供者,比@EnableEurekaClient 更通用,可以适用于其他服务注册中心;@EnableEurekaClient只适用于Eureka注册中心
- Feign自动做了负载均衡
Hystrix [hɪst'rɪks] 豪猪,防御机制,防止雪崩,降级,当服务不可用时的默认方法
- Feign是自带断路器Hystrix的,配置开启
feign: hystrix: enabled: true
- 定义Feign客户端接口ScheduleServiceHi的实现类,在其中编写熔断方法
- 在Feign客户端接口ScheduleServiceHi接口中,指定熔断时fallback(后退)的类
- jar包引入:hystrix、hystrix-dashboard
- 在启动类添加@EnableHystrix、@EnableHystrixDashboard
- 通过http://localhost:8765/hystrix.stream 进行服务断路情况流式监控
- 通过http://localhost:8765/hystrix 进行服务断路情况仪表盘监控
- 仪表盘参数:http://localhost:8765/hystrix.stream、2000、SERVICE-FEIGN
- 修改application.yml,添加注册认证,并修改配置为驼峰方式
[ˈtɜ:baɪn] 涡轮机;将若干服务的监测数据聚合起来
- 注意主类的注解顺序
- 引入jar包:starter-turbine、netflix-turbine
- 引入注解:@EnableEurekaClient、@EnableTurbine
- application.yml配置:
turbine:
aggregator:
clusterConfig: default # 指定聚合哪些集群,多个使用","分割,默认为default。可使用http://.../turbine.stream?cluster={clusterConfig之一}访问
appConfig: service-feign,service-feign-2 # 配置Eureka中的serviceId列表,表明监控哪些服务
clusterNameExpression: new String("default")
# 1. clusterNameExpression指定集群名称,默认表达式appName;此时:turbine.aggregator.clusterConfig需要配置想要监控的应用名称
# 2. 当clusterNameExpression: default时,turbine.aggregator.clusterConfig可以不写,因为默认就是default
# 3. 当clusterNameExpression: metadata['cluster']时,假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,
# 则需要配置,同时turbine.aggregator.clusterConfig: ABC
- 驼峰配置
- 流访问:http://localhost:8969/turbine.stream
- turbine仪表盘访问http://localhost:8865/hystrix ,录入http://localhost:8969/turbine.stream、 2000、[随便],点击Monitor Stream
Zuul 负载均衡,路由转发,过滤器
- 组件:web、eureka、zuul
- @EnableEurekaClient注解开启服务注册
- @EnableZuulProxy注解开启网关代理
- @需要在application.yml中设置失效时间,以解决Zuul导致Hystrix熔断失效的问题
zuul: socket-timeout-millis: 60000 connect-timeout-millis: 60000 routes: api-a: path: /api-a/** service-id: service-feign ribbon: ReadTimeout: 60000 ConnectTimeout: 60000 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 60000
- 自定义过滤器继承自ZuulFilter,需重写filterType、filterOrder、shouldFilter和run方法,注解@Componet
- filterType表示过滤器类型,pre(路由转发之前),routing(路由之时),post(路由之后),error(发生出错之时)
- filterOrder表示过滤器顺序,shouldFilter表示过滤规则,run表示过滤逻辑
Config,配置
- Config Server相关jar包是spring-cloud-config-server
- 注解@EnableConfigServer表示此服务是配置中心
- 注解@EnableEurekaClient进行服务注册
- 配置说明(这里的注释只是说明,实际不能用中文)
spring: cloud: config: server: git: # 配置文件所在github项目路径 uri: https://github.com/hanchao5272/spring-cloud-demo/ # 配置文件所在目录路径 search-paths: config-repo # username/password # 配置文件所在github项目的分支 label: master
- 读取配置文件的路径规则
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
- 读取配置文件举例:配置文件名为config-client-dev.yml,则application=config-client, profile=dev,label=master。最终读取URL:http://localhost:8888/config-client/dev
- Config Client相关jar包是spring-cloud-starter-config
- 注解@EnableEurekaClient进行服务注册
- bootstrap.yml要早于application.yml加载,所以将config相关配置写在bootstrap.yml
- 配置说明
spring: cloud: config: # 配置文件所在github项目的分支 label: master # 配置文件环境:dev(开发)/test(测试)/pro(生产),,对应{profile} profile: dev # 配置中心服务地址 uri: http://localhost:8888/ # 配置名,对应{application} name: config-client
- Config-Client读取Config-Server的配置,而Config-Server的配置来自于github
- 要开启手动刷新,需要引入jar包:actuator ['æktʃʊeɪtə] 执行者
- 要开启手动刷新,需要在引用配置的相关类上,添加注解@@RefreshScope
- Config Server、Config Client都需要通过@EnableEurekaClient注册服务
- Config Server通过修改端口号开启多个服务,形成服务集群
- Config Client修改spring.cloud.config的配置方式
spring: cloud: config: label: master profile: dev uri: http://localhost:8888/ ============>>>>>>>>>================== spring: cloud: config: label: master profile: dev discovery: enabled: true serviceId: config-server
- 刷新时无需认证:management.security.enabled=false
- 注意将配置写在bootstrap.yml,优先加载
- Config Client添加bus-amqp依赖
- Config Client添加rabbitmq相关配置
# rabbitmq相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
- 刷新时,随意对某个Client的服务进行POST操作:/bus/refresh,则其他Client同时被刷新
- 缺陷:未被微服务职责单一性,Client应该承担业务,而非配置刷新工作
- 缺陷:破坏了个微服务的对等性,被刷新的微服务是特殊的
- 缺陷:有一定局限性,如果被刷新的微服务发生变化,则需要另行配置
- 改进:对Config Server实施刷新
- 在上个版本的基础上,对Config Server进行同样的配置
- 刷新时,对Config Server进行POST:/bus/refresh
- 此种版本下,Client无需配置Rabbitmq相关信息,因为无需向rabbitmq发送消息,但是需要有bus-amqp依赖
- 刷新时,关闭安全验证:management.security.enabled=false
- 开启消息跟踪spring.cloud.bus.trace.enabled=true,可以 通过[GET]http://localhost:8887/trace 查看刷新记录
- 局部刷新:/bus/refresh?destination=customers:8000,其中, customers:8000指的是各个微服务的ApplicationContext ID。
sleuth [slu:θ] 侦探,分析服务间的调用关系
- Sleuth Server依赖:zipkin-server/zipkin-autoconfigure-ui
- @EnableZipkinServer注解表示该服务作为链路追踪中心
- @EnableEurekaClient注解表示该服务进行注册
- Sleuth Client依赖:spring-cloud-starter-zipkin/zipkin-server/zipkin-autoconfigure-ui
- @EnableEurekaClient注解表示该服务进行注册
- zipkin client配置
spring #Zipkin Server服务地址 zipkin: base-url: http://localhost:9411 #采样比例(默认0.1) sleuth: sampler: percentage: 1
- Zipkin Client向Zipkin-Server程序发送数据使用的是http的方式通信,每次发送的时候涉及到连接和发送过程,对原有业务接口调用产生较大影响。
- 当我们的zipkin-server程序关闭或者重启过程中,因为客户端收集信息的发送采用http的方式会被丢失。
合并报错
git merge origin/master --allow-unrelated-histories