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";
}
编辑Controller层
@GetMapping("/sentinel/findById")
@SentinelResource("resource")
public String doFindById(@RequestParam("id") Integer id){
return "resource id is "+id;
}
可以添加例外项
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;
}
}
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;
}
}
创建拦截器
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");
}
}
实现效果
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



