ZUUL服務網關:java
經過服務網關統一貫外界提供REST API 接口的方式web
具有路由,負載均衡,請求攔截,權限控制等功能spring
自身也是一個微服務,與其餘服務同樣註冊在Eureka上,能夠互相發現sql
zuul能感知其它服務在線狀況,根據配置的路由規則,將請求自動轉發到指定的後臺服務上,對於一些好比權限認證,token校驗,能夠放在ZuulFilter過濾去中實現apache
建立一個新的項目api
pox文件配置app
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.leo</groupId> <artifactId>zuulservice</artifactId> <version>0.0.1-SNAPSHOT</version> <name>zuulservice</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
在啓動類中添加註解 @EnableZuulProxy,開啓zuul的功能:負載均衡
@SpringBootApplication @EnableZuulProxy @EnableEurekaClient public class ZuulserviceApplication { public static void main(String[] args) { SpringApplication.run(ZuulserviceApplication.class, args); } }
修改資源文件中的配置nosql
server.port=1005 spring.application.name=service-zuul eureka.client.serviceUrl.defaultZone=http://xxxx/eureka/ zuul.routes.api-bibbon.path=/api-bibbon/** zuul.routes.api-bibbon.service-id=service-ribbon zuul.routes.api-feigin.path=/api-feigin/** zuul.routes.api-feigin.service-id=service-feigin
eureka.client.serviceUrl.defaultZone 指定註冊中心地址maven
spring.application.name 指定當前項目的服務名稱
zuul.routes.api-bibbon.path=/api-bibbon/** 表示全部以/api-bibbon/ 開頭的請求所有轉發到 service-ribbon服務上
將client、feign、ribbon、zuul項目所有啓動起來,erueka服務所有正常
這裏請求api-feign服務並轉入參數
zuul請求轉發
服務過濾
使用zuul的過濾器來作token驗證,新寫一個class去繼承ZullFilter 會要實現過濾器中的方法
@Component public class MyFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(MyFilter.class); @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(); log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString())); Object accessToken = request.getParameter("token"); if(accessToken == null) { log.warn("token is empty"); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); try { ctx.getResponse().getWriter().write("token is empty"); }catch (Exception e){} return null; } log.info("ok"); return null; } }
filterType:返回一個字符串表明過濾器的類型,在zuul中定義了四種不一樣生命週期的過濾器類型,具體以下:
pre:路由以前
routing:路由之時
post: 路由以後
error:發送錯誤調用
filterOrder:過濾的順序
shouldFilter:這裏能夠寫邏輯判斷,是否要過濾,本文true,永遠過濾。
run:過濾器的具體邏輯。可用很複雜,包括查sql,nosql去判斷該請求到底有沒有權限訪問。
此時請求時,參數沒有token的時候會拋出filter中訂單的token爲空的錯誤
加上token,調用成功