Nacos -- 注册配置中心
yml参数配置
server:
port: 8081 # web 服务启动时所需要的端口
spring:
application:
name: sca-provider # 向nacos进行服务注册时的名字
cloud:
sentinel:
transport:
dashboard: localhost:8180 # 指定sentinel控制台地址,这个服务中定义限流规则
#eager: true #默认为false,表示服务启动时不与Sentinel控制面板进行通讯
web-context-unify: false #控制sentinel簇点链路资源名归属
nacos:
discovery: #注册中心
server-addr: localhost:8848 # nacos服务注册地址
config: #配置中心
server-addr: localhost:8848
file-extension: yml
namespace: d3e87fb6-84a2-46fe-a8c1-51de4d3db048 #假如不寫,默認是public
#group: DEFAULT_GROUP_51 #默認為DEFAULT_GROUP
shared-configs[0]:
data-id: app-public.yml
refresh: true
#logging:
# level:
# com.jt: debug
Sentinel限流熔断
1.1概念:Sentinel是Alibaba开源的用于服务容错的综合性解决方案,
它是以流量为切入点,从流量控制,熔断降级,系统负载保护等
多个维度来保护服务的稳定性.
1.2 Sentinel 的作用:计算机的数量有限,处理能力有限,并发比较大或突发流量比较大时需要进行限流访问
2.Sentinel的限流模式:
2.1流控 :Sentinel默认的流控处理是:直接->快速失败
2.2降级 :降级需要选择慢调用比例或者异常比例和异常数 来判断降级的熔断效果
2.3热点规则:热点规则是一种特殊的流量控制,Sentinel会利用 LRU 策略
统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。
2.4授权规则 :通过设置黑/白 名单的方式,对请求来源限制资源是否可以通过
黑名单:只有黑名单的流控应用不可通过
白名单:只有白名单的流控应用可通过!
3.常用的限流算法: 计数,令牌桶,漏桶及滑动窗口
4.Sentinel的限流规则:通过QPS,线程数来进行设置
Gateway网关
API网关的设计初衷:为解决服务的保护,统一url访问,统一身份认证,统一跨域设计...
网关项目中的负载均衡的实现:
底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点详细分析
网关中的谓词对象类型:GatewayPredicate
网关中谓词对象的创建方式:通过谓词工厂进行创建
在网关中配置常用谓词:Path,Method,Before,Query,Header....
网关的优缺点
优点
1.相较于Zuul性能更为强劲
2.功能强大
3.设计优雅,更容易扩展
缺点:
1.依赖Netty与WebFlux(Spring5.0),学习成本高
2.需要Spring Boot 2.0及以上的版本,才支持
网关的作用:地址的保护,请求的转发
网关的基本组件:
gateway:
discovery:
locator:
enabled: true #开启通过服务注册中心的serviceId创建路由
routes: #配置网关路由规则,此元素下可以定义多个路由
- id: route01 #路由id,自己指定一个唯一值
uri: lb://sca-provider # lb为服务前缀(负载均衡单词的缩写,底层负载均衡实现还是Ribbon
predicates: #断言(谓词):这里定义请求规则 请求匹配机制(触发路由条件)
- Path=/nacos/provider/echo/** #当返回值为true的时候,才会走过滤器 请求路径
- After=2021-01-28T23:59:59.789+08:00[Asia/Shanghai] #请求时间
- Header=X-Request-Id, \d+ #请求头
- Method=Get #请求方法
- Query=pageSize, \d+ #请求参数
filters: #网关过滤器(特殊的拦截器),写到这个位置的是局部过滤器
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
Gateway网关的工作流程:
1.Gateway Client向Gateway Server发送请求
2.请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
3.之后网关的上下文会传递到DispatcherHandler,它负责将请求分发给 RoutePredicateHandlerMapping
4.RoutePredicateHandlerMapping负责路由查找,并根据路由谓词判断路由是否可用
5.如果谓词返回true,由FilteringWebHandler创建过滤器链并调用
6.请求会一次经过PreFilter–微服务–PostFilter的方法,最终返回响应
谓词内置工厂:
1) AfterRoutePredicateFactory:判断请求日期是否晚于指定日期
2) BeforeRoutePredicateFactory:判断请求日期是否早于指定日期
3) BetweenRoutePredicateFactory:判断请求日期是否在指定时间段内
如:-After=2020-12-31T23:59:59.789+08:00[Asia/Shanghai]
基于header的谓词工厂HeaderRoutePredicateFactory
判断请求Header是否具有给定名称且值与正则表达式匹配。例如:
-Header=X-Request-Id, \d+
基于Method请求方法的谓词工厂
MethodRoutePredicateFactory接收一个参数,判断请求类型是否跟指定的类型匹配。例如:
-Method=GET
基于Query请求参数的谓词工厂,QueryRoutePredicateFactory :
接收两个参数,请求param和正则表达式, 判断请求参数是否具 有给定名称且值与正则表达式匹配。例如:
-Query=pageSize,\d+