上篇博客《SpringCloud——Eureka服務註冊和發現》中介紹了註冊中心Eureka、服務提供者和服務消費者。這篇博客咱們將介紹服務網關。java
圖(1) 未使用服務網關的作法
web
圖(2) 服務網關的作法
spring
服務網關,英文Service GateWay,他是微服務框架中惟一的入口。有些相似外觀模式,對外只提供一個訪問的入口。這樣作的好處有不少,減小了客戶端屢次調用微服務,也能夠在「入口」處進行負載或權限的處理。api
在SpringCloud Netflix中,Zuul就是這樣一個角色。markdown
引入jar包app
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
在Application中開啓Zuul負載均衡
@EnableZuulProxy
@SpringCloudApplication //整合了@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker,主要目的仍是簡化配置
public class ZuulApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
}
}
Zuul環境搭建完畢以後,咱們就能夠來看他的主要功能了,包括服務路由和服務過濾。框架
方法一:url配置
在application.properties中,進行以下配置。ide
zuul.routes.api-a-url.path=/api-a-url/** zuul.routes.api-a-url.url=http://localhost:2222/
以後,咱們就能夠經過」/api-a-url」來代替」http://localhost:2222/「進行訪問,相似修改本地hosts文件來設置域名。這種方式屏蔽了ip和端口。函數
缺點: url路由粒度過粗。須要知道全部服務地址才能完成映射。
方法二:服務映射(serviceId)
既然eureka中已經有咱們的配置信息,那咱們能夠藉助他來完成地址映射。
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=compute-service
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
定義過濾
public class AccessFilter extends ZuulFilter {
/*filterType:返回一個字符串表明過濾器的類型,在zuul中定義了四種不一樣生命週期的過濾器類型,具體以下: pre:能夠在請求被路由以前調用 routing:在路由請求時候被調用 post:在routing和error過濾器以後被調用 error:處理請求時發生錯誤時被調用 filterOrder:經過int值來定義過濾器的執行順序 shouldFilter:返回一個boolean類型來判斷該過濾器是否要執行,因此經過此函數可實現過濾器的開關。在上例中,咱們直接返回true,因此該過濾器老是生效。 run:過濾器的具體邏輯。須要注意,這裏咱們經過ctx.setSendZuulResponse(false)令zuul過濾該請求,不對其進行路由,而後經過ctx.setResponseStatusCode(401)設置了其返回的錯誤碼,固然咱們也能夠進一步優化咱們的返回,好比,經過ctx.setResponseBody(body)對返回body內容進行編輯等。 */
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("accessToken"); //定義規則:訪問url中必須帶有accessToken參數
if(accessToken == null) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return null;
}
return null;
}
……
}
實例化
//實例化過濾器
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}
啓動項目,若是訪問的url中不含有accessToken參數則會報錯,只有包含該參數的請求url纔會被放行。
Zuul的主要功能:負載均衡、服務路由、服務過濾等,並非新鮮的東西。api gateway相似外觀模式,提供統一的入口。負載均衡和路由和Nginx的功能很像,過濾和權限管理相似shiro的權限配置。
萬變不離其宗,目的都是在於把這些與服務自己關係不大的東西剝離出來,並且是越早剝離越好,能在Controller處理的毫不放在Service,能在轉發前處理的就不要留到轉發後。相似你們說的服務的無狀態性,over!
回家倒計時四個小時………………