Spring Cloud 服務網關Zuul
服務網關是分布式架構中不可缺少的組成部分,是外部網絡和內部服務之間的屏障,例如權限控制之類的邏輯應該在這里實現,而不是放在每個服務單元。
Spring Cloud Netflix 中的Zuul正是提供該功能的組件:
1. 提供路由功能,可屏蔽內部服務細節,並可提供負載均衡
2. 通過服務網關中的過濾器,在各階段過濾請求和相應,提供對外的權限控制。
3. 實現了斷路器,不會因為具體微服務的故障而導致服務網關的阻塞,依然可以對外服務。
下來通過簡單的例子體驗一下Zuul提供的功能:
1. 首先需要一個eureka單元注冊服務,一個client單元提供服務,之前已創建
2.新建Spring Cloud項目,命名zuul
3.添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
4.增加主類
@EnableZuulProxy @SpringCloudApplication public class App { @Bean public AccessFilter accessFilter() { return new AccessFilter(); } public static void main( String[] args ) { new SpringApplicationBuilder(App.class).web(true).run(args); } }
--- 添加EnableZuulProxy注解為開啟Zuul網關代理
5.添加配置文件application.properties
server.port=8011 spring.application.name=zuul #自定義映射 #zuul.routes.api-a.path=/client/** #zuul.routes.api-a.serviceId=client zuul.routes.api-a.path=/bing/** zuul.routes.api-a.serviceId=http://cn.bing.com/ #默認映射 無需配置 #http://zuulhost:zuulport/serviceId/** 請求會被轉發到serviceId對應的服務,需要注冊到eureka eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
---
6.增加過濾器類
public class AccessFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(AccessFilter.class); /** pre:可以在請求被路由之前調用 routing:在路由請求時候被調用 post:在routing和error過濾器之后被調用 error:處理請求時發生錯誤時被調用 * @return */ @Override public String filterType() { return "pre"; } //過濾器執行順序 @Override public int filterOrder() { return 0; } //過濾器開關 @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); Object accessToken = request.getParameter("token"); if(accessToken == null) { log.warn("access token is empty"); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); ctx.setResponseBody(request.getMethod()+" "+request.getRequestURL().toString()+" no token"); return null; } log.info("access token ok"); return null; } }
---繼承ZuulFilter類
7. 依次啟動eureka 、client、 zuul ,訪問測試
1. 訪問 http://localhost:8001/ 查看服務是否已注冊
2. 訪問 http://localhost:8011/bing/token=1 查看是否跳轉到bing主頁
3. 訪問 http://localhost:8011/bing 查看過濾器是否工作
4. 訪問 http://localhost:8011/client/info?token=1 查看zuul默認映射規則是否生效
參考:http://projects.spring.io/spring-cloud/spring-cloud.html
end