基于Spring的微服務結點在能力上沒有高低貴賤之分,但是在角色上會分為邊緣服務和内部服務兩部分。内部服務是為對内暴露服務的結點,供架構内部來調用;邊緣服務是對外部網絡暴露的服務結點,也就是對外API接口。
開發人員為了防止服務被黑客攻擊,需要編寫各種權限機制,這些機制在每個微服務結點都要實作一次。一旦鑒權上有什麼bug,又要全部節點上推倒重來,噩夢;運維人員在邊緣服務前段都會架一個F5或者Nginx等負載均衡的代理,需要手動維護一份服務清單和服務位址的路由資訊,随着結點的擴充或位址調整這份清單要變來變去。
為了解決鑒權重複的問題,使業務結點本身隻關心實作自己的業務,将對權限的處理抽離到上層。外部客戶先請求到Zuul上,在Zuul服務上對權限進行統一實作和過濾,以實作微服務結點的過濾和驗證;為了解決請求路由和安全過濾,Spring Cloud推出了一個API gateway元件:Spring Cloud Zuul。

Zuul對路由的配置有三種方式:
第一種(path-url):如果請求/sina這個位址,将會轉發到http://www.sina.com.cn上去
第二種(path-serviceId):如果請求/user-consumer開頭的位址,将會轉發到eureka上serviceId為sc-user-provider這個服務上去。
第三種(給微服務名指定path):給sc-user-provider這個微服務指定了它的請求位址是/user-service/**
(其實這裡還隐藏了第四種:什麼都不配,預設給注冊到eureka上的所有服務以第三種方式進行路由,path就是微服務自己的名字,但是此種方式又是不安全的,相當于将非邊緣服務也暴露給外網,一般需要關閉這個預設配置zuul.ignored-services=*,或者至少将受保護的微服務清單維護到zuul.ignored-services中)
今天介紹一下第一種方式
1、建立項目sc-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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>spring-cloud</groupId>
<artifactId>sc-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sc-zuul</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
</project>
2、建立配置檔案application.yml
server:
port: 8070
spring:
application:
name: sc-zuul
zuul:
routes:
sina:
path: /sina/**
url:http://www.sina.com.cn
baidu:
path: /baidu/**
url:http://www.baidu.com
3、建立啟動類ZuulApplication.java
package sc.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
public classZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
4、啟動項目
5、驗證
通路位址http://127.0.0.1:8070/baidu/跳轉到百度
通路位址http://127.0.0.1:8070/sina/跳轉到新浪
參考
https://blog.csdn.net/yejingtao703/article/details/77816555/
https://www.cnblogs.com/ityouknow/p/6944096.html
源碼:
https://gitee.com/hjj520/spring-cloud-2.x/tree/master/sc-zuul
本文作者: java樂園
本文來自雲栖社群合作夥伴“
JAVA樂園”,了解相關資訊可以關注“
”