最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul

 更新時(shí)間:2017年10月30日 14:12:32   作者:_江南一點(diǎn)雨  
這篇文章主要介紹了淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

為了解決上面提到的問題,我們引入了API網(wǎng)關(guān)的概念,API網(wǎng)關(guān)是一個(gè)更為智能的應(yīng)用服務(wù)器,它有點(diǎn)類似于我們微服務(wù)架構(gòu)系統(tǒng)的門面,所有的外部訪問都要先經(jīng)過API網(wǎng)關(guān),然后API網(wǎng)關(guān)來實(shí)現(xiàn)請求路由、負(fù)載均衡、權(quán)限驗(yàn)證等功能。Spring Cloud中提供的Spring Cloud Zuul實(shí)現(xiàn)了API網(wǎng)關(guān)的功能,本文我們就先來看看Spring Cloud Zuul的一個(gè)基本使用。

構(gòu)建網(wǎng)關(guān)

網(wǎng)關(guān)的構(gòu)建我們通過下面三個(gè)步驟來實(shí)現(xiàn)。

1.創(chuàng)建Spring Boot工程并添加依賴

首先我們創(chuàng)建一個(gè)普通的Spring Boot工程名為api-gateway,然后添加相關(guān)依賴,這里我們主要添加兩個(gè)依賴spring-cloud-starter-zuul和spring-cloud-starter-eureka,spring-cloud-starter-zuul依賴中則包含了ribbon、hystrix、actuator等,如下:

<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網(wǎng)關(guān)服務(wù)功能,如下:

@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {

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

3.配置路由規(guī)則

application.properties文件中的配置可以分為兩部分,一部分是Zuul應(yīng)用的基礎(chǔ)信息,還有一部分則是路由規(guī)則,如下:

# 基礎(chǔ)信息配置
spring.application.name=api-gateway
server.port=2006
# 路由規(guī)則配置
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=feign-consumer

# API網(wǎng)關(guān)也將作為一個(gè)服務(wù)注冊到eureka-server上
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/

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

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

這里寫圖片描述 

看到這個(gè)效果說明我們的API網(wǎng)關(guān)服務(wù)已經(jīng)構(gòu)建成功了,我們發(fā)送的符合路由規(guī)則的請求自動(dòng)被轉(zhuǎn)發(fā)到相應(yīng)的服務(wù)上去處理了。

請求過濾

構(gòu)建好了網(wǎng)關(guān),接下來我們就來看看如何利用網(wǎng)關(guān)來實(shí)現(xiàn)一個(gè)簡單的權(quán)限驗(yàn)證。這里就涉及到了Spring Cloud Zuul中的另外一個(gè)核心功能:請求過濾。請求過濾有點(diǎn)類似于Java中Filter過濾器,先將所有的請求攔截下來,然后根據(jù)現(xiàn)場情況做出不同的處理,這里我們就來看看Zuul中的過濾器要如何使用。很簡單,兩個(gè)步驟:

1.定義過濾器

首先我們定義一個(gè)過濾器繼承自ZuulFilter,如下:

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

關(guān)于這個(gè)類我說如下幾點(diǎn):

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

2.filterOrder方法表示過濾器的執(zhí)行順序,當(dāng)過濾器很多時(shí),這個(gè)方法會(huì)有意義。

3.shouldFilter方法用來判斷過濾器是否執(zhí)行,true表示執(zhí)行,false表示不執(zhí)行,在實(shí)際開發(fā)中,我們可以根據(jù)當(dāng)前請求地址來決定要不要對該地址進(jìn)行過濾,這里我直接返回true。

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

2.配置過濾器Bean

然后在入口類中配置相關(guān)的Bean即可,如下:

@Bean
PermisFilter permisFilter() {
  return new PermisFilter();
}

此時(shí),如果我們訪問 http://localhost:2006/api-a/hello1 ,結(jié)果如下:

這里寫圖片描述 

如果給請求地址加上login參數(shù),則結(jié)果如下:

這里寫圖片描述 

總結(jié)

到這里小伙伴們應(yīng)該已經(jīng)見識到Spring Cloud Zuul的強(qiáng)大之處了吧,API網(wǎng)關(guān)作為系統(tǒng)的的統(tǒng)一入口,將微服務(wù)中的內(nèi)部細(xì)節(jié)都屏蔽掉了,而且能夠自動(dòng)的維護(hù)服務(wù)實(shí)例,實(shí)現(xiàn)負(fù)載均衡的路由轉(zhuǎn)發(fā),同時(shí),它提供的過濾器為所有的微服務(wù)提供統(tǒng)一的權(quán)限校驗(yàn)機(jī)制,使得服務(wù)自身只需要關(guān)注業(yè)務(wù)邏輯即可。

Zuul的入門知識我們就先介紹到這里,小伙伴們有問題歡迎留言討論。以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot feign動(dòng)態(tài)設(shè)置數(shù)據(jù)源(https請求)

    SpringBoot feign動(dòng)態(tài)設(shè)置數(shù)據(jù)源(https請求)

    這篇文章主要介紹了SpringBoot如何在運(yùn)行時(shí)feign動(dòng)態(tài)添加數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java線程池實(shí)現(xiàn)原理詳解

    Java線程池實(shí)現(xiàn)原理詳解

    在面向?qū)ο缶幊讨?,?chuàng)建和銷毀對象是很費(fèi)時(shí)間的,因?yàn)閯?chuàng)建一個(gè)對象要獲取內(nèi)存資源或者其它更多資源,在Java中更是如此,虛擬機(jī)將試圖跟蹤每一個(gè)對象,以便能夠在對象銷毀后進(jìn)行垃圾回收,本文將對Java線程池實(shí)現(xiàn)原理進(jìn)行詳細(xì)介紹,需要的朋友可以參考下
    2023-07-07
  • Mybatis?Example的高級用法詳解

    Mybatis?Example的高級用法詳解

    這篇文章主要介紹了Mybatis?Example的高級用法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 一文帶你掌握J(rèn)ava判斷字符串是否為數(shù)字的5種實(shí)現(xiàn)方法

    一文帶你掌握J(rèn)ava判斷字符串是否為數(shù)字的5種實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了Java判斷字符串是否為數(shù)字的5種實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,大家可以根據(jù)需要進(jìn)行選擇
    2026-03-03
  • 淺談java的接口和C++虛類的相同和不同之處

    淺談java的接口和C++虛類的相同和不同之處

    下面小編就為大家?guī)硪黄獪\談java的接口和C++虛類的相同和不同之處。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-12-12
  • System 類 和 Runtime 類的常用用法介紹

    System 類 和 Runtime 類的常用用法介紹

    這篇文章主要介紹了System 類 和 Runtime 類的常用用法,有需要的朋友可以參考一下
    2014-01-01
  • 利用Jackson解析JSON的詳細(xì)實(shí)現(xiàn)教程

    利用Jackson解析JSON的詳細(xì)實(shí)現(xiàn)教程

    JSON對于開發(fā)者并不陌生,如今的WEB服務(wù)等都是以JSON作為數(shù)據(jù)交換的格式。學(xué)習(xí)JSON格式的操作工具對開發(fā)者來說是必不可少的。本文將介紹如何使用Jackson開源工具庫對JSON進(jìn)行常見操作,需要的可以參考一下
    2022-07-07
  • Java構(gòu)建工具Gradle的安裝和使用圖文教程

    Java構(gòu)建工具Gradle的安裝和使用圖文教程

    Gradle?是一個(gè)功能強(qiáng)大的構(gòu)建工具,支持自動(dòng)化和定制化的構(gòu)建過程,下面這篇文章主要介紹了Java構(gòu)建工具Gradle的安裝和使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • Java多線程+鎖機(jī)制實(shí)現(xiàn)簡單模擬搶票的項(xiàng)目實(shí)踐

    Java多線程+鎖機(jī)制實(shí)現(xiàn)簡單模擬搶票的項(xiàng)目實(shí)踐

    鎖是一種同步機(jī)制,用于控制對共享資源的訪問,在線程獲取到鎖對象后,可以執(zhí)行搶票操作,本文主要介紹了Java多線程+鎖機(jī)制實(shí)現(xiàn)簡單模擬搶票的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Spring-全面詳解(學(xué)習(xí)總結(jié))

    Spring-全面詳解(學(xué)習(xí)總結(jié))

    這篇文章主要介紹了詳解Spring框架入門,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望能給你帶來幫助
    2021-07-07

最新評論

阿拉善右旗| 华容县| 南宫市| 壤塘县| 阳谷县| 都安| 环江| 蚌埠市| 洛川县| 奉化市| 洞口县| 茶陵县| 天峻县| 资兴市| 大荔县| 峨山| 顺平县| 平潭县| 运城市| 宕昌县| 湘乡市| 闽侯县| 五原县| 广东省| 翼城县| 湟源县| 平和县| 衡水市| 仙桃市| 汉寿县| 绿春县| 庐江县| 吉安市| 谷城县| 雅安市| 清苑县| 蛟河市| 兴国县| 顺昌县| 杨浦区| 杭锦后旗|