SpringCloud
分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,速成微服务全家桶
Spring cloud和spring boot的区别:spring boot是一种框架技术,spring cloud是一种分布式系统的解决方案(集成各种技术)
Cloud技术集成
Springboot和springCloud的版本选择
依赖关系:start.spring.io/actuator(json格式串)
本次开发版本
Dependencies he dependencyManagement的区别
dependencyManagement放在父类的pom中,设置后,子项目引入依赖不需要指定版本号,默认和父类版本号相同
Postman:模拟浏览器发送请求软件
微服务项目之间的调用:restTemplate (spring内嵌)
restTemplate:包含请求对象,请求地址,
restTemplate.postForObject(ip,url,obj,*.class)//写操作
restTemplate.getForObject(ip,url,obj,*.class)//读操作
eureka:两个组件
1:eureka server提供服务注册服务(@EnableEurekaServer)
2:eurekaClient通过注册中心进行访问(@EnableEurekaClient)
Eureka集群:互相注册,相互守望
Yml文件:eureka集群间互相注册
Service-url:
defaultZone:需要守望的其他集群url,多个使用,隔开
读取application.xml 中的内容
如server
Port:8081
@value({server.port})
Private String port;
当服务消费者访问服务提供者时,不直接访问服务提供者,而是访问eureka集群, 此时 服务消费者不关心服务提供者的ip和端口号,只认服务提供者在eureka 集群上注册的服务名(多个服务提供者注册相同服务名)
自我保护机制:当某一时刻微服务不可用,eureka不会立即清理,依旧会对该服务进 行保存一定时间(默认开启)--AP的原理在此
Server:
enable-self-preservation=true;//默认为true
Eviction-interval-time:2000;//默认90s
微服务和zookeeper打交道
Main启动类:@EnableDiscoverClient
Zookeeper是将服务作为临时节点,如果多次发送心跳没有回应,就会把微服务从给自己的节点中T掉
作用:负载均衡+restTemplate服务调用
Ribbon:@LoadBalanced
默认轮训负载机制
Nginx为服务端负载均衡,承接所有客户端请求后做请求派发
Ribbon为本地负载均衡,在调用服务器接口的时候会在注册中心上获取服务列表,缓存到JVM本地,从而在本地实现RPC远程服务调用技术(消费端获取注册中心<euraka>服务列表)
类似RMI调用(客户端创建和服务端相同的接口,并用Feign注释)
内置Ribbon包
微服务调用接口+@FeignClient
客户端注释:
启动类:@EnableFeignClient //激活feign
Service:@FeignClient(value=”要调用的微服务名称”)//调用
Feigin自带Ribbon包,所以自带负载均衡功能
超时设置:比如A调用B微服务,B服务需要处理3s,但是A等1S就会报超时错误, 不再等待(openfeign-ribbon客户端默认等待时间),此时需要额外设定。
Yml文件ribbon: ReadTimeout:5000 / ConnctTimeout:5000
日志打印功能:
Openfeign自带,用来跟踪feign的调用跟踪
·Yml文件配置: logging:level:com.xxxx.xxService:debug//打印类型
·新建FeignConfig类指定打印级别
1.类注释 @Configuration
2.@Bean
Logger.level feignLoggerLevel(){
Return Logger.Level.FULL;
}
服务降级:当对方系统不可用的时候,需要一个妥协的返回方法(比如返回默认值)
服务熔断:当对方系统没办法用之后,直接拒绝访问,调用服务降级
当失败率达到设定值的时候,认为服务器故障,启动熔断机制,当再有 请求时,直接调用服务降级后的方法,不论请求是否正常(隔一段时间会 监测一次,如果成功率上升,再恢复调用链)
熔断类型:熔断,半熔断(部分请求进入,测试服务是否正常),关闭熔断
服务限流:当服务量请求量过大,限制其访问频率,避免系统卡死
Hystrix:服务端和客户端都有用,一般是用在客户端
降级配置:
启动类: @EnableHystrix
业务类添注解:
@HystrixCommoand(fallbackMethod=”methodName”commandProperties{
@HystriProperty(name=”execution.ioslation.thread.timeoutInmolliseconds”,value=”3000”)//意思为设置该方法的超时时间,如果超时了,当成异常
})//新增一个名为methodNamed 的兜底方法,当异常时,调用此方法
如果方法只有@HystrixCommoand() ,类名添加
DefaultProperties(defaultFallback=’methodName’),表示使用默认妥协方法
定义:对所有网络请求进行的一个关口检查,所以请求都要先经过它
作用:反向代理、健全、流量控制,熔断,日志监控等等。。。
定义:Spring Cloud Gateway使用的 Webflux中的 reactor-netty响应式编程组件,底层使用了 Netty通讯框架
和zuul区别
Zuul阻塞架构
Zuul基于java开发,jvm第一次加载慢,导致性能弱
Predicates属性(符合条件才会映射生效)
After :时间 //代表当前时间后生效
Between: xxx 到 xx时间内生效
Cookie: cookieName,正则表达式 //当带有cookie,且值符合正则,才通过
Header: //当报文头含有规定内容,才通过映射
Method:GET/POST //get请求才通过映射
Query:userName,\d+ //带查询条件,且username符合正则表达式,映射通过
自定义过滤器
实现GlobalFiter , Ordered
Ordered:加载优先级大小//return 0优先级最高
GlobalFiter
Spring:cloud:config:servier:git uri:xxxxx.git//地址
Uri规则 ip/分支名/xxx.yml
分支名不写默认master 也可以在uri同等级添加labels:分支名 //指定分支名
Application.yml 是用户级资源配置项
Bootstrap.yml 是系统级配置,优先级更高
配置类修改后,客户端不会自动刷新--需要一个自我监控的功能
Pom引入actuator监控Yml暴露监控端口management:
endpoints:
web:
exposure:
include: "*"
ConfigController添加注解 @RefreshScope
4.需要运维工程师发一个post请求给项目,去刷新配置
Url:curl -X “hppt://localhost:3355/actuator/refresh”
Config修改后,需要手动发送post请求,让客户端刷新配置
如何实现全自动刷新?
Bus配合config实现配置自动刷新
实现原理:Bus和消息中间件rabbitMQ整合,服务端实例读取消息主题后,刷新从远程 git读取的config文件。客户端订阅服务端rabbitMQ,当服务端更新完config配置(维护手工发送curl给服务端 xxx/bus/rabbitMQ),由于客户端订阅了服务端消息队列。所以也能收到刷新配置的请求,自我刷新。完成刷新服务端,全局项目都刷新的功能
服务端Yml添加rabbitMQ配置
客户端也要添加bus的支持
此时只需要发curl给服务端就可以,由服务端影响其他客户端项目
解决痛点:当系统中有多种MQ技术,会造成切换,开发维护的压力变大。。。Springcloud stream就是为了屏蔽中间件的差异、细节。。。类似hibernate是数据库的封装一样,不需要关注数据库的种类
pom添加stream-rabbitMQ包Yaml 添加stream:binders:xxxxx