真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

springcloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

這篇文章將為大家詳細(xì)講解有關(guān)spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

本溪網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

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

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

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

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

  • 就是我們上面提到的路由規(guī)則和服務(wù)實(shí)例的維護(hù)問題

  • 對(duì)于一些校驗(yàn)(比如登錄校驗(yàn)等)冗余問題。 按照我們的習(xí)慣的做法,是在每個(gè)服務(wù)中都需要加入這些校驗(yàn),但是這樣會(huì)導(dǎo)致代碼冗余并且維護(hù)也比較麻煩,有了Spring Cloud Zuul這個(gè)網(wǎng)關(guān)服務(wù)之后,我們可以將這些共通的校驗(yàn)放到網(wǎng)關(guān)里面統(tǒng)一維護(hù)。

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

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

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

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

spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

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

新建maven工程api-gateway

修改POM文件


 4.0.0
 com.sam
 api-gateway
 0.0.1-SNAPSHOT
 
  org.springframework.boot
  spring-boot-starter-parent
  1.5.1.RELEASE
 
 
  1.8
 
 
 
  
   
    org.springframework.cloud
    spring-cloud-dependencies
    Camden.SR6
    pom
    import
   
  
 
 
  
  
   org.springframework.cloud
   spring-cloud-starter-zuul
  
 

新建啟動(dòng)類

/**
 * @EnableZuulProxy 開啟Zuul 的API網(wǎng)關(guān)服務(wù)功能
 *
 */
@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..path和zuul.routes..url進(jìn)行配置,為路由的名字,可以任意指定,但是一組path和url的路由名要相同
#如下面的例子:所有滿足/api-a/** 規(guī)則的訪問都會(huì)被路由轉(zhuǎn)發(fā)到//localhost:9001的地址
#也就是說,我們?cè)L問http://localhost:5555/api-a/hello的時(shí)候,API網(wǎng)關(guān)服務(wù)就會(huì)將該請(qǐng)#求路由到 http://localhost:9001/hello提供的微服務(wù)接口上
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

測(cè)試,啟動(dòng)eureka、hello-service、feign-consumer以及本次新加的api-gateway服務(wù),然后訪問http://localhost:5555/api-a/feign-consumer

spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

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

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

二、面向服務(wù)的路由

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

修改POM文件,引入Eureka依賴


  
   org.springframework.cloud
   spring-cloud-starter-eureka
  

修改application.properties配置文件

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

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

測(cè)試,訪問http://localhost:5555/api-a/hello

spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

訪問成功。

 三、服務(wù)路由的默認(rèn)規(guī)則

在面向服務(wù)的路由中,由于名字是隨意起的,那么是不是可以這樣:

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

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

我們來做個(gè)實(shí)驗(yàn),將配置文件改為:

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

然后頁面訪問驗(yàn)證

spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

訪問成功。

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

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

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

 四、請(qǐng)求過濾

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

修改api-gateway:

新增過濾器類

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

修改啟動(dòng)類

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

測(cè)試

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

spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

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

spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

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

spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題

 五、拓展延伸

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

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

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

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

關(guān)于“spring cloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


新聞名稱:springcloud如何使用Zuul實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題
當(dāng)前地址:http://weahome.cn/article/pdeghs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部