栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

微服务——Sentinel--降级/规则/拦截器/执行链

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微服务——Sentinel--降级/规则/拦截器/执行链

1. 降级入门
 
    
    private AtomicLong atomicLong=new AtomicLong(1);
    private int count;
    @GetMapping("/sentinel04")
    public String sentinel04() throws InterruptedException {
        long num=atomicLong.getAndDecrement();
        if(num%2==0){
            Thread.sleep(200);
        }
        return "sentinel 04 text";
    }



2.热点参数限流规则

编辑Controller层

 @GetMapping("/sentinel/findById")
    @SentinelResource("resource")
    public String doFindById(@RequestParam("id") Integer id){
        return "resource id is "+id;
    }



可以添加例外项

3.系统规则

4.授权规则(黑白名单) 4.1 通过参数限流
package com.jt.provider.controller;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;


@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
    @Override
    
    public String parseOrigin(HttpServletRequest request) {
        String origin=request.getParameter("origin");
        return origin;
    }
}


4.2 对ip地址授权访问
package com.jt.provider.controller;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;

@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
    @Override
    
    public String parseOrigin(HttpServletRequest request) {
//        String origin=request.getParameter("origin");
//        return origin;
        String ip=request.getRemoteAddr();
        System.out.println("ip="+ip);
        return ip;
    }
}


5.模拟拦截器

创建拦截器

package com.jt.provider.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map;

@Component

public class TimeAccessInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {

        LocalTime now=LocalTime.now();//JDK8中的时间对象
        int hour=now.getHour();//获取当前时间对应小时
        if(hour<=18||hour>=22) {
            //设置响应数据编码
            response.setCharacterEncoding("utf-8");
            //告诉客户端响应数据的类型,以及客户端显示内容的编码
            response.setContentType("text/html;charset=utf-8");
            //向客户端响应一个json格式的字符串
            Map map=new HashMap<>();
            map.put("status", 500);
            map.put("message","请在18~22点进行访问");
            String jsonStr=new ObjectMapper().writevalueAsString(map);
            PrintWriter out = response.getWriter();
            out.print(jsonStr);
            out.flush();
            out.close();
            return false;
        }
        return true;
    }
}

注册拦截器

package com.jt.provider.config;

import com.jt.provider.controller.TimeAccessInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
    //配置spring mvc 拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TimeAccessInterceptor())
                .addPathPatterns("/provider/sentinel01");
    }
}

实现效果

6.模拟框架执行链
package com.jt.common.interceptor;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

interface Filter{
    default void play(){}
}
//拦截器接口
interface HandlerInterceptor{
    default void before(){}
    default void after(){}
}
//处理器接口
interface Handler{
    void processed();//处理业务的方法
}
//定义一个执行链
class ExecutionChain{//我是执行链的设计者
    private Filter filter;
    //一些拦截器
    private  List interceptors=new CopyOnWriteArrayList<>();
    //业务处理器
    private Handler handler;
    public ExecutionChain(Filter filter,List interceptors,Handler handler){
        this.filter=filter;
        this.handler=handler;
        this.interceptors.addAll(interceptors);
    }
    public void execute(){//负责执行业务的方法(例如处理请求)

        //1.before
        for(int i=0;i=0;i--){
            interceptors.get(i).after();
        }
    }
}
public class frameworkTests {//框架应用者
    public static void main(String[] args) {
        List interceptors=new CopyOnWriteArrayList<>();
        interceptors.add(new HandlerInterceptor() {
            @Override
            public void before() {
                System.out.println("考试开始了");
            }
            @Override
            public void after() {
                System.out.println("考试结束了");
            }
        });
        //创建执行链对象
        ExecutionChain chain=
                new ExecutionChain(new Filter() {
                    @Override
                    public void play() {
                        System.out.println("过滤了");
                    }
                },interceptors, new Handler() {
                    @Override
                    public void processed() {
                        System.out.println("考试进行中");
                    }
                });
        //执行执行链
        chain.execute();
    }
}

实现效果

总结
  • spring web mvc: request→filter→servlet →interceptor→ @Controller
  • 限流降级的父类异常:BlockException
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353379.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号