Spring cloud 整体架构图:
一、名词简述
1.Spring Cloud提供了多种服务发现的实现方式,支持得最好的是Eureka,其次是Consul,最次是Zookeeper。
2.application.yml:配置当前组件的 实例化参数,如端口号
3.bootstrap.yml:启动当前组件-->读取配置文件,注册中心信息设置
4.Hystrix:把服务调用统称为依赖调用, Hystrix通过命令模式封装依赖调用.
1)提供一种熔断器(CircuitBreaker)的机制:Hystrix可以通过设定的条件判断该封装的依赖调用是否可以正确调用,如果在一定时间内调用失败次数过多,则会熔断自身,使得相同的调用无法执行,待冷却之后重新再试。
1.1)如果run方法中发生异常,或者run方法运行时间过长(相当于超时),又或者线程池中任务队列已满,这时HystrixCommand会调用getFallback返回一个默认值,当然也可以在这进行特殊的出错处理,该函数是运行在web请求线程中。如果没有重写该方法,那run抛出的异常将被抛到web请求线程中。
如果某个依赖的run方法在短时间内发生异常或超时次数过多,此时Hystrix会发生熔断,该依赖新的HystrixCommand执行会直接调用getFallback返回,避免无效的调用浪费资源。当然在冷却一段时间后,新的依赖调用还是会通过run重试。
2)提供监控功能:可以直接使用其开源项目进行配置,就能实时的观察我们的服务调用情况,
2.1)Hystrix会实时、累加地记录所有关于HystrixCommand的执行信息,包括每秒执行多少请求多少成功,多少失败等
2.2) 会不断刷新以获取实时的监控数据。但是纯文字的输出可读性实在是太差,运维人员很难一眼看出系统当前的运行状态
2.3)可视化差:要配合dashboard一起使用,Hystrix Dashboard可以可视化查看实时监控数据
2.4)监控数据默认是保存在每个实例的内存中的,Spring Boot提供了多种方式,可以导入到Redis、TSDB以供日后分析使用
5.Ribbon:Netflix 发布的云中间层服务开源项目,其主要功能是提供客户侧软件负载均衡算法,将 Netflix 的中间层服务连接在一起
1)Ribbon 维护了一个服务器列表,如果服务器有宕机现象,Ribbon 能够自行将其剔除
2)如果该服务器故障排除,重新启动,或者增加新的负载节点,我们需要手工调用 Ribbon 的接口将其动态添加进 Ribbon 的服务器列表
3)Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等
4)Ribbon提供了多种策略,例如轮询、随机、根据响应时间加权等。
6.Eureka:一个 RESTful 服务,用来定位运行在 AWS 域(Region)中的中间层服务
1)Eureka 提供了 Application Service 客户端的自行注册的功能:解决了Ribbo手工添加服务的缺点
2)Eureka 的缓存机制能够防止大规模宕机带来的灾难性后果
3)在默认情况下,Eureka会将自己也作为客户端尝试注册,所以在单机模式下,我们需要禁止该行为,需要在application.yml中配置禁止自己注册
7.turbine:
1)类似于Struts,没有与JSP耦合
1.1)提供了大量可重用的组件,但是这些组件是离散的,由于它缺少文档,所以很难掌握完整的体系结构。
2)作用:把多个hystrix.stream的内容聚合为一个数据源供Dashboard展示。
注:分布式系统中,相同服务的节点经常需要部署,运维希望能把相同服务的节点状态以一个整体集群的形式展现出来,更好的把握整个系统的状态
8.Get和Post方法注解:Spring4.3 中引进
1)@GetMapping:组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写
a.如果想要不同也可以,只需在注解里指定这个名称即可:@GetMapping("/owners/{ownerId}")
b.一个方法可以有多个@PathVariable注解:@GetMapping("/owners/{ownerId}/pets/{petId}")
c.URI模版上使用正则表达式:
如:/hotels/{hotel}/*比/hotels/{hotel}/**更具体;
/foo/bar*比/foo/*更具体;
/hotels/{hotel}比/hotels/*更具体;
任意模式都比/**更具体;
2)@PostMapping:
3)@PutMapping
4)@DeleteMapping
5)@PatchMapping
9.Consul:用于实现分布式系统的服务发现与配置的 开源工具
1)“一站式”:内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)
2)使用简单:Consul使用Go语言编写,具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合
3)Consul下载页面:https://www.consul.io/downloads.html
10.Feign
1)是一个声明式的web service客户端,它使得编写web service客户端更为容易
2)以使用Feign注解或者JAX-RS注解,还支持热插拔的编码器和解码器
3)注解绑定"服务提供者"服务,如provider-user,还可以使用url参数指定一个URL
4)并整合了Ribbon和Eureka来为使用Feign时提供负载均衡。
11.熔断器
1)服务雪崩效应:有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况
2)实现快速失败,不是超时或等待:在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时产生
3)诊断:可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作
4)决策:记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。
5)如:Hystrix来实现熔断器
12.配置文件读取:
1)当服务发现是Eureka 及 Consul 时,Config Server支持与之联合使用;Zookeeper目前不支持与之联合使用。
2)本文的bootstrap.yml文件中的内容不能放到application.yml中,否则config部分无法被加载,因为config部分的配置先于application.yml被加载,
而bootstrap.yml中的配置会先于application.yml加载
3)Config Server可以支持本地存储、svn,而不使用git
13.API Gateway:如Zuul
1)可以统一向外部系统提供REST API
2)Zuul提供了动态路由、监控、回退、安全等功能。
二、各组件说明
1.route-gateway(8080):路由+负载
1)application:
@SpringBootApplication:spring-boot启动
@EnableZuulProxy:开启路由网关
2)配置文件:application.yml
3)packaging:jar
2.config-repository:配置文件
1)配置文件:如.properties
2)配置文件形式:
a..properties
b..yml
注:不支持txt,xml,
3)文件名格式:
${spring.application.name}-${spring.cloud.config.profile}
3.config-server(8040):配置中心+mq+注册中心 ,指定文件位置
1)application:
@SpringBootApplication:spring-boot启动
@
EnableConfigServer:开启配置中心服务端
@EnableDiscoveryClient:开启注册中心客户端
2)配置文件:application.yml
3)packaging:jar
4)部署时动态启动配置文件
a.spring.profiles指定了一个值(开发为dev,测试为test,生产为pro),这个值表示该段配置应该用在哪个profile里面
b.本地启动:设置调用哪个环境的profile,也就是第一段的spring.profiles.active=XXX;
c.部署到服务器的启动:我们正常打成jar包,发布是时候,采用:
--spring.cloud.config.profile=test或者pro 来控制加载哪个环境的配置,完整命令如下:
java -jar xxxxx.jar --spring.cloud.config.profile=test 表示加载测试环境的配置
java -jar xxxxx.jar --spring.cloud.config.profile=prd 表示加载生产环境的配置
4.consumer-beehive(8020):服务消费者+容错+监控+负载均衡
1)**Application:启动类
@SpringBootApplication:spring-boot启动
@EnableFeignClients:开启Feign注解
@EnableDiscoveryClient:
开启注册中心客户端
@EnableCircuitBreaker:开启容错+监控
@LoadBalanced:开启负载
注:方法上添加 @Bean
2)controller:
@RestController:@ResponseBody + @Controller
@RefreshScope:开启配置文件的参数自动刷新
3)service:
@FeignClient(name = "demo-provider-user", fallback = HystrixClientFallback.class)
方法上:@RequestMapping("/{id}")
fallback:容错处理
4)pom.xml:
<!-- 整合配置文件 config-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 整合 Feign注解-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--hystrix:通过服务隔离、熔断(也可以称为断路)、降级等手段控制依赖服务的延迟与失败 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<!--hystrix-dashboard 监控:用于与dashboard整合-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
5)配置文件:application.yml
6)packaging:jar
5.server-discovery(8761):注册中心
1)application:
@SpringBootApplication:spring-boot启动
@EnableEurekaServer:
开启注册中心服务端
2)配置文件:application.yml
a.可做高可用,见application-ha.yml
a1.分别启用两个注册中心,注册中心1和注册中心2的配置见application-ha.yml
a2.需要注册的各服务,需修改application.yml配置的defaultZone为多个,以,号分隔:如http://peer1:8761/eureka/,http://peer2:8762/eureka
a3.host配置文件 添加主机名:127.0.0.1 peer1 peer2
b.设置enabled为true后,可以用serviceId 代替url。
优点:
b1)这样依赖的服务,如注册中心,多一个注册中心或少一个,对注册的服务没有依赖性的改动
b2)只要serviceId名字相同的服务,都会被注册到这个serviceId,其他叫同名的serviceId也会被注册该服务
例:
eureka:
client:
serviceUrl:
#defaultZone: http://server-discovery1:8761/eureka/,http://server-discovery2:8762/eureka/
enabled: true # 默认false,设为true表示使用注册中心中的configserver配置而不自己配置uri
serviceId: server-discovery
3)packaging:jar
6.server-monitor(8050):监控中心,服务监控 列表+监控日志集群
注:hystrix后台日志形,dashboard可视化界面。 Hystrix+Dashboard 可可视化查看实时监控数据
1)application:
@
SpringBootApplication:spring-boot启动
@EnableHystrixDashboard:开启监控中心
@EnableTurbine:开启监控日志集群
2)配置文件:application.yml
3)packaging:jar
7.provider-user(8001):服务提供者
1)application:
@
SpringBootApplication:spring-boot启动
@EnableDiscoveryClient:开启注册中心客户端
2)controller:
@RestController:@ResponseBody + @Controller
3)service:@Repository
4)配置文件:application.yml
5)packaging:jar
注:注解说明:
1.@SpringBootApplication: springBoot注解,spring在springBoot基础之上来构建项目
2.@EnableDiscoveryClient: 开启eureka服务
三、启动项目 测试
1.启动注册中心:demo-discovery-eureka
1)http://discovery:8761/
注:配host:127.0.0.1 discovery
2.启动服务提供者:
1)看是否注册上
2)查看服务器信息:http://localhost:8000/instance-info
3)调用服务者:http://localhost:8000/user/1
3.启动服务消费者:
1)看是否注册上
2)查看服务器信息:http://localhost:8000/instance-info
3)调用消费者:http://localhost:8000/consumer-beehive/1
4.测负载:启动多个服务:
1)同一个服务,改端口,端署多套
2)启动ribbon
5.测hystrix容错:
1)启动服务提供者 和服务消费者
2)调用消费者方法:http://localhost:8011/ribbon/1
3)关闭"服务提供者",再调消费者方法。
6.测hystrix监控:
1)启动服务提供者 和服务消费者
2)调用消费者方法:http://localhost:8011/ribbon/1
注:不能省,不然所有接口都没有调用,看不到日志,只有ping
3)看监控日志:http://localhost:8011/hystrix.stream
缺点:可视化差,要配合dashboard一起使用
7.测hystrix+dashboard监控:
1)启动dashboard
2)查看dashboard监控平台:http://localhost:8030/hystrix.stream
2.1)输入框中输入http://localhost:8011/hystrix.stream
2.2)设置一个Title后,点击Monitor Stream按钮
注:Hystrix Dashboard Wiki上详细说明了图上每个指标的含义
3)将"服务提供者"(如provider-user)停止,然后重复访问多次http://localhost:8011/ribbon/1(20次以上),会发现断路器状态会变为开启。
8.测turbine集群
1)启动监控,集群
2)启动多个"服务消费者"
2.1)多个"服务消费者" 需要配置不同的主机名,并将preferIpAddress设为false或者不设置,否则将会造成在单个主机上测试,Turbine只显示一个图表的情况
3)访问:http://localhost:8011/ribbon/1,调用ribbon接口
4)访问:http://localhost:8022/feign/1,调用feign接口
5)访问:http://localhost:8031/turbine.stream,可查看到和Hystrix监控类似的内容
注:比hystrix清晰简洁,是整理好的json返回。
9.测试配置内容 热更新
1)启动客户端配置(或消费端加了读配置的) 和 config-server
注:配host:127.0.0.1 config-server
2)访问:http://localhost:8041/hello
3)修改dev.properties的值,在命令行输入:curl -X POST http://localhost:8041/refresh
4)再次访问 看是否刷新
10.测路由网关
1)启动注册中心,服务提供者,服务消费者
2)访问:http://localhost:8011/ribbon/1
3)开启路由:启动路由
注:配host:127.0.0.1 gateway
4)再访问:http://localhost:8011/ribbon/1 报错
四、注意事项
1.创建项目时先写pom.xml,将依赖包导入
2.Eureka:类似dubbo,只能提供显示 "服务提供者"和"服务消费者",不能具体显示其详情。
3.load-balance:负载均衡,如ribbon,做在"服务消费者"端
五、组件命名规范
1.组件命名
1)server-discovery:服务发现,即注册中心,如Eureka
2)server-monitor:服务监控,即监控中心,
a.如hystrix+dashboard
b.hystrix+turbine:集群监控
3)provider-提供者名:服务提供者
4)consumer-消费者名:服务消费者
a.添加负载(如:ribbon)
b.添加feign注解
c.添加容错:即熔断器(如:Hystrix)
c1.Hystrix提供容错:hystrix
c1.Hystrix提供监控:hystirx-stream
d.添加客户端配置:config-client
5)config-server:服务端配置,做配置刷新,类似mq
6)config-repository:配置文件存放
7)route-gateway:路由网关
2.组件内代码结构命名
工程结构规则:
• root package命名:com.company.project
注:应用主类Application.java置于root package
• 配置:com.example.myproject.config
• 实体层:com.example.myproject.modle
• 持久层:com.example.myproject.dao
• 服务接口:com.example.myproject.service
• 服务实现:com.example.myproject.service.impl
• Web层:com.example.myproject.controller
• 常量&枚举:com.example.myproject.constant
• 视图:com.example.myproject.view
• 工具:com.example.myproject.utils
• SQL Mapping:Resources\mapper\xxx.xml
例子:
com
+- example
+- myproject
+- Application.java
+- config
| +- SwaggerConfig.java
+- constant
| +- SexEnum.java
+- model
| +- Customer.java
+- dao
| +- CustomerDao.java
+- service
| +- CustomerService.java
| +-impl
| +- CustomerServiceImpl.java
+- controller
| +- CustomerController.java
+- view
| +- CustomerView.java
+- utils
| +- FileUtil.java
|