一、概念
springCloud是分布式系统,由多个微小的服务组成,它是集组件而成的一种架构风格。
springCloud主要包含了netflix组件:netflix是一家播放视频的公司,其技术具有分布式抗压)
springCloud需要springboot的支持:pom中需要使springboot和springCloud的版本相对应,可以从springcloud查看对应版本,springCloud的版本是按字母更新(伦敦地铁站名)
springcloud主要包含的组件:
注册中心Eureka,负载均衡Ribbon,熔断器,网关路由,配置中心
微服务的特点:
- 一系列微小服务共同组成
- 单独部署,跑进自己的进程
- 每个服务为独立的业务开发
- 分布式管理
不适合微服务springcloud的情况:
- 系统中包含很多强事务场景
- 业务相对稳定,迭代周期长
- 访问压力不大,可用性要求不高
二、Eureka注册中心
服务注册中心,是所有服务注册的服务端,其他服务都需要注册到该注册中心中,然后其他服务通过该注册中心调用其他服务。
Eureka Service
服务中心服务端启动类配置:@EnableEurekaServer
pom:spring-cloud-starter-netflix-eureka-server以及springboot包
application.yml配置:
register-with-eureka: false为在注册中心隐藏起来,是否注册自己
fetch-registry: false是否检索服务
name:eureka: 给服务取名字
enable-self-preservation: false关闭自我保护机制,适合开发环境
server.port: 设置端口号
服务注册中心即是一个服务端,也是一个客户端,因此需要配置客户端以及不显示客户端注册情况
Eureka Client
服务中心客户端启动类配置:@EbableDiscoveryClient
pom:spring-cloud-starter-netflix-eureka-client以及springboot包
application.yml配置:
instance.hostname:clientName: 设置注册中心的客户端访问路径
Eureka 高可用
问题:如果只有一个注册中心挂掉了?其他服务崩溃了!
解决:实现多个eureka服务器部署,通过相互注册,其他客户端服务向其全部注册
服务发现的方式
客户端发现:eureka
服务端发现(代理):nginx,zookeeper,kubernetes
微服务特点:异构
-不同语言
-不同数据库
springcloud轻量级通信:rest
不同语言只需要实现自己客户端程序就能放到eureka中来
三、应用间通信
springcloud采用的HTTP协议通信机制,通过json进行通信,跨语言,轻量级,但是对象和字符串的序列化会降低速度,另一种是dobbo的rpc通信服务,通过二进制流,大量信息会很快
两种restful调用方式:
- RestTemplate
- Feign
RestTemplate:有三种方法
1.RestTmeplate restTmeplate=new RestTmeplate ();
restTmeplate.getForObject("url/接口",返回类型);
2.ServiceInstance serviceInstance=loadBalancerClinet.choose("服务名");
端口号:serviceInstance.getPort(),url地址:serviceInstance.getHost()
3.在返回 new RestTmeplate方法上加@Loadbalanced
restTmeplate.getForObject("服务名/接口",返回类型);
Feign
调用方:
@FeignClient(name="调用的服务名")
public interface client(){}
Feign规则:映射地址、入参、返回值要相同,方法名可不同,入参有@ResquestBody必须用post
客户端负载均衡器Robbin
- RestTemlate
- Feign
- Zuul
调用多个相同的服务采用轮询的方式获取
可以自定义Robbin的规则
通过去官网查询robbin的rule配置方法:
users:
ribbon:
BFLoadBalancerRuleClassName:规则类名(全地址,包括包 )
四、配置中心
配置服务端
1.启动类注解:@EnableConfigServer
2.pom:`增加config服务相关包
3.配置文件:配置git地址和本地地址来存放配置文件,然后拉取
注意:拉取的配置文件名需要name-dev样式,不然会报错
配置客户端
作为配置客户端需要加上pom相关包,拉取的配置文件需要是配置的spring.application.name加-“dev".同时客户端的配置文件需要是bootstrap.yml(比application.yml优先读取)
注意:注册中心的配置请放在原来模块的配置文件中,防止注册中心配置更改后出错
例子:假如git出现name-dev 与 name的配置文件,则是将name合并到name-dev中
SpringCloud Bus自动刷新配置
pom需要增加包:<artifactId>spring-cloud-starter-bus-amqp</artifactId>
注意:旧版本spring-cloud-starter-feign
新版本spring-cloud-starter-openfeign
RabbitMQ
rabbitmq会出现一个队列
在需要使用配置的地方加个注解:@RefreshScope
请求端口
完成自动刷新。
如何配置实现不需要请求端口?
将地址写到url中(不能用本地localhost)
内网穿透:映射地址(到本地)下载地址:natapp.cn
注意在映射的地址后加monitor(这是github)
配置中心配置解释
五、消息与异步
异步
客户端请求不会阻塞进程,服务端的响应可以是非即时的
1.MQ的应用场景
- 异步处理:用户注册需要调用短信服务和积分服务,通过异步消息
- 流量削峰: 秒杀系统,限制流量
- 日志处理:
- 应用解耦:订单写入消息队列,快递
2.消息队列
- Queue:为承载消息的容器,为什么是队列而不是栈呢?主要是因为绝大部分的场景,我们都是希望消息是先进先出,有顺序的
- Producer:生产者,就是产生消息,并不断往队列塞的角色
- Consumer:消费者,也就是不断从队列中获取消息的角色
- Message:消息,包含消息头(即附属的配置信息)和消息体(即消息的实体内容)
- Publisher:生产者,向交换机发布消息的主体
- Exchange:交换机,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
- Binding:绑定,用于给Exchange和Queue建立关系,就是我们熟知的配对的红娘
- Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
- Connection:连接
- Channel:通道,MQ与外部打交道都是通过Channel来的,发布消息、订阅队列还是接收消息,这些动作都是通过Channel完成;简单来说就是消息通过Channel塞进队列或者流出队列
- Consumer:消费者,从消息队列中获取消息的主体
- Virtual Host: 虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
- Broker:消息队列服务器实体
3.主要使用的消息分发策略有三个,直接,路由和扇形:
a. Direct Exchange
直接完全匹配模式,适用于精准的消息分发
b. Topic Exchange
Routing Key的匹配模式,支持Routing Key的模糊匹配方式,更适用于多类消息的聚合
c. Fanout Exchange
忽略Routing Key, 将消息分配给所有的Queue,广播模式,适用于消息的复用场景
ack机制
Consumer接收到了消息之后,必须返回一个ack的标志,表示消息是否成功消费,如果返回true,则表示消费成功了,然后这个消息就会从RabbitMQ的队列中删掉;如果返回false,且设置为重新入队,则这个消息可以被重新投递进来
通常实际编码中,默认是自动ACK的,如果消息的重要性程度较高,我们应该设置为主动ACK,在接收到消息之后,自主的返回对应的ACK信息
关于rabbit的基本概念:
六、服务网关
服务网关的要素
稳定性,高可用
安全性
性能,并发性
扩展性
Zuu的特点
路由+过滤器=Zuul
核心是一系列的过滤器
Zuul的四种过滤器API
前置:限流,鉴权,参数校验,请求转发
后置:日志,统计 路由 错误
使用步骤
1使用@EnableZuulProxy
2.使用路由的地址/服务名/接口地址访问指定服务的接口
3.路由配置修改范围的服务名路径
4.忽视对外开放的接口:所有/product/lostForOrder禁止对外访问
5.配置敏感头
sensitiveHeaders:
6.动态路由
路由的综合应用
1.权限校验(通过token验证是否通过)
FliterConstants
继承ZuulFilter
run方法权限校验
2.限流(令牌桶)
取令牌,取不到抛出异常
七、服务容错
Spring Cloud Hystrix(防雪崩)
1.服务降级
@EnableCircuitBreaker:服务降低注解
注意:
在需要降级的接口写注解并写上回退函数,降级触发的条件是抛出异常
实现默认降级函数:在类上加注解@DefaultProperties(defaultFallback=""),
然后只需要在降级的接口上写@HystrixCommand()
2.超时设置(默认一秒)
配置接口超时时间
超时时间设置
第一次访问会超时的原因:因为第一次访问懒加载的过程,需要加载一些第一次加载才启动的类,所以需要时间,这就会导致超时
解决方法:
3.服务熔断
主要的配置参数
接口设置熔断
断路器模式
说明:当出现错误超过某个百分比(设置),熔断器进入半熔断状态,这个时候再通过的请求如果还有错误,则全部熔断,一定时间后又进入半熔断状态,观察下次请求是否正确,正确则恢复,不正确则全部熔断,一直循环到正常为止。
参数说明:
熔断休眠时间,从休眠到半熔断的时间,时间到后尝试请求命令,如果失败继续休眠该时间
断路器的最小请求数
断路器错误百分比条件
使用配置项
1.超时时间设置
注意:需要配置超时时间的接口必须加上@HystrixCommand
熔断可视工具
依赖
启动类加注解
配置访问路径
访问路径
八、服务追踪
Spring Cloud Sleuth
引入依赖
调整日志级别
ZipKin(可视化追踪工具)下载