為服務中網關的作用


什么是網關

隨着互聯網的快速發展,當前以步入移動互聯、物聯網時代。用戶訪問系統入口也變得多種方式,由原來單一的PC客戶端,變化到PC客戶端、各種瀏覽器、手機移動端及智能終端等。同時系統之間大部分都不是單獨運行,經常會涉及與其他系統對接、共享數據的需求。所以系統需要升級框架滿足日新月異需求變化,支持業務發展,並將框架升級為微服務架構。“API網關”核心組件是架構用於滿足此些需求。

很多互聯網平台已基於網關的設計思路,構建自身平台的API網關,國內主要有京東、攜程、唯品會等,國外主要有Netflix、Amazon等。

網關框架框架

1、基於nginx平台實現的網關有:KONG、API Umbrella

2、自研發的網關有:apigateway、Zuul

API網關設計

API網關是微服務架構(Microservices Architecture)標准化服務的模式。API網關定位為應用系統服務接口的網關,區別於網絡技術的網關,但是原理則是一樣。API網關統一服務入口,可方便實現對平台眾多服務接口進行管控,對訪問服務的身份認證、防報文重放與防數據篡改、功能調用的業務鑒權、響應數據的脫敏、流量與並發控制,甚至基於API調用的計量或者計費等等。

網關應用場景 

1、 黑白名單:實現通過IP地址控制禁止訪問網關功能,此功能是應用層面控制實現,再往前也可以通過網絡傳輸方面進行控制訪問。

2、 日志:實現訪問日志的記錄,可用於分析訪問、處理性能指標,同時將分析結果支持其他模塊功能應用。

3、 協議適配:實現通信協議校驗、適配轉換的功能。

4、  身份認證:負責網關訪問身份認證驗證,此模塊與“訪問認證中心”通信,實際認證業務邏輯交移“訪問認證中心”處理。

5、 計流限流:實現微服務訪問流量計算,基於流量計算分析進行限流,可以定義多種限流規則。

路由:路由是API網關很核心的模塊功能,此模塊實現根據請求,鎖定目標微服務並將請求進行轉發。此模塊需要與“服務發布管理中心”通信。“服務發布管理中心”實現微服務發布注冊管理功能,與其通信獲得目標微服務信息。

API網關部署

API網關是一個公共基礎組件,無狀態,可支持多套分布式部署。如下圖所示:

lvs + Keepalived 屬於四層負載均衡,針對於 ip + port 這一層。

lvs 作用:管理Nginx 集群。

Nginx 屬於七層負載均衡,針對於 Http 協議這一層。

Zuul框架與Nginx 的區別

1、Zuul框架使用java語言寫的,Nginx使用C語言寫的。

2、Nginx是服務器端反向代理服務器,Zuul是為微服務中的反向代理服務器。

3、Nginx針對與服務器層面,Zuul 針對與客戶端層面的。

基於Nginx 搭建API網關

使用網關可以解決跨越問題,實現原理:保證域名相同,使用Nginx區分不同的項目路徑進行轉發跳轉。

Nginx配置反向代理:

http {
     include mime.types;
     default_type application/octet-stream;
     sendfile on;
     keepalive_timeout 65;
     server {
           listen 80;
           server_name www.test.com;
           location /api-a {
                proxy_pass http://www.test.com:8000/;
                index index.html index.htm;
           }
         location /api-b {
               proxy_pass http://www.test.com:8001/;
               index index.html index.htm;
         }
     }
}

基於Zuul搭建網關

zuul 網關 配置文件

###  將服務注冊到 eureka 注冊中心 i

eureka.client.serviceUrl.defaultZone=http://localhost:8100/eureka/

### zuul 服務端口號

server.port=8080

### zuul 服務別名

spring.application.name=service-zuul

### 路由配置

zuul.routes.api-a.path=/api-a/**

zuul.routes.api-a.serviceId=springboot_zuul_a

### 路由攔截地址

zuul.routes.api-b.path=/api-b/**

zuul.routes.api-b.serviceId=springboot_zuul_b

 

 Eureka 注冊中心配置文件

##  eureka 端口號

server.port=8100

### 注冊中心 eureka 別名
eureka.instance.hostname=eureka-server

### eureka 注冊中心地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

### 是否注冊到自己本身   eureka 集群時使用(true)
eureka.client.register-with-eureka=false

### 是否檢索服務信息 集群時使用(true)
eureka.client.fetch-registry=false

 

spirngboot_zuul_a 配置文件

### a 項目端口號

server.port=8081

### a 項目服務別名
spring.application.name=springboot_zuul_a

###  服務注冊到 eureka 注冊中心地址
eureka.client.service-url.defaultZone=http://localhost:8100/eureka

 

spirngboot_zuul_b 配置文件

### b 項目端口號

server.port=8082

### b 項目服務別名
spring.application.name=springboot_zuul_b

###  服務注冊到 eureka 注冊中心地址
eureka.client.service-url.defaultZone=http://localhost:8100/eureka

 

zuul 啟動類上面需要添加二個注解:

@EnableZuulProxy   //開啟 zuul 服務

@EnableEurekaClient   // 注冊到 eureka 注冊中心

 

過濾器攔截參數

 

// 使用網關攔截Token參數
public class TokenFilter extends ZuulFilter {

public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("accessToken");
if (accessToken == null) {
// 返回錯誤信息
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody("accessToken is null");
return null;
}
return null;
}

public boolean shouldFilter() {
return true;// 是否執行該過濾器,此處為true,說明需要過濾
}

@Override
public int filterOrder() {
return 0;// 優先級為0,數字越大,優先級越低
}

@Override
public String filterType() {
return "pre"; // 前置過濾器
}

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM