Zuul 網(wǎng)關(guān)路由

Zuul 網(wǎng)關(guān)路由

路由是微服務架構(gòu)中不可或缺的一部分,例如:/api/user映射到user服務,/api/shop映射到shop服務。
Zuul是一個基于JVM的路由和服務端的負載均衡器。Zuul的規(guī)則引擎是用JVM語言寫的,支持Java和Groovy。

一、如何使用Zuul

首先我們引入zuul的jar包,由于zuul要從注冊中心尋找服務,所以也要引入eureka-client的jar包。

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
</dependencies>

并且在啟動類上加上注解@EnableZuulProxy。

@SpringBootApplication
@EnableZuulProxy
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

接下來,我們看看如何配置我們的路由,在yml中配置如下:

zuul:
  routes:
    service-order: /myorders/**

所有/myorders的請求都會轉(zhuǎn)發(fā)到service-order服務,例如:/myorders/order/detail會轉(zhuǎn)發(fā)到/order/detail。
zuul.routes是一個map,上面這種方式是簡便的寫法,key對應服務id,value對應訪問路徑。
為了獲得細粒度的控制,配置應按照如下的方式寫:

zuul:
  routes:
    service-order:
      path: /myorders/**
      serviceId: service-order

routes的key可以任意,只要保證唯一即可,routes的value中,path對應訪問路徑,serviceId對應服務id。

為了防止服務被自動的添加,我們增加如下配置:

zuul:
  ignoredServices: '*'
  routes:
    service-order:
      path: /myorders/**
      serviceId: service-order

上面配置的意思是除了service-order服務,其他服務都忽略掉。

除了映射服務,我們也可以映射url,如下:

zuul:
  ignoredServices: '*'
  routes:
    service-order:
      path: /myorders/**
      url: http://order.example.com/order_service

如果我們在轉(zhuǎn)發(fā)時,不想忽略前綴,可以設(shè)置zuul.stripPrefix=false

我們啟動之前的eureka注冊中心、service-order-1、service-order-2和這次的zuul服務,我們訪問
http://localhost:8080/myorders/order/detail,并不斷刷新,返回結(jié)果如下:

{"id":123123,"totalPrice":87.98,"orderStatus":"未支付"}
{"id":123123,"totalPrice":87.98,"orderStatus":"已付款"}

說明zuul已經(jīng)將請求轉(zhuǎn)發(fā)到了service-order服務,并實現(xiàn)了負載均衡。

二、Cookie和敏感頭部信息的轉(zhuǎn)發(fā)

你可以在同一個系統(tǒng)的服務之間共享header信息,但不想將敏感的header信息轉(zhuǎn)發(fā)到外部系統(tǒng),你可以在routes中配置忽略的header信息。
Cookie是一個重要的角色,因為它是被認為敏感的。在做轉(zhuǎn)發(fā)時,我們可以設(shè)置不轉(zhuǎn)發(fā)。
其中,Cookie,Set-Cookie,Authorization是默認不轉(zhuǎn)發(fā)的。如果后臺服務需要,我們可以設(shè)置一個空的List

zuul:
  ignoredServices: '*'
  routes:
    service-order:
      path: /myorders/**
      serviceId: service-order
  sensitiveHeaders:

sensitiveHeaders放在zuul下,是通用的配置,對所有的轉(zhuǎn)發(fā)都生效。也可以放在routes的每一個entry下,只對當前的轉(zhuǎn)發(fā)規(guī)則有效。
我們改造一下service-order,將cookie打印出來。

@RequestMapping("detail")
public Order getOrderInfo(HttpServletRequest request, HttpServletResponse response){
    System.out.println("cookie : "+request.getCookies());
    if (request.getCookies()!=null&&request.getCookies().length>0){
        for (Cookie cookie : request.getCookies()) {
            System.out.println(cookie.getName()+":"+cookie.getValue());
        }
    }

    Cookie cookie = new Cookie("zuul","test");
    response.addCookie(cookie);
    return order;
}

重啟兩個service-order,訪問zuul,后臺打印結(jié)果如下:

cookie : [Ljavax.servlet.http.Cookie;@5ddaf631
zuul:test
UM_distinctid:1635c7498fc835-0e31e368c7058d-f373567-fa000-1635c7498fd31c
Hm_lvt_843ed5a4bd8ee47602fc045103b88cd7:1526264538
CNZZDATA1256538031:1367993951-1526263181-null%7C1526280080
Idea-12589d:10a72288-7f81-410b-9b97-b5fb28153a0d
JSESSIONID:6D27CF78C556DD7DFFD5422E71951BAA

說明cookie轉(zhuǎn)發(fā)成功,我們將sensitiveHeaders注釋掉,重啟zuul服務并訪問
后臺結(jié)果如下:

cookie : null

說明cookie并沒有轉(zhuǎn)發(fā)。

項目示例:https://github.com/liubo-tech/spring-cloud-eureka。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容