閘道器Zuul+route+Filter筆記20221129
一、ek2014
1、pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2、application.properties
# 應用名稱
spring.application.name=eureka
server.port=2013
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://localhost:2013/eureka/
eureka.server.eviction-interval-timer-in-ms=5
3、Ek2013Application
@EnableEurekaServer
@SpringBootApplication
public class Ek2013Application {
public static void main(String[] args) {
SpringApplication.run(Ek2013Application.class, args);
}
}
二、Provider2033
1、pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、application.properties
# 應用名稱
spring.application.name=provider2033
# 應用服務 WEB 訪問埠
server.port=2033
##eureka
eureka.client.service-url.defaultZone=http://localhost:2013/eureka/
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
eureka.instance.lease-renewal-interval-in-seconds=5
eureka.instance.lease-expiration-duration-in-seconds=10
3、Provider2033Application
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class Provider2033Application {
public static void main(String[] args) {
SpringApplication.run(Provider2033Application.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/")
public String home(){
return "軟體老五,埠"+port;
}
}
三、Zull2041
1、pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2、application.properties
# 應用名稱
spring.application.name=zuul2041
server.port=2041
##eureka
eureka.client.service-url.defaultZone=http://localhost:2013/eureka/
eureka.client.registry-fetch-interval-seconds=30
eureka.instance.lease-renewal-interval-in-seconds=15
eureka.instance.lease-expiration-duration-in-seconds=45
#####route api-provider
##http://localhost:2033 ==> http://localhost:2041/provider
zuul.routes.api-provider.path=/provider/**
zuul.routes.api-provider.service-id=provider2033
3、Zull2041Application
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class Zull2041Application {
public static void main(String[] args) {
SpringApplication.run(Zull2041Application.class, args);
}
}
4、MyZullFilter
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
public class MyZullFilter extends ZuulFilter {
//每秒放多少個token(10個)
private static final RateLimiter RATE_LIMITER=RateLimiter.create(10);
/**
* 過濾型別
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 請求過濾順序
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 判斷過濾器是否生效
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
/* if(!RATE_LIMITER.tryAcquire()){
System.out.println("限流.....................");
}*/
//獲取token引數
RequestContext rc=RequestContext.getCurrentContext();
if(!RATE_LIMITER.tryAcquire()) {
rc.setSendZuulResponse(false);
rc.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());
System.out.println("限流.....................");
}
HttpServletRequest request=rc.getRequest();
String token=request.getParameter("token");
if(token!=null){
return null;
}
//表示不進行路由
rc.setSendZuulResponse(false);
rc.setResponseStatusCode(401);
try {
rc.getResponse().setContentType("text/html;charset=utf-8");
rc.getResponse().getWriter().write("沒有傳遞正確引數,請校驗後重試~");
}catch (IOException e){
e.printStackTrace();
}
return null;
}
}
四、Jmeter測試
測限流