国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Spring Cloud入門教程之Zuul實現API網關與請求過濾

2024-07-14 08:40:40
字體:
來源:轉載
供稿:網友

簡介

Zuul是Netflix基于JVM的路由器和服務器端負載均衡器。最常用的場景是替換Nginx反向代理后臺微服務供前端UI訪問。

Zuul使用Ribbon來定位一個通過發現轉發的實例,所有請求都以hystrix命令執行,所以故障將顯示在Hystrix指標中。

注:Zuul不包括發現客戶端,因此對于基于服務ID的路由,需要在類路徑中提供其中一個路由

Zuul是Spring Cloud提供的api網關和過濾組件,它提供如下功能:

  • 認證
  • 過濾
  • 壓力測試
  • Canary測試
  • 動態路由
  • 服務遷移
  • 負載均衡
  • 安全
  • 靜態請求處理
  • 動態流量管理

在本教程中,我們將用zuul,把web端的請求/product轉發到對應的產品服務上,并且定義一個pre過濾器來驗證是否經過了zuul的轉發。

基礎環境

  • JDK 1.8
  • Maven 3.3.9
  • IntelliJ 2018.1
  • Git

項目源碼

點擊這里

創建Zuul服務

在IntelliJ中創建一個maven項目:

  • cn.zxuqian
  • apiGateway

然后在pom.xml中添加如下代碼:

<?xml version="1.0" encoding="UTF-8"?><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>cn.zxuqian</groupId> <artifactId>apiGateway</artifactId> <version>1.0-SNAPSHOT</version> <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.0.1.RELEASE</version> </parent> <dependencies>  <dependency>   <groupId>org.springframework.cloud</groupId>   <!-- name has changed, before: spring-cloud-starter-zuul -->   <artifactId>spring-cloud-starter-netflix-zuul</artifactId>  </dependency>  <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-config</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-actuator</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>  </dependency> </dependencies> <dependencyManagement>  <dependencies>   <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-dependencies</artifactId>    <version>Finchley.M9</version>    <type>pom</type>    <scope>import</scope>   </dependency>  </dependencies> </dependencyManagement> <properties>  <java.version>1.8</java.version> </properties> <build>  <plugins>   <plugin>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-maven-plugin</artifactId>   </plugin>  </plugins> </build> <repositories>  <repository>   <id>spring-milestones</id>   <name>Spring Milestones</name>   <url>https://repo.spring.io/libs-milestone</url>   <snapshots>    <enabled>false</enabled>   </snapshots>  </repository> </repositories></project>

需要注意的是,Spring官網的教程給的zuul的artifactId為spring-cloud-starter-zuul,這個是舊版zuul的名字,在我們的Finchley.M9版本中已經更名為spring-cloud-starter-netflix-zuul。

添加src/main/resources/bootstrap.yml文件,指定spring.application.name:

spring: application: name: zuul-server

創建cn.zxuqian.Application類:

package cn.zxuqian;import cn.zxuqian.filters.PreFilter;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.zuul.EnableZuulProxy;import org.springframework.context.annotation.Bean;@EnableZuulProxy@EnableDiscoveryClient@SpringBootApplicationpublic class Application { public static void main(String[] args) {  SpringApplication.run(Application.class, args); } @Bean public PreFilter preFilter() {  return new PreFilter(); }}

這里使用了@EnableZuulProxy來指定使用zuul的反向代理,把我們的請求轉發到對應的服務器上。然后啟用了eureka的服務發現。Zuul默認也會使用Ribbon做負載均衡,所以可以通過eureka發現已注冊的服務。PreFilter是一個預過濾器,用來在request請求被處理之前進行一些操作,它的代碼如下:

package cn.zxuqian.filters;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;public class PreFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(PreFilter.class); @Override public String filterType() {  return "pre"; } @Override public int filterOrder() {  return 1; } @Override public boolean shouldFilter() {  return true; } @Override public Object run() throws ZuulException {  RequestContext ctx = RequestContext.getCurrentContext();  HttpServletRequest request = ctx.getRequest();  log.info(String.format("%s 方式請求 %s", request.getMethod(), request.getRequestURL().toString()));  return null; }}

filterType - Zuul內置的filter類型有四種,pre, route,post,error,分別代表請求處理前,處理時,處理后和出錯后。
filterOrder - 指定了該過濾器執行的順序。

shouldFilter - 是否開啟此過濾器。

run - 過濾器的業務邏輯。這里只是簡單的log了一下reqeust的請求方式和請求的路徑。

接下來,在我們的配置中心的git倉庫中創建zuul-server.yml文件,并添加如下配置:

server: port: 8083zuul: routes: products:  path: /product/**  serviceId: product-service

這里配置了zuul的端口為8083,然后映射所有/product/的請求到我們的product-service服務上。如果不配置serviceId,那么products這個Key就會默認作為ServiceId,而我們的例子中,ServiceId包括了-,所以在下邊顯示指定了ServiceId。配置完成后提交到git。

更新productService

productService的uri做了一點改動,使其更符合rest風格:

@RequestMapping("/list")public String productList() { log.info("Access to /products endpoint"); return "外套,夾克,毛衣,T恤";}

這里@RequestMapping匹配的路徑改為了/list,之前是/products。

更新web客戶端

在我們的web客戶端的ProductService中添加一個新的方法:

public String productListZuul() { return this.restTemplate.getForObject("http://zuul-server/product/list", String.class);}

這次我們直接請求zuul-server服務,然后由它把我們的請求反射代理到product-service服務。最后在ProductController中添加一個請求處理方法:

@RequestMapping("/product/list")public String productListZuul() { return productService.productListZuul();}

用來處理/product/list請求,然后調用ProductService類中的方法。

測試

使用mvn spring-boot:run啟動configServer,registry, zuulServer, productService,web這幾個工程,然后啟動第二個productService,使用SERVER_PORT=8082 spring-boot:run。

訪問幾次http://localhost:8080/product/list,然后除了會在瀏覽器看到返回的結果,我們還會在zuulServer的命令行窗口中看到如下字樣:

GET 方式請求 http://xuqians-imac:8083/product/list

然后在兩個productService的命令行窗口中,我們還會看到隨機出現的

Access to /products endpoint

說明zuulServer也會自動進行負載均衡。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 运城市| 宜州市| 屏东县| 阿巴嘎旗| 西充县| 蒲城县| 商都县| 台安县| 利辛县| 兰溪市| 镇康县| 嵊州市| 建宁县| 任丘市| 织金县| 宁蒗| 嘉义县| 乳源| 搜索| 绥江县| 原平市| 通渭县| 类乌齐县| 壶关县| 仁布县| 金寨县| 马公市| 阜宁县| 崇礼县| 漳平市| 巫溪县| 井陉县| 响水县| 江山市| 固阳县| 琼结县| 南昌县| 蓝山县| 哈密市| 秦皇岛市| 灵丘县|