欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring cloud 使用Zuul 實現(xiàn)API網(wǎng)關服務問題

 更新時間:2018年05月09日 10:23:32   作者:JAVA開發(fā)老菜鳥  
這篇文章主要介紹了spring cloud 使用Zuul 實現(xiàn)API網(wǎng)關服務問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

通過前面幾次的分享,我們了解了微服務架構(gòu)的幾個核心設施,通過這些組件我們可以搭建簡單的微服務架構(gòu)系統(tǒng)。比如通過Spring Cloud Eureka搭建高可用的服務注冊中心并實現(xiàn)服務的注冊和發(fā)現(xiàn);

通過Spring Cloud Ribbon或Feign進行負載均衡;通過Spring Cloud Hystrix進行服務容錯保護以避免故障蔓延。微服務搭建好了之后我們肯定會提供給外部系統(tǒng)一些統(tǒng)一的RESTFul API服務接口進行調(diào)用,

但是當外部系統(tǒng)調(diào)用我們的RESTful API的時候,怎么確定它需要的功能具體是哪個服務提供的呢?這個就涉及到一個路由規(guī)則和服務實例列表的維護問題。

這就引入了我們今天的主角--Spring Cloud Zuul,它是基于Netflix Zuul實現(xiàn)的API網(wǎng)關組件。它可以解決兩個大問題:

  • 就是我們上面提到的路由規(guī)則和服務實例的維護問題
  • 對于一些校驗(比如登錄校驗等)冗余問題。 按照我們的習慣的做法,是在每個服務中都需要加入這些校驗,但是這樣會導致代碼冗余并且維護也比較麻煩,有了Spring Cloud Zuul這個網(wǎng)關服務之后,我們可以將這些共通的校驗放到網(wǎng)關里面統(tǒng)一維護。

好,接下來我們就來看下怎么實現(xiàn)這個網(wǎng)關服務。

一、構(gòu)建網(wǎng)關,配置路由

 這里我們還是需要使用到前面的hello-service和feign-consumer服務。我們之前把feign-consumer作為服務消費者,但是別忘了在eureka體系里面,每個服務既是服務提供者又是服務消費者,所以feign-consumer也是一個服務提供者,并且http://localhost:9001/feign-consumer等接口就是它提供的服務。

接下來我們構(gòu)建一個網(wǎng)關服務,代碼結(jié)構(gòu)如下:

代碼實現(xiàn)步驟:

新建maven工程api-gateway

修改POM文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.sam</groupId>
 <artifactId>api-gateway</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.5.1.RELEASE</version>
 </parent>
 <properties>
  <javaVersion>1.8</javaVersion>
 </properties>
 <!-- 使用dependencyManagement進行版本管理 -->
 <dependencyManagement>
  <dependencies>
   <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Camden.SR6</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>
  </dependencies>
 </dependencyManagement>
 <dependencies>
  <!-- 引入zuul依賴 , 它依賴了spring-boot-starter-actuator/spring-boot-starter-hystrix/spring-boot-starter-ribbon-->
  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-zuul</artifactId>
  </dependency>
 </dependencies>
</project>

新建啟動類

/**
 * @EnableZuulProxy 開啟Zuul 的API網(wǎng)關服務功能
 *
 */
@EnableZuulProxy
@SpringCloudApplication
public class GateWayApp {

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

新建application.properties

server.port=5555
spring.application.name=api-gateway
#增加路由規(guī)則的配置
#通過zuul.routes.<route>.path和zuul.routes.<route>.url進行配置,<route>為路由的名字,可以任意指定,但是一組path和url的路由名要相同
#如下面的例子:所有滿足/api-a/** 規(guī)則的訪問都會被路由轉(zhuǎn)發(fā)到//localhost:9001的地址
#也就是說,我們訪問http://localhost:5555/api-a/hello的時候,API網(wǎng)關服務就會將該請#求路由到 http://localhost:9001/hello提供的微服務接口上
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.url=http://localhost:9001
zuul.routes.api-b.path=/api-b/**
zuul.routes.api-b.url=http://localhost:9090

測試,啟動eureka、hello-service、feign-consumer以及本次新加的api-gateway服務,然后訪問http://localhost:5555/api-a/feign-consumer

成功訪問到了feign-consumer的服務接口--feign-consonsumer。

以上步驟實現(xiàn)了傳統(tǒng)路由的配置,這種配置有個大的缺點,就是需要手工在application.properties文件中進行路由規(guī)則的配置,當服務很多的時候,維護工作量就會很大。為了減小維護成本,還有另外一種路由--面向服務的路由。

二、面向服務的路由

Spring Cloud Zuul和Eureka進行整合,我們可以讓路由的path不是映射具體的url,而是具體的某個服務,而服務的url則交給Eureka服務發(fā)現(xiàn)機制自動維護,這類路由就是面向服務的路由。具體代碼配置如下:

修改POM文件,引入Eureka依賴

<!-- 引入eureka依賴 -->
  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-eureka</artifactId>
  </dependency>

修改application.properties配置文件

server.port=5555
spring.application.name=api-gateway
zuul.routes.api-a.path=/api-a/**
#這里用serviceId代替url,用服務名代替ip+端口號
zuul.routes.api-a.serviceId=hello-service
eureka.client.service-url.defaultZone=http://localhost:1111/eureka

注意:zuul.routes.api-a.url=hello-service也能實現(xiàn)功能,但是它不能進行正常的負載均衡和容錯保護。

測試,訪問http://localhost:5555/api-a/hello

訪問成功。

 三、服務路由的默認規(guī)則

在面向服務的路由中,由于<route>名字是隨意起的,那么是不是可以這樣:

zuul.routes.hello-service.path=/hello-service/**
zuul.routes.hello-service.serviceId=hello-service

<route>名字就是服務名,其實在實際的應用中,我們往往就是這樣命名的。如果有這樣的規(guī)則的話,那Zuul就可以幫我們默認實現(xiàn)這樣的功能,進一步省去了配置的麻煩。

我們來做個實驗,將配置文件改為:

server.port=5555
spring.application.name=api-gateway
eureka.client.service-url.defaultZone=http://localhost:1111/eureka

然后頁面訪問驗證

訪問成功。

但是由于默認情況下,Eureka上的服務都會被Zuul創(chuàng)建默認的映射關系來進行路由,使得我們不想對外開放的服務也被外部訪問到,這個時候可以通過配置zuul.ignored-services來進行配置不需要自動創(chuàng)建路由的規(guī)則。當zuul.ignored-services=*的時候,所有的服務都不會自動創(chuàng)建路由規(guī)則,這個時候需要通過前面的配置進行相關路由配置了。

================華麗的分割線===================

前面說了那么多都是圍繞一個問題展開的:路由規(guī)則和服務實例的維護問題,那么怎么解決第二個問題(校驗冗余問題)呢?

 四、請求過濾

為了在API網(wǎng)關中實現(xiàn)對客戶端請求的校驗,我們可以通過過濾器來實現(xiàn)對請求的攔截和過濾,實現(xiàn)方法比較簡單,只需要繼承ZuulFilter抽象類并實現(xiàn)其四個方法就行了。

修改api-gateway:

新增過濾器類

/**
 * 繼承ZuulFilter,并且實現(xiàn)其4個接口
 *
 * 用來進行請求過濾
 *
 */
public class AccessFilter extends ZuulFilter {
 Logger logger = LoggerFactory.getLogger(AccessFilter.class);
 /* 
  * shouldFilter 判斷該過濾器是否需要被執(zhí)行
  * 
  * 這里直接返回true,表示該過濾器對所有請求都會生效。
  * 實際運用中我們可以利用該函數(shù)指定過濾器的有效范圍
  */
 @Override
 public boolean shouldFilter() {
  return true;
 }
 /*
  * 過濾器的具體邏輯
  * 
  * 這里我們通過ctx.setSendZuulResponse(false)讓zuul過來請求,不對其進行路由
  * 然后通過ctx.setResponseStatusCode(401)設置了返回的錯誤碼
  * 
  */
 @Override
 public Object run() {
  RequestContext context = RequestContext.getCurrentContext();
  HttpServletRequest request = context.getRequest();
  Object accessToken = request.getParameter("accessToken");
  logger.info("send {} request to {}", request.getMethod(),request.getRequestURL().toString());
  if(accessToken == null) {
   context.setSendZuulResponse(false);
   context.setResponseStatusCode(401);
  }
  return null;
 }
 /* filterType 返回過濾器類型
  * 他決定了過濾器在請求的哪個生命周期中執(zhí)行。這里定義為pre,代表會在請求被路由前執(zhí)行。
  * 
  * pre:請求執(zhí)行之前filter 
  * route: 處理請求,進行路由 
  * post: 請求處理完成后執(zhí)行的filter 
  * error:出現(xiàn)錯誤時執(zhí)行的filter
  */
 @Override
 public String filterType() {
  return "pre";
 }
 /* 
  * filterOrder 返回過濾器的執(zhí)行順序
  * 
  * 當請求在一個階段有多個過濾器是,需要根據(jù)該方法的返回值來一次執(zhí)行
  * 
  */
 @Override
 public int filterOrder() {
  return 0;
 }
}

修改啟動類

/**
 * @EnableZuulProxy 開啟Zuul 的API網(wǎng)關服務功能
 *
 */
@EnableZuulProxy
@SpringCloudApplication
public class GateWayApp {
 //追加bean的是實現(xiàn)
 @Bean
 public AccessFilter accessFilter() {
  return new AccessFilter();
 }
 
 public static void main(String[] args) {
  SpringApplication.run(GateWayApp.class, args);
 }
}

測試

)訪問http://localhost:5555/hello-service/hello,訪問失敗

)訪問http://localhost:5555/hello-service/hello?accessToken=token,正常訪問

修改后的代碼結(jié)構(gòu):

 五、拓展延伸

其實路由功能在真正運行時,他的路由映射和請求轉(zhuǎn)發(fā)都是由幾個不同的過濾器完成的。

路由映射主要通過pre類型的過濾器完成,他將請求路徑與配置的路由規(guī)則進行匹配,找到需要轉(zhuǎn)發(fā)的目標地址。

而請求轉(zhuǎn)發(fā)的部分則是由route類型的過濾器完成的,對pre類型過濾器獲取的路由地址進行轉(zhuǎn)發(fā)。

所以,過濾器可以說是Zuul實現(xiàn)API網(wǎng)關功能最為核心的部件,每一個進入Zuul的HTTP請求都會經(jīng)過一系列的過濾器處理鏈得到請求響應并返回給客戶端。

總結(jié)

以上所述是小編給大家介紹的spring cloud 使用Zuul 實現(xiàn)API網(wǎng)關服務問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • JAVA 16位ID生成工具類含16位不重復的隨機數(shù)數(shù)字+大小寫

    JAVA 16位ID生成工具類含16位不重復的隨機數(shù)數(shù)字+大小寫

    這篇文章主要介紹了JAVA 16位ID生成工具類含16位不重復的隨機數(shù)數(shù)字+大小寫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • JAVA讀取文本文件內(nèi)容實例代碼

    JAVA讀取文本文件內(nèi)容實例代碼

    這篇文章主要給大家介紹了關于JAVA讀取文本文件內(nèi)容的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • SpringBoot自動裝配原理詳解

    SpringBoot自動裝配原理詳解

    這篇文章主要詳細介紹了SpringBoot的自動裝配原理,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考一下
    2023-04-04
  • MybatisPlus lambdaQueryWrapper中常用方法的使用

    MybatisPlus lambdaQueryWrapper中常用方法的使用

    本文主要介紹了MybatisPlus lambdaQueryWrapper中常用方法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Java之Spring簡單的讀取和存儲對象

    Java之Spring簡單的讀取和存儲對象

    這篇文章主要介紹了Spring的讀取和存儲對象,獲取 bean 對象也叫做對象裝配,是把對象取出來放到某個類中,有時候也叫對象注?,想進一步了解的同學可以參考本文
    2023-04-04
  • 解決Mybatis中mapper的ID沖突問題

    解決Mybatis中mapper的ID沖突問題

    這篇文章主要介紹了解決Mybatis中mapper的ID沖突問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談java中六大時間類的使用和區(qū)別

    淺談java中六大時間類的使用和區(qū)別

    下面小編就為大家?guī)硪黄獪\談java中六大時間類的使用和區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • SpringBoot使用MockMvc測試get和post接口的示例代碼

    SpringBoot使用MockMvc測試get和post接口的示例代碼

    Spring Boot MockMvc是一個用于單元測試的模塊,它是Spring框架的一部分,專注于簡化Web應用程序的測試,MockMvc主要用來模擬一個完整的HTTP請求-響應生命周期,本文給大家介紹了SpringBoot使用MockMvc測試get和post接口,需要的朋友可以參考下
    2024-06-06
  • Java中l(wèi)ist集合的clear方法及空字符串的區(qū)別

    Java中l(wèi)ist集合的clear方法及空字符串的區(qū)別

    這篇文章主要介紹了Java中l(wèi)ist集合的clear方法及空字符串的區(qū)別,在使用list?結(jié)合的時候習慣了?list=null?;在創(chuàng)建這樣的方式,但是發(fā)現(xiàn)使用list的clear?方法很不錯,尤其是有大量循環(huán)的時候<BR>list.clear()與list?=?null?區(qū)別,需要的朋友可以參考下
    2023-08-08
  • Seata?AT模式TM處理流程圖文示例詳解

    Seata?AT模式TM處理流程圖文示例詳解

    這篇文章主要為大家介紹了Seata?AT模式TM處理流程圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09

最新評論