閘道器作用
閘道器的作用,可以實現負載均衡、路由轉發、日誌、許可權控制、監控等。
閘道器與過濾器區別
閘道器是攔截所有伺服器請求進行控制
過濾器攔截某單個伺服器請求進行控制
Nginx與Zuul的區別
Nginx是採用伺服器負載均衡進行轉發
Zuul依賴Ribbon和eureka實現本地負載均衡轉發
相對來說Nginx功能比Zuul功能更加強大,能夠整合其他語言比如lua指令碼實現強大的功能,同時Nginx可以更好的抗高併發,Zuul閘道器適用於請求過濾和攔截等。
Zuul閘道器
zuul是spring cloud的一個推薦元件,https://github.com/Netflix/zuul
使用Zuul實現反向代理
環境搭建
Maven依賴資訊
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <!-- 管理依賴 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.M7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!-- SpringBoot整合eureka客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <!-- 注意: 這裡必須要新增, 否者各種依賴有問題 --> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
application.yml
###註冊 中心 eureka: client: serviceUrl: defaultZone: http://localhost:8100/eureka/ server: port: 80 ###閘道器名稱 spring: application: name: service-zuul ### 配置閘道器反向代理 zuul: routes: api-a: ### 以 /api-member/訪問轉發到會員服務 path: /api-member/** serviceId: app-itmayiedu-member api-b: ### 以 /api-order/訪問轉發到訂單服務 path: /api-order/** serviceId: app-itmayiedu-order
使用Zuul整合Ribbon
Zuul 預設開啟了 Ribbon本地負載均衡功能。
使用Zuul過濾器
@Component public class TokenFilter extends ZuulFilter { public Object run() throws ZuulException { // 獲取上下文 RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletRequest request = currentContext.getRequest(); String userToken = request.getParameter("userToken"); if (StringUtils.isEmpty(userToken)) { currentContext.setSendZuulResponse(false); currentContext.setResponseStatusCode(401); currentContext.setResponseBody("userToken is null"); return null; } // 否則正常執行業務邏輯..... return null; } // 判斷過濾器是否生效 public boolean shouldFilter() { return true; } // 過濾器的執行順序。當請求在一個階段的時候存在多個多個過濾器時,需要根據該方法的返回值依次執行 public int filterOrder() { return 0; } // 過濾器型別 pre 表示在 請求之前進行攔截 public String filterType() { return "pre"; } }