提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
spring cloud(spring家族的顶级框架)将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路 由,负载均衡,熔断器,控制总线,集群状态等等功能。
Eureka:注册中心----收集ip端口并对外提供
服务的提供方和获取方都需要将自己的ip和端口注册到Eureka中,服务提供方需要向Eureka发送心跳续约刷新自己的状态,获取方再通过工具类DiscoveryClient动态获取提供方的ip和端口,获取到多个ip 端口后需要进行选择(负载均衡)。
EurekaServer的高可用
为了保障获取服务的稳定性,单个Eureka服务不足以保障,所以需要开启 Eureka集群 在Eureka注册中心再开启一个端口,并且新端口需要注册到Eureka,多个Eureka Server之间也会互相注册,当服务提供者注册到Eureka Server集群中的某个节点时,该节点会 把服务的信息同步给集群中的每个节点,从而实现数据同步
Ribbon(负载均衡)----从多个服务提供者中选择一个
为Rinnon配置服务提供者的地址后,Ribbon就根据负载均衡算法自动帮服务调用者请求,其内置了轮询、随机、权重等算法,同样也可以自定义发在均衡算法 Ribbon默认的负载均衡策略是轮询。 开启Ribbon:服务调用方在微服务自动装配RestTemplate方法添加注解@LoadBalance。 RestTemplate获取url不用ip端口而替换为服务名,Ribbon会自动去Eureka调用端口(负载均衡算法)
Hystrix(降级/熔断)----服务故障、超时。采用熔断降级策略
微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,会形成非常复杂的调用链路。如果有服务发生异常导致请求阻塞,则tomcat的线程不会释放,请求越多阻塞的线程越多最后超出服务器的承载范围后导致其他服务也不可用。
- Hystrix为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队,加 速失败判定时间。
- 用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超 时,则会进行降级处理
服务降级:请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,返回一个执行结果(例如返回友好的提示信息)。
启动降级:服务调用方的启动类添加注解@EnableCircuitBreaker,启动所有的熔断降级
Circuit Breaker 熔断
在分布式系统中应用服务熔断后;服务调用方 可以自己进行判断哪些服务反应慢或存在大量超时,可以针对这些服务进行主动熔断,防止整个系统被拖垮。 Hystrix的服务熔断机制,可以实现弹性容错;当服务请求情况好转之后,可以自动重连。 Hystrix的三种状态:
- 关闭(保险丝完好,能正常访问服务)
- 打开(保险丝断开20次后完全断开,不会再访问服务)
- 半开(完全断开后默认5s访问服务,成功访问就关闭,不成功则完全断开)
![circuitBreak流程](https://img-blog.csdnimg.cn/c2b951de37ce4857bed9bf743ad36637.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5biD5pel5biD6IiS5a-M5pav5Z-6,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center
Feign(服务调用)----调用其他微服务的工具
简化了远程调用时的代码;Feign可以把Rest的请求伪装成类似Controller。不用拼接url、参数等操作,一切都交给Feign。
开启Feign:在服务调用方启动类添加注解@EnableFeignClients
代理接口:代理接口添加注解@FeignClient(“service name”),Feign会通过动态代理生成实现类;接口中的方法采用SpringMVC注解,Feign会根据注解生成URL并访问获取结果
负载均衡:Feign中本身已经集成了Ribbon依赖和自动配置
开启降级/熔断:Feign内置Hystrix会自动熔断,但是如果想要降级,需要配置开启。降级类需要继承代理类复写被降级方法,然后在代理类中,指定刚才编写的实现类
Gateway(网关)----路由和过滤
Gateway是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息, 从而加强安全保护不管是来自于客户端的请求,还是服务内部调用。一切对服务的请求都可经过网关,然后再由网关来实现鉴权、动态路由等操作。
面向服务的路由
路由规则中,路径对应的服务地址写死了!如果同一服务有多个实例的话,这样做显然不合理。
routes:
- id: user-sevice-route # 路由id
uri: lb://user-service # 面向服务的路由,使用lb协议网关将根据服务名解析出地址并进行负载均衡
# 路由配置中uri所用的协议为lb时(以uri: lb://user-service为例),
# gateway将使用 LoadBalancerClient把 user-service通过eureka解析为实际的主机和端口 并进行ribbon负载均衡。
predicates:
- Path=/user/** # 路由断言,配置映射路径(请求中带有user的路径会被代理到user-service)
过滤器
请求鉴权,通过网关提供的过滤器来实现。 常见自带过滤器:
spring:
cloud:
gateway:
routes:
- id: user-sevice-route
uri: lb://user-service
predicates:
- Path=/api/user/**
# 过滤器
filters:
# - PrefixPath=/user # 添加请求路径的前缀,在/**请求前添加/user前缀
- StripPrefix=1 # 1表示过滤前一个前缀,将/api/user/**的/api前缀删除
# 自定义过滤器
- MyParam=name # 过滤器名=要拦截的参数名
# 全局默认过滤器,对所有路由生效
default-filters:
- AddResponseHeader=AddResponseHeader, aheader # 添加响应头,key,value
- AddResponseHeader=AddHeader, head
跨域配置
跨域:在js请求访问中,如果访问的地址与当前服务器的域名、ip或者端口号不一致则称为跨域请求。若不解决则 不能获取到对应地址的返回结果。
# 配置跨域
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 所有访问网关服务的请求地址
allowedOrigins: * # 指定允许跨域的请求(允许所有请求)
allowedMethods: # 允许跨域的请求方式
- GET
Gateway与Feign的区别
gateWay作为整个应用的入口,接受所有请求,将不同的请求转发至不同的处理微服务模块 Feign将当前微服务的部分服务接口暴露出来,并且主要用于各个微服务之间的服务调用
Spring Cloud Config(分布式配置中心)----配置中心
在分布式系统中,由于服务数量非常多,配置文件分散在不同的微服务项目中,管理不方便。为了方便配置文件集 中管理,需要分布式配置中心组件。在Spring Cloud中,提供了Spring Cloud Config,它支持配置文件放在配置服 务的本地,也支持放在远程Git仓库 创建配置中心:服务中心application需要添加@EnableConfigServer注解开启配置服务
配置文件:
spring:
cloud:
config:
server:
git:
uri: https://gitee.com/dengtahost/spring-cloud-demo.git # 远程仓库地址
客户端获取远程配置bootstrap.yml:
spring:
cloud:
config:
# 配置文件的命名方式:{application}-{profile}.yml
name: user # 与仓库中的配置文件的application一致
profile: dev # 与仓库中的profile一致
label: master # 与仓库中版本分支一致
discovery:
enabled: true # 使用配置中心
service-id: config-service # 配置中心服务名
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka # 注册到eureka
application.yml与bootstrap.yml区别:
bootstrap也是spring boot 默认配置,加载早于application bootstrap是系统级配置相对固定,application是应用级配置易变更
Spring Cloud Bus(服务总线)
微服务中的配置文件集中存储在远程Git仓库,并且通过配置中心微服务从Git仓库拉取配置文 件, 当用户微服务启动时会连接配置中心获取配置信息从而启动用户微服务。但更新Git仓库中的配置文件只有重启用户微服务才能生效。 Spring Cloud Bus可以在不重启微服务的情况下更新配置 在配置中心的application配置文件添加消息代理
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: bus-refresh # 暴露触发消息总线的地址
在用户微服务bootstrap配置文件添加消息代理
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
在用户微服务启动类添加@Reference注解
|