1. 程式人生 > >Zuul閘道器服務使用詳解

Zuul閘道器服務使用詳解

    1)在SpringBoot工程 part-1-website 中新增依賴,如下
		<!-- spring-cloud-starter-hystrix -->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-zuul</artifactId>
	</dependency>
        
    <parent>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-parent</artifactId>
		<version>Dalston.SR1</version>
		<relativePath />
	</parent>
    2)在Application上新增@EnableZuulProxy註解,開啟Zuul閘道器服務
@EnableZuulProxy
public class WebsiteApp {
}
    3)設定該工程應用名稱、埠號等資訊
# 應用名稱
spring:
  application:
    name: part-1-website
#埠
server:
  port: 1102
    以上即成功構建應用,以下為請求路由方式
3.Zuul的幾種請求路由方式     準備工作:
        1)啟動一個高可用的Eureka-server
        2)建立一個服務應用,以對外提供介面服務
        3)複製一份該服務端服務,除了埠號不一致其他都保持一致,尤其spring.application.name要保持一致,用於驗證在外部請求到達時是否負載均衡
        筆者在本示例中服務應用名稱設定為 part-1-sms-interface ,全部四個應用啟動後,訪問eureka可看到
    以上:PART-1-EUREKA即為高可用eureka-server;PART-1-SMS-INTERFACE即為對外服務應用,提供/sms/test服務
    1)傳統路由
    * 單例項配置(通過zuul.routes.<route>.path和zuul.routes.<route>.url引數對的方式來配置)
    在application.properties檔案中新增路由規則即可
#route rule
zuul.routes.part-1-website.path=/part-1-website/**
zuul.routes.part-1-website.url=http://localhost:1109/
    注意:以上規則即說明,對當前website應用的所有以 /part-1-website開始的請求路徑全部轉發到http://localhost:1109上;         如果是請求localhost:1102/part-1-website/sms/test即會轉發到localhost:1109/sms/test上,即實現對PART-1-SMS-INTERFACE的服務訪問
    * 多例項配置(通過zuul.routes.<route>.path和zuul.routes.<route>.serviceId引數對的方式來配置)
    在application.properties檔案中新增如下路由規則即可
zuul.routes.part-1-website.path=/part-1-website/**
zuul.routes.part-1-website.serviceId=website
website.ribbon.listOfServers=http://localhost:1108/,http://localhost:1109/
    注意:與單例項不同就是:通過serviceId和listOfServers來確定path和url的對應關係;           website讀者可自定義,只要保持與listOfServers保持一致即可,servers值即PART-1-SMS-INTERFACE服務對應的應用IP:埠    
    2)服務路由配置
    通過Zuul和Eureka的整合,實現對服務例項的自動化維護
    在這種情況下,我們不需要像傳統路由那樣為serviceId指定具體的服務例項地址,只需要將path和serviceId對應上
    注意:實現這種方式,需要引入eureka依賴,並將zuul例項註冊到eureka中
    在application.properties檔案中新增如下路由規則
zuul.routes.part-1-website.path=/part-1-website/**
zuul.routes.part-1-website.service-id=part-1-sms-interface

eureka.client.service-url.defaultZone=http://eureka1:1001/eureka/
    注意:service-id即為要呼叫的服務名稱;需要將本應用註冊到eureka
4.過濾器     過濾負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎。
    Zuul的過濾器使用方式如下:
    1)建立一個類,繼承com.netflix.zuul.ZuulFilter
public class AccessFilter extends ZuulFilter{

	@Override
	public boolean shouldFilter() {
		return true;
	}

	@Override
	public Object run() {
		RequestContext context = RequestContext.getCurrentContext();
		HttpServletRequest request = context.getRequest();
		//也可獲取其他引數,如response、
		String token = request.getParameter("accessToken");
		if(StringUtils.isEmpty(token)){
			context.setSendZuulResponse(false);
			context.setResponseStatusCode(401);
			context.setResponseBody("has no accessToken");
		}
		return null;
	}

	@Override
	public String filterType() {
		return "pre";
	}

	@Override
	public int filterOrder() {
		return 0;
	}
}
    注意:需實現ZuulFilter的abstract方法;
        shouldFilter:true表示需要過濾;false表示不需要
        filterType:             * pre 請求被路由之前被呼叫(一般做一些前置加工)             * route 在路由請求時呼叫(將外部請求轉發到具體的服務例項上)             * post 路由請求返回時呼叫(包裝加工返回資訊)             * error 處理請求發生錯誤時呼叫
        filterOrder:通過數字來表示filter的執行順序
        run:做真正的邏輯處理
    2)在Application下建立@Bean,將此Filter作為一個bean注入
	@Bean
	public AccessFilter accessFilter(){
		return new AccessFilter();
	}
    3)重啟應用後,發出請求,如果request中沒有新增AccessToken,則會收到報錯,說明Filter生效
參考:Spring Cloud微服務實戰