《springcloud 二》SrpingCloud Zuul 微服務閘道器搭建

x號開發者發表於2019-04-09

閘道器作用

 

閘道器的作用,可以實現負載均衡、路由轉發、日誌、許可權控制、監控等。

閘道器與過濾器區別

 

閘道器是攔截所有伺服器請求進行控制

過濾器攔截某單個伺服器請求進行控制

 

Nginx與Zuul的區別

Nginx是採用伺服器負載均衡進行轉發

Zuul依賴Ribbon和eureka實現本地負載均衡轉發

相對來說Nginx功能比Zuul功能更加強大,能夠整合其他語言比如lua指令碼實現強大的功能,同時Nginx可以更好的抗高併發,Zuul閘道器適用於請求過濾和攔截等。

 

 

Zuul閘道器

zuul是spring cloud的一個推薦元件,https://github.com/Netflix/zuul

 

使用Zuul實現反向代理

環境搭建
Maven依賴資訊
<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.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!-- SpringBoot整合eureka客戶端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <!-- 注意: 這裡必須要新增, 否者各種依賴有問題 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
application.yml
###註冊 中心
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8100/eureka/
server:
  port: 80
###閘道器名稱
spring:
  application:
    name: service-zuul
### 配置閘道器反向代理    
zuul:
  routes:
    api-a:
     ### 以 /api-member/訪問轉發到會員服務
      path: /api-member/**
      serviceId: app-itmayiedu-member
    api-b:
        ### 以 /api-order/訪問轉發到訂單服務
      path: /api-order/**
      serviceId: app-itmayiedu-order

使用Zuul整合Ribbon

 

Zuul 預設開啟了 Ribbon本地負載均衡功能。

 

使用Zuul過濾器

@Component
public class TokenFilter extends ZuulFilter {

    public Object run() throws ZuulException {
        // 獲取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        String userToken = request.getParameter("userToken");
        if (StringUtils.isEmpty(userToken)) {
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseStatusCode(401);
            currentContext.setResponseBody("userToken is null");
            return null;
        }
        // 否則正常執行業務邏輯.....
        return null;
    }

    // 判斷過濾器是否生效
    public boolean shouldFilter() {

        return true;
    }

    // 過濾器的執行順序。當請求在一個階段的時候存在多個多個過濾器時,需要根據該方法的返回值依次執行
    public int filterOrder() {

        return 0;
    }

    // 過濾器型別 pre 表示在 請求之前進行攔截
    public String filterType() {

        return "pre";
    }

}

 

相關文章