一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談Spring Cloud中的API網關服務Zuul

淺談Spring Cloud中的API網關服務Zuul

2021-01-28 11:51_江南一點雨 Java教程

這篇文章主要介紹了淺談Spring Cloud中的API網關服務Zuul,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

到目前為止,我們spring cloud中的內容已經介紹了很多了,ribbon、hystrix、feign這些知識點大家都耳熟能詳了,我們在前文也提到過微服務就是把一個大的項目拆分成很多小的獨立模塊,然后通過服務治理讓這些獨立的模塊配合工作等。那么大家來想這樣兩個問題:1.如果我的微服務中有很多個獨立服務都要對外提供服務,那么對于開發人員或者運維人員來說,他要如何去管理這些接口?特別是當項目非常大非常龐雜的情況下要如何管理?2.權限管理也是一個老生常談的問題,在微服務中,一個獨立的系統被拆分成很多個獨立的模塊,為了確保安全,我難道需要在每一個模塊上都添加上相同的鑒權代碼來確保系統不被非法訪問?如果是這樣的話,那么工作量就太大了,而且維護也非常不方便。

為了解決上面提到的問題,我們引入了api網關的概念,api網關是一個更為智能的應用服務器,它有點類似于我們微服務架構系統的門面,所有的外部訪問都要先經過api網關,然后api網關來實現請求路由、負載均衡、權限驗證等功能。spring cloud中提供的spring cloud zuul實現了api網關的功能,本文我們就先來看看spring cloud zuul的一個基本使用。

構建網關

網關的構建我們通過下面三個步驟來實現。

1.創建spring boot工程并添加依賴

首先我們創建一個普通的spring boot工程名為api-gateway,然后添加相關依賴,這里我們主要添加兩個依賴spring-cloud-starter-zuul和spring-cloud-starter-eureka,spring-cloud-starter-zuul依賴中則包含了ribbon、hystrix、actuator等,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<parent>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-parent</artifactid>
  <version>1.5.7.release</version>
  <relativepath/> <!-- lookup parent from repository -->
</parent>
<properties>
  <project.build.sourceencoding>utf-8</project.build.sourceencoding>
  <project.reporting.outputencoding>utf-8</project.reporting.outputencoding>
  <java.version>1.8</java.version>
  <spring-cloud.version>dalston.sr3</spring-cloud.version>
</properties>
<dependencies>
  <dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter</artifactid>
  </dependency>
  <dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-starter-zuul</artifactid>
  </dependency>
  <dependency>
    <groupid>org.springframework.cloud</groupid>
    <artifactid>spring-cloud-starter-eureka</artifactid>
  </dependency>
</dependencies>
<dependencymanagement>
  <dependencies>
    <dependency>
      <groupid>org.springframework.cloud</groupid>
      <artifactid>spring-cloud-dependencies</artifactid>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencymanagement>

2.添加注解

然后在入口類上添加@enablezuulproxy注解表示開啟zuul的api網關服務功能,如下:

?
1
2
3
4
5
6
7
8
@springbootapplication
@enablezuulproxy
public class apigatewayapplication {
 
  public static void main(string[] args) {
    springapplication.run(apigatewayapplication.class, args);
  }
}

3.配置路由規則

application.properties文件中的配置可以分為兩部分,一部分是zuul應用的基礎信息,還有一部分則是路由規則,如下:

?
1
2
3
4
5
6
7
8
9
# 基礎信息配置
spring.application.name=api-gateway
server.port=2006
# 路由規則配置
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceid=feign-consumer
 
# api網關也將作為一個服務注冊到eureka-server上
eureka.client.service-url.defaultzone=http://localhost:1111/eureka/

我們在這里配置了路由規則所有符合/api-a/**的請求都將被轉發到feign-consumer服務上,至于feign-consumer服務的地址到底是什么則由eureka-server去分析,我們這里只需要寫上服務名即可。以上面的配置為例,如果我請求 http://localhost:2006/api-a/hello1 接口則相當于請求 http://localhost:2005/hello1 (我這里feign-consumer的地址為 http://localhost:2005 ),我們在路由規則中配置的api-a是路由的名字,可以任意定義,但是一組path和serviceid映射關系的路由名要相同。

ok,做好這些之后,我們依次啟動我們的eureka-server、provider和feign-consumer,然后訪問如下地址 http://localhost:2006/api-a/hello1 ,訪問結果如下:

淺談Spring Cloud中的API網關服務Zuul

看到這個效果說明我們的api網關服務已經構建成功了,我們發送的符合路由規則的請求自動被轉發到相應的服務上去處理了。

請求過濾

構建好了網關,接下來我們就來看看如何利用網關來實現一個簡單的權限驗證。這里就涉及到了spring cloud zuul中的另外一個核心功能:請求過濾。請求過濾有點類似于java中filter過濾器,先將所有的請求攔截下來,然后根據現場情況做出不同的處理,這里我們就來看看zuul中的過濾器要如何使用。很簡單,兩個步驟:

1.定義過濾器

首先我們定義一個過濾器繼承自zuulfilter,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class permisfilter extends zuulfilter {
  @override
  public string filtertype() {
    return "pre";
  }
 
  @override
  public int filterorder() {
    return 0;
  }
 
  @override
  public boolean shouldfilter() {
    return true;
  }
 
  @override
  public object run() {
    requestcontext ctx = requestcontext.getcurrentcontext();
    httpservletrequest request = ctx.getrequest();
    string login = request.getparameter("login");
    if (login == null) {
      ctx.setsendzuulresponse(false);
      ctx.setresponsestatuscode(401);
      ctx.addzuulresponseheader("content-type","text/html;charset=utf-8");
      ctx.setresponsebody("非法訪問");
    }
    return null;
  }
}

關于這個類我說如下幾點:

1.filtertype方法的返回值為過濾器的類型,過濾器的類型決定了過濾器在哪個生命周期執行,pre表示在路由之前執行過濾器,其他可選值還有post、error、route和static,當然也可以自定義。

2.filterorder方法表示過濾器的執行順序,當過濾器很多時,這個方法會有意義。

3.shouldfilter方法用來判斷過濾器是否執行,true表示執行,false表示不執行,在實際開發中,我們可以根據當前請求地址來決定要不要對該地址進行過濾,這里我直接返回true。

4.run方法則表示過濾的具體邏輯,假設請求地址中攜帶了login參數的話,則認為是合法請求,否則就是非法請求,如果是非法請求的話,首先設置ctx.setsendzuulresponse(false);表示不對該請求進行路由,然后設置響應碼和響應值。這個run方法的返回值在當前版本(dalston.sr3)中暫時沒有任何意義,可以返回任意值。

2.配置過濾器bean

然后在入口類中配置相關的bean即可,如下:

?
1
2
3
4
@bean
permisfilter permisfilter() {
  return new permisfilter();
}

此時,如果我們訪問 http://localhost:2006/api-a/hello1 ,結果如下:

淺談Spring Cloud中的API網關服務Zuul

如果給請求地址加上login參數,則結果如下:

淺談Spring Cloud中的API網關服務Zuul

總結

到這里小伙伴們應該已經見識到spring cloud zuul的強大之處了吧,api網關作為系統的的統一入口,將微服務中的內部細節都屏蔽掉了,而且能夠自動的維護服務實例,實現負載均衡的路由轉發,同時,它提供的過濾器為所有的微服務提供統一的權限校驗機制,使得服務自身只需要關注業務邏輯即可。

zuul的入門知識我們就先介紹到這里,小伙伴們有問題歡迎留言討論。以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/u012702547/article/details/78391052?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色天天综合色天天看 | 国产香蕉一区二区精品视频 | 91国语精品自产拍在线观看一 | 欧美视频久久 | 亚洲欧美成人中文在线网站 | 免费视频片在线观看 | 午夜dj免费视频观看社区 | 欧美人在线一区二区三区 | 亚1洲二区三区四区免费 | 美女把小内内脱个精光打屁屁 | 成人看的羞羞视频免费观看 | 俄罗斯毛片免费大全 | 亚洲香蕉综合在人在线视看 | 美女做又爽又黄又猛 | 日本一区二区不卡久久入口 | 2022天堂岛日产 | 99精品久久精品一区二区小说 | 精品一区二区国语对白 | 日韩欧美精品 | 色99视频 | 欧美日韩在线一区 | 欧美18-19| chinese高中生gay男同 | 乳女教师欲乱动漫无修版动画3d | 人人澡人| 男人的天堂久久 | 亚洲国产精品久久久久 | 欧美日韩亚洲另类人人澡 | 91免费精品国自产拍在线不卡 | 免费视频亚洲 | 欧美最猛性xxxxx69交 | 国产精品午夜性视频网站 | 白丝女榨干蹂躏我 | 日本免费全黄一级裸片视频 | 美女插插视频 | 国产一卡2卡3卡四卡高清 | 无遮挡免费h肉动漫在线观看 | 好男人资源免费观看 | 99精品国产成人a∨免费看 | 色综合天天综合中文网 | 精品综合久久久久久97超人 |