1、啟動基礎工程
1.1、啟動【服務注冊中心】,工程名稱:springcloud-eureka-server
1.2、啟動【服務提供者】,工程名稱:springcloud-eureka-client
1.3、啟動【服務消費者】,工程名稱:springcloud-eureka-ribbon
1.4、啟動【服務消費者】,工程名稱:springcloud-eureka-feign
2、創建【網關路由】,即 Eureka Zuul
2.1、新建 Spring Boot 工程,工程名稱:springcloud-eureka-zuul
2.2、工程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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2.3、在工程啟動類中,添加注解 @EnableZuulProxy
package com.miniooc.eurekazuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* EurekaZuulApplication
*
* @author 宋陸
* @version 1.0.0
*/
@EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaZuulApplication.class, args);
}
}
2.4、創建工程配置文件application.yml,添加如下配置:
server:
port: 8080
spring:
application:
name: eureka-gateway
eureka:
instance:
hostname: localhost
# 表示eureka client間隔多久去拉取服務注冊信息,默認為30秒,如果要迅速獲取服務注冊狀態,可以縮小該值
lease-renewal-interval-in-seconds: 5
# 表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超時時間,在這個時間內若沒收到下一次心跳,則將移除該instance。
# 默認為90秒
# 如果該值太大,則很可能將流量轉發過去的時候,該instance已經不存活了。
# 如果該值設置太小了,則instance則很可能因為臨時的網絡抖動而被摘除掉。
# 該值至少應該大於 leaseRenewalIntervalInSeconds
lease-expiration-duration-in-seconds: 10
client:
serviceUrl:
defaultZone: http://localhost:9527/eureka/,http://localhost:9528/eureka/,http://localhost:9529/eureka/
zuul:
routes:
api-ribbon:
path: /ribbon/*
serviceId: eureka-discovery-ribbon
api-feign:
path: /feign/*
serviceId: eureka-discovery-feign
2.5、啟動工程
2.6、打開瀏覽器,分別訪問 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo


【路由網關】按照路由轉發規則,把 /ribbon/* 的請求,轉發到了 eureka-discovery-ribbon 服務,把 /feign/* 的請求,轉發到了 eureka-discovery-feign
3、為【網關路由】添加自定義過濾器
zuul過濾器有四種類型分別是:pre 路由前,route 路由時,post 路由完畢,error 發生錯誤時。
3.1、創建自定義過濾器 AuthFilter
package com.miniooc.eurekazuul.filter;
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;
/**
* EurekaZuulApplication
*
* @author 宋陸
* @version 1.0.0
*/
public class AuthFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre"; // 在請求被路由之前調用
}
@Override
public int filterOrder() {
return 0; // filter執行順序,通過數字指定 ,優先級為0,數字越大,優先級越低
}
@Override
public boolean shouldFilter() {
return true; // 是否執行該過濾器,此處為true,說明需要過濾
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String token = request.getParameter("token");// 獲取請求的參數
// 如果有token參數並且token值為miniooc,才進行路由
if (StringUtils.isNotBlank(token) && token.equals("miniooc")) {
ctx.setSendZuulResponse(true); //對請求進行路由
ctx.setResponseStatusCode(200);
ctx.set("code", 1);
} else {
ctx.setSendZuulResponse(false); //不對其進行路由
ctx.setResponseStatusCode(401);
HttpServletResponse response = ctx.getResponse();
response.setHeader("content-type", "text/html;charset=utf8");
ctx.setResponseBody("網關認證失敗,停止路由");
ctx.set("code", 0);
}
return null;
}
}
3.2、創建應用配置類 EurekaZuulConfig
package com.miniooc.eurekazuul.config;
import com.miniooc.eurekazuul.filter.AuthFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* EurekaZuulConfig
* 應用配置類,初始化 Bean和配置信息
*
* @author 宋陸
* @version 1.0.0
*/
@Configuration
public class EurekaZuulConfig {
@Bean
public AuthFilter authFilter(){
return new AuthFilter();
}
}
3.3、重新啟動工程
3.4、打開瀏覽器,分別訪問 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo


沒有通過校驗,zuul過濾器停止路由轉發
3.5、打開瀏覽器,分別訪問 http://localhost:8080/ribbon/ribbonInfo?token=miniooc,http://localhost:8080/feign/feignInfo?token=miniooc


通過校驗,zuul過濾器正常路由轉發
至此,一個簡單的【網關路由】搭建完成。
