1.環境介紹
好了,不知不覺中我們已經來到了最後一篇文章,也來到了最一個工程"mirco-service-zuul",zuul是一個服務網關,雖然現在spring也出了spring cloud gateway,相信有很多之前就使用spring cloud的公司依然使用的是zuul;看完這六篇文章相信有點基礎的小夥伴們應該能自己做點東西了,當然spring cloud這個系列遠遠還沒有說完,後面我計劃在春節前後開源一個最小化的微服務手腳架項目,使用spring cloud來做實戰演練。
2.api網關服務
2.1 創建工程
因爲api網關是一個比較獨立的東西,基本不需要對原有的工程進行改造。
- 配置文件中加入
server:
port: 5001
spring:
application:
name: service-gateway-zuul
zuul:
routes:
baidu:
url: http://www.baidu.com
path: /api/**
- 爲啓動文件加入@EnableZuulProxy註解
啓動服務,訪問http://localhost:5001/api/,你會看到頁面重定向到百度了。那麼我們zuul的配置就完了。
2.2 api網關服務化
- 主要是配置文件的改動,改動後的application.yml配置文件如下
server:
port: 5001
spring:
application:
name: service-gateway-zuul
eureka:
client:
service-url:
defaultZone: http://localhost:9001/eureka/
- 啓動文件改造如下:
@EnableDiscoveryClient
@EnableZuulProxy
@SpringBootApplication
public class MircoServiceZuulApplication {
public static void main(String[] args) {
SpringApplication.run(MircoServiceZuulApplication.class, args);
}
}
因爲服務化改造後,zuul會自動代理所有eureka上的服務,訪問格式如下:
http://localhost:5001/{service-id}/{app-path}
- 這裏service-id指的是應用的id,就像前面我們一直所說的,spring.application.name這個名字的重要性。
- 這裏app-path指的是你服務對應的訪問目錄。
2.3 api網關中使用token機制
api網關中,可以在請求被路由之前調用,四種狀態 pre、routing、POST、error,這四種狀態的意思大家可以自行去了解一下。我們要使用的是pre狀態。
- 創建“com.example.cloud.zuul.filter.ValidateTokenFilter”類,具體實現如下:
public class ValidateTokenFilter extends ZuulFilter{
@Override
public boolean shouldFilter() {
// 是否執行此過濾
return true;
}
@Override
public Object run() throws ZuulException {
// 處理過程
RequestContext context = RequestContext.getCurrentContext() ;
HttpServletRequest request = context.getRequest() ;
Boolean bool = Boolean.valueOf(request.getParameter("token")) ;
if(bool) {
context.setSendZuulResponse(true) ; //是否路由
context.setResponseStatusCode(200);
context.set("isSuccess", true);
}else {
context.setSendZuulResponse(false) ; //是否路由
context.setResponseStatusCode(400);
context.set("isSuccess", false);
}
return null;
}
@Override
public String filterType() {
return "pre"; // 可以在請求被路由之前調用,四種狀態 pre、routing、POST、error
}
@Override
public int filterOrder() {
// 執行順序
return 10;
}
}
- 在啓動文件中加入如下代碼:
@Bean
public ZuulFilter putFilter() {
return new ValidateTokenFilter() ;
}
- 這裏我們可以看到如果訪問的參數中帶有token,且token的值爲true,api網關纔會路由,如果不帶token,那麼路由失敗,並訪問狀態爲400的錯誤。
2.4 測試
- 訪問http://localhost:5001/service-consumer/consumerHelloWorld?name=rose,我們可以看到訪問被拒絕。
- 訪問http://localhost:5001/service-consumer/consumerHelloWorld?name=rose&token=true,我們就可以看到訪問的效果。
2.5 小結
- 如果不使用api網關,那麼當我們的微服務足夠多的時候,我們無法以一下統一的地址對外提供服務。
- 沒有api網關,那麼我們的所有的服務需要鑑權必須要散落到每一個工程裏面。無法統一管理。
3.一點點重要的事情
- 教程中源代碼地址github-Spring Cloud實戰之初級入門(六)— 服務網關zuul
- 教程對應的視頻地址愛奇藝-Spring Cloud實戰之初級入門(六)— 服務網關zuul
- 最後的最後,祝大家春節快樂,紅包滾滾來!我們下一個開源項目見。