zuul 自定義路由規則
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
相關文章
- 線上debug&gateway自定義路由規則Gateway路由
- Laravel 自定義規則Laravel
- ETL中如何自定義規則
- Laravel 自定義表單驗證-自定義驗證規則Laravel
- jQuery Validate新增自定義驗證規則jQuery
- HTML5 pattern自定義驗證規則HTML
- 團隊自定義 tslint & eslint 詳細規則EsLint
- 自定義Mybatis自動生成程式碼規則MyBatis
- Laravel 自定義驗證規則的問題Laravel
- 使用jakarta.validation自定義校驗規則
- 關於laravel使用自定義驗證規則後某些規則不生效Laravel
- 【ASP.NET Core】MVC控制器的各種自定義:特性化的路由規則ASP.NETMVC路由
- springboot+zuul(一)------實現自定義過濾器、動態路由、動態負載。Spring BootZuul過濾器路由負載
- 微服務的Zuul萬用字元規則微服務Zuul字元
- WPF自定義路由事件路由事件
- Dubbo 路由規則之標籤路由路由
- [Laravel] 自定義配置你的密碼驗證規則Laravel密碼
- 【Laravel】 自定義配置你的密碼驗證規則Laravel密碼
- 靜態路由規則配置路由
- Spring Boot 之groups應對不同的Validation規則自定義Spring Boot
- 03--元件註冊-自定義TypeFilter指定過濾規則元件Filter
- SELinux: 如何讓selinux對某些命令放行,自定義selinux規則。Linux
- SQL稽核 | SQLE 如何開發一條自定義的規則SQL
- Zuul路由閘道器Zuul路由
- Zuul- 路由載入Zuul路由
- Logback中如何自定義靈活的日誌過濾規則
- 十分鐘瞭解eslint配置 && 編寫自定義eslint規則EsLint
- vue router路由自定義後退事件Vue路由事件
- 在.NET 6.0中自定義介面路由路由
- Django(6)自定義路由轉換器Django路由
- WAF開放規則定義權:專家策略+使用者自定義策略=Web安全Web
- Laravel重寫資源路由自定義URLLaravel路由
- Laravel-Admin Form 元件 自定義提交路由LaravelORM元件路由
- Flutter 建立自定義路由過渡動畫Flutter路由動畫
- laravel8中的路由規則更改Laravel路由
- win10怎麼自定義防火牆入站規則_win10設定防火牆入站規則的方法Win10防火牆
- ESLint可共享配置釋出,團隊自定義ESLint規則新鮮出爐EsLint
- element-ui自定義表單校驗規則及常用表單校驗UI