Add sentinel servlet adapter demo (#3422)

This commit is contained in:
zhangxunwei 2024-08-16 14:30:07 +08:00 committed by GitHub
parent 3892514c53
commit 02c97fef65
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 216 additions and 0 deletions

View File

@ -42,6 +42,7 @@
<module>sentinel-demo-annotation-cdi-interceptor</module>
<module>sentinel-demo-motan</module>
<module>sentinel-demo-transport-spring-mvc</module>
<module>sentinel-demo-servlet</module>
</modules>
<dependencies>

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>sentinel-parent</artifactId>
<groupId>com.alibaba.csp</groupId>
<version>1.8.8</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sentinel-demo-servlet</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<warName>sentinel-demo-servlet</warName>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -0,0 +1,45 @@
package com.alibaba.csp.sentinel.demo.servlet.config;
import com.alibaba.csp.sentinel.adapter.servlet.callback.DefaultUrlBlockHandler;
import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlCleaner;
import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* class description
*
* @author zhangxunwei
* @date 2024/6/24
*/
public class SentinelConfig implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
initConfig();
}
public static void initConfig() {
System.out.println("Init sentinel config");
WebCallbackManager.setUrlBlockHandler(new DefaultUrlBlockHandler());
WebCallbackManager.setRequestOriginParser(request -> request.getHeader("S-user"));
WebCallbackManager.setUrlCleaner(new MyUrlCleaner());
}
static class MyUrlCleaner implements UrlCleaner {
@Override
public String clean(String originUrl) {
if (originUrl.matches("/foo/\\d+")) {
return "/foo/*";
}
return originUrl;
}
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}

View File

@ -0,0 +1,77 @@
package com.alibaba.csp.sentinel.demo.servlet.controller;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* class description
*
* @author zhangxunwei
* @date 2024/6/24
*/
public class DefaultServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String path = ((HttpServletRequest) servletRequest).getPathInfo();
if (path.startsWith("/foo")) {
handleFoo(servletRequest, servletResponse);
} else if (path.startsWith("/bar")) {
handleBar(servletRequest, servletResponse);
} else {
notFound(servletRequest, servletResponse);
}
}
private void notFound(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
httpServletResponse.setStatus(404);
httpServletResponse.setContentType("text/plain");
httpServletResponse.getWriter().write(httpServletRequest.getServletPath() + " not found.");
httpServletResponse.getWriter().close();
}
private void handleBar(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
httpServletResponse.setStatus(200);
httpServletResponse.setContentType("text/plain");
httpServletResponse.getWriter().write("bar");
httpServletResponse.getWriter().close();
}
private void handleFoo(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
String path = httpServletRequest.getPathInfo();
String id = path.replaceAll("/foo/(\\d+)", "$1");
httpServletResponse.setStatus(200);
httpServletResponse.setContentType("text/plain");
httpServletResponse.getWriter().write("Hello " + id);
httpServletResponse.getWriter().close();
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}

View File

@ -0,0 +1,2 @@
project.name=sentinel-demo-servlet
csp.sentinel.dashboard.server=http://localhost:8081

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>DefaultServlet</servlet-name>
<servlet-class>com.alibaba.csp.sentinel.demo.servlet.controller.DefaultServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DefaultServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- sentinel filter -->
<filter>
<filter-name>SentinelCommonFilter</filter-name>
<filter-class>com.alibaba.csp.sentinel.adapter.servlet.CommonFilter</filter-class>
<init-param>
<param-name>HTTP_METHOD_SPECIFY</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>WEB_CONTEXT_UNIFY</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SentinelCommonFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>