1,zuul的maven配置
<!--spring cloud 相關包-->
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<!-- zuul依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2,靜態路徑配置
比如現在我有兩個服務,一個服務叫gate 即zuul 網關,一個服務叫service-a ,是網關后面的一個服務,這里面service-a即是:
application.yml
spring:
application:
name:service-a
路由配置1:
zuul: routes: service-a: /node/**
這個意思是,gate 收到一個瀏覽器的請求,比如:http://localhost:8080/node/student/getStudents,那么就會轉發給service-a,注意service-a提供的接口不能帶node了,應該是:
@RestController @RequestMapping("stduent") public class TestController { @RequestMapping("getStudents") public Object getStudents() { return null; } }
3,動態配置路由規則
有時候,我們會經常添加一些新的路由規則,每次靜態添加不僅多而且麻煩,還會重新啟動網關,這時就需要動態配置路由規則了,可以使用代碼實現。
在zuul中,默認使用的路徑類是:SimpleRouteLocator.java
在它的bean配置類:ZuulServerAutoConfiguration.java中是這樣配置的
@Bean @ConditionalOnMissingBean(SimpleRouteLocator.class) public SimpleRouteLocator simpleRouteLocator() { return new SimpleRouteLocator(this.server.getServlet().getServletPrefix(), this.zuulProperties); }
它表示當沒有此類型SimpleRouteLocator.class的實現時,使用這個bean,所以我們要實現自己的路由配置,只需要重新實現相關的方法即可。
首先實現一個路由規則加載類
import java.util.LinkedHashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.netflix.zuul.filters.RefreshableRouteLocator; import org.springframework.cloud.netflix.zuul.filters.SimpleRouteLocator; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; /** * * @ClassName: LogServerRouterFilter * @Description: 日志請求相關路由分發到指定的服務器 * @author: wgs * @date: 2018年12月18日 下午3:06:00 */ public class LogServerRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator { @Autowired private ServerConfigService serverConfigService; public LogServerRouteLocator(String servletPath, ZuulProperties properties) { super(servletPath, properties); } @Override public void refresh() { doRefresh(); } //覆蓋這個方法,從重實現它 @Override protected Map<String, ZuulProperties.ZuulRoute> locateRoutes() { //重新定義一個路由映射map LinkedHashMap<String, ZuulProperties.ZuulRoute> routesMap = new LinkedHashMap<>();
//把父類中的映射繼承下來,它主要是從配置文件中取的映射。 routesMap.putAll(super.locateRoutes());
//這里的路由信息來自於配置文件 for (Map.Entry<String, String> entry : serverConfigService.getGmNodes().entrySet()) { String serverId = entry.getKey(); String serviceId = entry.getValue().toLowerCase(); String path = "/node/**"; ZuulRoute zuulRoute = new ZuulRoute(); //服務提供者的id,即spring.application.name zuulRoute.setServiceId(serviceId); //這個id是匹配的前半部分,比如匹配模式是/node/** 那么這個id就是/node zuulRoute.setId("/node"); //匹配的路徑 zuulRoute.setPath(path);
//這里注意一下,這個key就是要匹配的path,可以查看父類的實現,它就是使用path做為key的。 routesMap.put(path, zuulRoute); }return routesMap; } }
上面 ZuulRoute的創建路由規則和靜態配置是等價的。
然配置Bean
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class BeanConfig { @Autowired ZuulProperties zuulProperties; @Autowired ServerProperties server; @Bean public LogServerRouteLocator getRouteLocator() { return new LogServerRouteLocator(this.server.getServlet().getServletPrefix(), this.zuulProperties); } }
歡迎添加學習交流QQ群:66728073,197321069,398808948