企业网站建设文章,网站utf8乱码,贵阳seo计费管理,找装修活上哪个平台文章目录 前言4 授权规则4.1 基本原理4.2 获取origin4.3 配置授权规则 5 自定义异常结果6 规则持久化 前言
微服务保护学习笔记(一)雪崩问题及解决方案、Sentinel介绍与安装 微服务保护学习笔记(二)簇点链路、流控操作、流控模式(关联、链路) 微服务保护学习笔记(三)流控效果(… 文章目录 前言4 授权规则4.1 基本原理4.2 获取origin4.3 配置授权规则 5 自定义异常结果6 规则持久化 前言
微服务保护学习笔记(一)雪崩问题及解决方案、Sentinel介绍与安装 微服务保护学习笔记(二)簇点链路、流控操作、流控模式(关联、链路) 微服务保护学习笔记(三)流控效果(warm up、排队等待)、热点参数限流 微服务保护学习笔记(四)FeignClient整合Sentinel、线程隔离舱壁模式、熔断降级
4 授权规则
4.1 基本原理
授权规则可以对服务调用方的来源做控制有白名单和黑名单两种方式
白名单来源origin在白名单内的调用者允许访问黑名单来源origin在黑名单内的调用者不允许访问
点击Sentinel控制台左侧菜单“授权规则”可以新增授权规则 资源名受保护的资源例如/order/query流控应用调用方名单origin授权类型设置调用方名单是白名单还是黑名单
4.2 获取origin
Sentinel是通过RequestOriginParser这个接口的parseOrigin()方法来获取请求的来源的。
这个方法的作用是从request对象中获取请求者的origin值并返回。默认情况下Sentinel不管请求者从哪里来返回值永远是default也就是说一切请求的来源都被认为是一样的值default。
因此自定义这个接口的实现就可以让不同的请求返回不同的origin。 在sd-user-service微服务中定义一个RequestOriginParser实现类
Component
public class HeaderOriginParser implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest request) {// 获取请求头String origin request.getHeader(Origin);if(StringUtils.isEmpty(origin)) {origin blank;}return origin;}
}4.3 配置授权规则
为sd-user-service微服务配置授权规则设置origin为sd-user-service的请求为白名单 测试 可见/user/query资源只允许origin请求头为sd-user-service的请求调用。
5 自定义异常结果
默认情况下当发生限流、降级或授权拦截时都会抛出异常到调用方并且异常结果都是flow limmiting即限流从4.3节的截图可以看出。这样不够友好无法得知具体原因。
Sentinel提供了一个BlockExceptionHandler接口用于自定义异常结果 其handle()方法有三个参数其中第三个参数BlockException就是Sentinel拦截时抛出的异常。
BlockException类又包含多个不同的子类 在sd-user-service微服务中定义一个BlockExceptionHandler实现类
Component
public class SentinelExceptionHandler implements BlockExceptionHandler {Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg 未知异常;int status 429;if (e instanceof FlowException) {msg 请求被限流了;} else if (e instanceof ParamFlowException) {msg 请求被热点参数限流;} else if (e instanceof DegradeException) {msg 请求被降级了;} else if (e instanceof AuthorityException) {msg 没有授权访问;status 401;}response.setContentType(application/json;charsetutf-8);response.setStatus(status);response.getWriter().println({\msg\: msg , \status\: status });}}重启微服务配置授权规则发起origin请求头为sd-user-service的请求 6 规则持久化
在默认情况下Sentinel的所有规则都是内存存储重启后所有规则都会丢失。因此在上面的测试中每次重启微服务Sentinel配置的规则均会消失。
规则是否能持久化取决于规则管理模式Sentinel支持三种规则管理模式
原始模式Sentinel的默认模式将规则保存在内存重启服务会丢失。pull模式Sentinel控制台将配置的规则推送到Sentinel客户端而客户端会将配置规则保存在本地文件或数据库中以后会定时去本地文件或数据库中查询更新本地规则。 push模式Sentinel控制台将配置规则推送到远程配置中心例如Nacos。Sentinel客户端监听Nacos获取配置变更的推送消息完成本地配置更新。 …
本节完更多内容请查阅分类专栏微服务学习笔记
感兴趣的读者还可以查阅我的另外几个专栏
SpringBoot源码解读与原理分析MyBatis3源码深度解析Redis从入门到精通MyBatisPlus详解SpringCloud学习笔记