zuul 自定義路由規則

weixin_33751566發表於2018-12-27

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);
    }

}

3793531-4e00f2bb1c6a197f.png
微服務那些事兒+Spring Cloud微服務實戰+Spring Cloud與Docker微服務架構實戰,點選這裡購買

歡迎新增學習交流QQ群:66728073,197321069,398808948

相關文章