本文采用Spring cloud本文爲2.1.8RELEASE,version=Greenwich.SR3 html
本文基於前兩篇文章eureka-server、eureka-client、eureka-ribbon和eureka-feign的實現。 參考java
Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,例如將請求/api/goods轉發到商品服務上、/api/order轉發到訂單服務上等。git
Zull默認和Ribbon結合實現了負載均衡功能。github
<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-zuul</artifactId>
</dependency>
複製代碼
spring:
application:
name: eureka-zuul
server:
port: 8400
eureka:
instance:
hostname: localhost
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
client:
service-url:
defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/
zuul:
routes:
eureka-ribbon: #對應服務名稱,能夠自定義(最好保持一致)
path: /ribbon/*
serviceId: eureka-ribbon #對應服務名稱
eureka-feign:
path: /eureka-feign/*
serviceId: eureka-feign #對應服務名稱
複製代碼
package spring.cloud.demo.eurekazuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaZuulApplication.class, args);
}
}
複製代碼
@EnableZuulProxy:開啓Zuul網關注解spring
打開瀏覽器,分別輸入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,顯示結果分別以下:apache
能夠看到Zuul按照路由轉發的配置規則,把/ribbon/*的請求轉發到eureka-ribbon服務上,把/eureka-feign/*的請求轉發到eureka-feign的服務上。api
至此,一個簡單基於Zuul路由網關就搭建完成了。瀏覽器
Zuul過濾器有四種類型分別是app
- pre 路由前
- route 路由時
- post 路由完畢
- error 發生錯誤時
package spring.cloud.demo.eurekazuul.fillter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** * 簡單filter過濾器 * @auther: maomao * @DateT: 2019-09-17 */
public class CommonFilter extends ZuulFilter {
/** * 在請求被路由以前調用 * @return */
@Override
public String filterType() {
return "pre";
}
/** * filter執行順序,經過數字指定 ,優先級爲0,數字越大,優先級越低 * @return */
@Override
public int filterOrder() {
return 0;
}
/** * 是否執行該過濾器,此處爲true,說明須要過濾 * @return */
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
//獲取請求參數
String token = request.getParameter("token");
//校驗token是否能夠經過
if (StringUtils.isNotBlank(token) && token.equals("maomao")) {
requestContext.setSendZuulResponse(true);
requestContext.setResponseStatusCode(200);
requestContext.set("code", 1);
} else {
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(401);
HttpServletResponse response = requestContext.getResponse();
response.setHeader("content-type", "text/html;charset=utf-8");
requestContext.setResponseBody("網關認證失敗,中止路由");
requestContext.set("code", 0);
}
return null;
}
}
複製代碼
package spring.cloud.demo.eurekazuul.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.cloud.demo.eurekazuul.fillter.CommonFilter;
/** * @auther: maomao * @DateT: 2019-09-17 */
@Configuration
public class ZuulFilterConfig {
@Bean
public CommonFilter commonFilter() {
return new CommonFilter();
}
}
複製代碼
在瀏覽器分別輸入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,顯示結果以下:負載均衡
顯示結果證實,過濾器已經生效。由於過濾CommonFilter中要求輸入參入帶token=maomao,因此請求被攔截,Zuul中止轉發。
在瀏覽器中URL中增長token參數,顯示以下:
顯示結果證實,在token正確的狀況下,Zuul轉發成功。
至此,自定義的過濾器就演示完成。
本文要實現了簡單的Zuul路由轉發應用。
轉載請註明出處,