1. 程式人生 > >springcloud(十)-Zuul微服務網關

springcloud(十)-Zuul微服務網關

使用 pom.xml文件 tom app public art per muc extra

為什麽要使用微服務網關

前面的文章我們介紹了,Eureka用於服務的註冊於發現,Feign支持服務的調用以及均衡負載,Hystrix處理服務的熔斷防止故障擴散,Spring Cloud Config服務集群配置中心,似乎一個微服務框架已經完成了。

我們還是少考慮了一個問題,外部的應用如何來訪問內部各種各樣的微服務呢?

如果讓客戶端直接與各個微服務通信,會有以下問題:

  • 客戶端會多次請求不同的微服務,增加了客戶端的復雜性。
  • 存在跨域請求,在一定的場景下處理相對復雜。
  • 認證復雜,每個服務都需要獨立認證。
  • 難以重構,隨著項目的叠代,可能需要重新劃分微服務。例如,可能將多個服務合並成一個或者將一個微服務拆分成多個。如果客戶端直接與微服務通信,那麽重構將很難實施。
  • 某些微服務可能使用了對防火墻/瀏覽器不友好的協議,直接訪問時會有一定的困難。

以上問題可借助微服務網關解決。微服務網關時介於客戶端和服務端之間的中間層,所有的外部請求都會先經過微服務網關。使用微服務網關後,架構為:

技術分享圖片

微服務網關封裝了應用程序的內部結構,客戶端只用跟網關交互,而無須直接調用特定的微服務接口。這樣,開發就可以得到簡化。不僅如此,使用微服務網關還有一下優點:

  • 易於監控。可在微服務網關收集監控數據並將其推送到外部系統進行分析。
  • 易於認證。可在微服務網關上進行認證,然後再將請求轉發到後端的微服務。
  • 減少了客戶端與各個微服務之間的交互次數。

編寫Zuul

1.創建一個Maven工程,ArtifactId是microservice-gateway-zuul,配置pom.xml文件

<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.itmuch.cloud</groupId>
  <
artifactId>microservice-gateway-zuul</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>microservice-gateway-zuul</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 用於監控spring boot 端點 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- <scope>provided</scope> --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 這個需要為 true 熱部署才有效 --> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <!-- 引入spring cloud 的依賴 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 添加spring-boot 的maven插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

2.在啟動類上添加註解@EnableZuulProxy,聲明一個Zuul代理。該代理使用Ribbon來定位註冊在Eureka Server中的微服務;同時,該代理還整合了Hystrix,從而實現了容錯,所有經過zuul的請求都會在Hystrix命令中執行。

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

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

3.編寫配置文件application.yml.

server:
  port: 8040
spring:
  application:
    name: microservice-gateway-zuul
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8083/eureka
management:
  security:
    enabled: false

這樣,一個簡單的微服務網關就編寫完了。從配置可知,此時僅添加了Zuul的依賴,並將Zuul註冊到EurekaServer上。

測試1

啟動項目microservice-discovery-eureka.

啟動項目microservice-provider-user.

啟動項目microservice-consumer-movie-ribbon。

啟動項目microservice-gateway-zuul。

訪問http://localhost:8040/microservice-consumer-movie/user/1,請求會被轉發到http://loclahost:8010/user/1.

訪問http://localhost:8040/microservice-provider-user/1,請求會被轉發到http://localhost:8081/1。

說明在默認情況下,Zuul會代理所有註冊到Eureka Server的微服務,並且Zuul的路由規則如下:

http://ZUUL_HOST:ZUUL_PORT/微服務在Eureka上的serviceId/**會被轉發到serviceId對應的微服務。

測試2

啟動項目microservice-discovery-eureka.

啟動多個microservice-provider-user實例。

啟動項目microservice-gateway-zuul。此時,Eureka Server首頁如下:

技術分享圖片

多次訪問http://localhost:8040/microservie-provider-user/1,會發現兩個用戶微服務節點都會打印類似如下日誌。

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?
2019-04-29 19:30:48.253 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
2019-04-29 19:30:48.257 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_0_] : [INTEGER]) - [20]
2019-04-29 19:30:48.257 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([balance3_0_0_] : [NUMERIC]) - [98.23]
2019-04-29 19:30:48.257 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name4_0_0_] : [VARCHAR]) - [張三]
2019-04-29 19:30:48.257 TRACE 9536 --- [nio-8081-exec-5] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]

說明Zuul可以使用Ribbon達到負載均衡的效果。

另外,Zuul也整合了Hystrix.這裏不再演示。

springcloud(十)-Zuul微服務網關