SpringCloud笔记

一、概念

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)

配置中心配置解释

https://blog.csdn.net/qazwsxpcm/article/details/88578076

五、消息与异步

异步

客户端请求不会阻塞进程,服务端的响应可以是非即时的

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的基本概念:

https://liuyueyi.github.io/hexblog/2018/05/27/RabbitMQ%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/

六、服务网关

服务网关的要素

稳定性,高可用

安全性

性能,并发性

扩展性

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(可视化追踪工具)下载

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值