服務網(wǎng)關(guān)(API GATEWAY)
服務網(wǎng)關(guān)是微服務架構(gòu)中一個不可或缺的部分。通過服務網(wǎng)關(guān)統(tǒng)一向外系統(tǒng)提供REST API的過程中歹叮,除了具備服務路由寓涨、均衡負載功能之外澎蛛,它還具備了權(quán)限控制等功能。
1. 引入依賴spring-cloud-starter-zuul躏鱼、spring-cloud-starter-eureka
2. 啟動類使用@EnableZuulProxy注解氮采,開啟Zuul
3. 這里用了@SpringCloudApplication注解,之前沒有提過染苛,通過源碼我們看到鹊漠,它整合了@SpringBootApplication、@EnableEurekaClient茶行、@EnableCircuitBreaker
4. 配置yml文件:
spring.application.name=api-gateway
server.port=50001
服務路由
通過服務路由的功能躯概,我們在對外提供服務的時候,只需要通過暴露Zuul中配置的調(diào)用地址就可以讓調(diào)用方統(tǒng)一的來訪問我們的服務畔师,而不需要了解具體提供服務的主機信息了娶靡。
在Zuul中提供了兩種映射方式:
1. 通過url直接映射,例如yml配置:
zuul.routes.api-a-url.path=/api-a-url/**
zuul.routes.api-a-url.url=http://localhost:18443/
說明: 其中看锉,配置屬性zuul.routes.api-a-url.path中的api-a-url部分為路由的名字固蛾,可以任意定義,但是一組映射關(guān)系的path和url要相同度陆,下面講serviceId時候也是如此。
2. 通過serviceId的映射献幔,例如yml配置:
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=service-A
zuul.routes.api-b.path=/api-b/**
zuul.routes.api-b.serviceId=service-B
eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/
推薦使用serviceId的映射方式懂傀,除了對Zuul維護上更加友好之外,serviceId映射方式還支持了斷路器蜡感,對于服務故障的情況下蹬蚁,可以有效的防止故障蔓延到服務網(wǎng)關(guān)上而影響整個系統(tǒng)的對外服務
權(quán)限驗證
1. 使用過濾器
服務網(wǎng)關(guān)中定義過濾器只需要繼承ZuulFilter抽象類實現(xiàn)其定義的四個抽象函數(shù)就可對請求進行攔截與過濾。
filterType:返回一個字符串代表過濾器的類型郑兴,在zuul中定義了四種不同生命周期的過濾器類型犀斋,具體如下:
pre:可以在請求被路由之前調(diào)用
routing:在路由請求時候被調(diào)用
post:在routing和error過濾器之后被調(diào)用
error:處理請求時發(fā)生錯誤時被調(diào)用
filterOrder:通過int值來定義過濾器的執(zhí)行順序
shouldFilter:返回一個boolean類型來判斷該過濾器是否要執(zhí)行,所以通過此函數(shù)可實現(xiàn)過濾器的開關(guān)情连。在上例中叽粹,我們直接返回true,所以該過濾器總是生效却舀。
run:過濾器的具體邏輯虫几。需要注意,這里我們通過ctx.setSendZuulResponse(false)令zuul過濾該請求挽拔,不對其進行路由辆脸,然后通過ctx.setResponseStatusCode(401)設置了其返回的錯誤碼,當然我們也可以進一步優(yōu)化我們的返回螃诅,比如啡氢,通過ctx.setResponseBody(body)對返回body內(nèi)容進行編輯等状囱。
2. 使用攔截器
在攔截器中進行鑒權(quán)判斷
實例源碼: api-gateway