網關就是做一下過濾或攔截
操作 讓我們的服務更加安全 用戶訪問我們服務的時候就要先通過網關 然后再由網關轉發到我們的微服務
1. 新建一個網關服務Module
2. 依然選擇springboot工程
3. 老規矩起個名字
4. 勾選注冊中心客戶端
5. 勾選zuul網關模塊
6. 編寫配置文件
server: # 服務端口號 port: 8085 spring: application: # 服務名稱 - 服務之間使用名稱進行通訊 name: service-zuul eureka: client: service-url: # 填寫注冊中心服務器地址 defaultZone: http://localhost:8081/eureka zuul: routes: # 設置服務a 路徑名稱 隨便起 service-a: path: /service-a/** # 這里寫a服務的注冊名字 serviceId: service-objcat-a # 設置服務b 路徑名稱 隨便起 service-b: path: /service-b/** # 這里寫b服務的注冊名字 serviceId: service-objcat-b
7. 創建一個包 名字是com.objcat.filter,
創建一個類TokenFilter繼承ZuulFilter
用來實現過濾規則
8. 重寫ZuulFilter中的方法,在run()方法中編寫過濾邏輯
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; public class TokenFilter extends ZuulFilter { /** * 過濾器類型 pre表示在請求之前進行邏輯操作 */ @Override public String filterType() { return "pre"; } /** * 過濾器執行順序 * 當一個請求在同一個階段存在多個過濾器的時候 過濾器的執行順序 */ @Override public int filterOrder() { return 0; } /** * 是否開啟過濾 */ @Override public boolean shouldFilter() { return true; } /** * 編寫過濾器攔截業務邏輯代碼 */ @Override public Object run() { RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletRequest request = currentContext.getRequest(); String token = request.getParameter("token"); if (token == null) { currentContext.setSendZuulResponse(false); currentContext.setResponseBody("token is null"); currentContext.setResponseStatusCode(401); } return null; } }
邏輯很簡單 就是校驗客戶端發來的請求token是否為空 如果為空就不能通過 返回 token is null
9. 配置網關入口文件, 這個地方千萬不要忘記實例化出來filter
否則不生效
import com.example.servicezuul.filter.TokenFilter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; @SpringBootApplication // 添加注解聲明是注冊中心客戶端 @EnableEurekaClient // 開啟網管 @EnableZuulProxy public class ServiceZuulApplication { public static void main(String[] args) { SpringApplication.run(ServiceZuulApplication.class, args); } // 實例化tokenfilter,否則網管不生效 @Bean TokenFilter tokenFilter(){ return new TokenFilter(); } }
10. 通過網關訪問a服務
只需要使用 網關的地址 + 網關的端口號 + 服務的別名路徑(配置文件中配置) + api名稱
就可以訪問了
http://localhost:8085/service-a/testA
http://localhost:8085/service-a/testA?token=123
當沒有token的時候返回就是 token is null,
當token有值的時候就可以正常進行訪問了
這種網關轉發之后的請求 就叫做反向代理你可以隱藏你本地的服務器的真實地址
只暴露給外界網關的地址 然后由網關轉發給服務器 從而做到安全性更高