Spring Cloud與微服務之服務閘道器Zuul
阿新 • • 發佈:2018-12-15
文章目錄
springcloud-api-gateway
springcloud-api-gateway專案結構
springcloud-api-gateway原始碼
UserLoginZuulFilter原始碼:
package com.lyc.filters; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component //加入到Spring容器 public class UserLoginZuulFilter extends ZuulFilter { @Override public String filterType() { return "pre"; //設定過濾器型別為pre } @Override public int filterOrder() { return 0; //設定執行順序 } @Override public boolean shouldFilter() { return true; //該過濾需要執行 } @Override public Object run() { //編寫業務邏輯 RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); String token = request.getParameter("token"); if(StringUtils.isEmpty(token)){ requestContext.setSendZuulResponse(false); //過濾該請求,不對其進行路由 requestContext.setResponseStatusCode(401); return null; } return null; } }
ApiGatewayApplication原始碼:
package com.lyc; import com.lyc.filters.UserLoginZuulFilter; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; @EnableZuulProxy @EnableAutoConfiguration @SpringBootConfiguration public class ApiGatewayApplication { public static void main(String[] args) { SpringApplication.run(ApiGatewayApplication.class,args); } /** * 即便是所有的配置都寫好了,如果不新增這個Bean方法,那還是不會執行任何的過濾方法 * @return */ @Bean public UserLoginZuulFilter userLoginZuulFilter(){ return new UserLoginZuulFilter(); } }
application.yml原始碼:
server:
port: 6677 #服務埠
spring:
application:
name: springcloud-api-gateway #指定服務名
zuul:
routes:
item-service: #item-service 這個名字是任意寫的
path: /item-service/** #配置請求URL的請求規則
#url: http://127.0.0.1:8081 #真正的微服務地址
serviceId: springcloud-goods-item #指定Eureka註冊中心的服務id
eureka:
client:
registerWithEureka: true #是否將自己註冊到Eureka服務中,本身就是所有無需註冊
fetchRegistry: true #是否從Eureka中獲取註冊資訊
serviceUrl: #Eureka客戶端與Eureka服務端進行互動的地址
defaultZone: http://root:[email protected]:6868/eureka/
instance:
prefer-ip-address: true #將自己的ip地址註冊到Eureka服務中
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">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>com.lyc</groupId>
<version>1.0-RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api-gateway</artifactId>
<packaging>jar</packaging>
<name>SpringCloud微服務::閘道器伺服器</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--匯入SpringCloud的依賴管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
</build>
</project>
springcloud-api-gateway的使用
springcloud-api-gateway
訪問方式:
http://127.0.0.1:6677/item-service/item/1?token=123
其展示的結果:
<Item>
<id>1</id>
<title>商品標題1</title>
<pic>http://圖片1</pic>
<desc>商品描述1</desc>
<price>1000</price>
</Item>
這裡我們訪問的是商品微服務中的資訊,以前我們訪問商品微服務時是通過下面的路徑:
http://127.0.0.1:8081/item/1
但是此時由於閘道器的存在,此時我們可以直接訪問閘道器,然後由閘道器幫我們轉向商品微服務,由於我們的閘道器介面號定義為6677,而我們在閘道器配置檔案application.yml中的配置方式如下:
zuul:
routes:
item-service: #item-service 這個名字是任意寫的
path: /item-service/** #配置請求URL的請求規則
#url: http://127.0.0.1:8081 #真正的微服務地址
serviceId: springcloud-goods-item #指定Eureka註冊中心的服務id
上面中的path指的是攔截的url路徑,而serviceId指的是Eureka註冊中心的服務id,因而當我們訪問/item-service/時,其就會去配置中心Eureka中查詢相應的服務springcloud-goods-item,然後實現對商品微服務的訪問攔截操作。