您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關SpringCLoud如何搭建Zuul網關集群的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
1.使用技術
Springboot,SpringCloud,Zuul,Nignx
2.目的
使用Zuul搭建微服務高可用的網關
3.項目創建
3.1 創建注冊中心(略)
3.2 創建一個hello-service的服務工程
3.3 創建springcloud-zuul-ha網關服務
3.3.1 創建工程(略)
3.3.2 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>qinfeng.zheng</groupId> <artifactId>springcloud-zuul-ha</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-zuul-ha</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <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</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <!--Dalston.RC1這個高版本的zuul依賴有問題--> <version>Brixton.SR7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.3.3 application.yml
###服務注冊地址 eureka: client: serviceUrl: defaultZone: http://localhost:8763/eureka/ ###api網關端口號 server: port: 82 ###網關名稱 spring: application: name: service-zuul zuul: routes: ###定義轉發服務規則 api-a: path: /api-hello/** #請求路徑中含有api-hello,都會轉發到hello-service服務 ###服務別名 zuul網關默認整合ribbon 自動實現負載均衡輪訓效果 serviceId: hello-service
3.3.4 定義一個過濾器
qinfeng.zheng.filter.AccessFilter
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; /** * 創建時間: 16:07 2018/7/16 * 修改時間: * 編碼人員: ZhengQf * 版 本: 0.0.1 * 功能描述: 自定義一個Zuul Filter,它在請求路由之前進行過濾 * * 補: zuul兩大功能: 1.路由請求 * 2.過濾 */ @Component public class AccessFilter extends ZuulFilter { @Value("${server.port}") private String serverPort; /** * 過濾器的類型,它決定過濾器在請求的哪個生命周期中執行, * pre:請求被路由之前做一些前置工作 ,比如請求和校驗 * routing : 在路由請求時被調用,路由請求轉發,即是將請求轉發到具體的服務實例上去. * post : 在routing 和 error過濾器之后被調用..所以post類型的過濾器可以對請求結果進行一些加工 * error :處理請求發生錯誤時調用 */ @Override public String filterType() { return "pre"; // } /** *過濾器的執行順序. *在一個階段有多個過濾器時,需要用此指定過濾順序 * 數值越小優先級越高 */ @Override public int filterOrder() { return 0; } /** * 判斷過濾器是否執行,直接返回true,代表對所有請求過濾 * 此方法指定過濾范圍 * @return */ @Override public boolean shouldFilter() { return true; } /** * 過濾的具體邏輯 * @return */ @Override public Object run() { // 1.獲取上下文 RequestContext currentContext = RequestContext.getCurrentContext(); // 2.獲取 Request HttpServletRequest request = currentContext.getRequest(); // 3.獲取token 的時候 從請求頭中獲取 String token = request.getParameter("token"); request.setAttribute("serverPort", serverPort); if (StringUtils.isEmpty(token)) { // 不會繼續執行... 不會去調用服務接口,網關服務直接響應給客戶端 currentContext.setSendZuulResponse(false); currentContext.setResponseBody("token is null"); currentContext.setResponseStatusCode(401); return null; // 返回一個錯誤提示 } // 正常執行調用其他服務接口... System.out.println("網關執行端口號:" + serverPort); return null; } }
3.3.5 啟動類
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @EnableZuulProxy @EnableEurekaClient @SpringBootApplication public class SpringcloudZuulHaApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudZuulHaApplication.class, args); } }
3.3.6 啟動網關項目
使用server.port模擬兩個網關項目,端口號分別為81,82 -------> 測試網關高可用
使用server.port模擬兩個hello-service項目,端口號分別為8080,8081 ---->測試zuul的路由時,自動負載均衡
查看注冊中心,一共有四個服務:
3.4 nginx配置負載均衡,然后 cmd ,start nginx.exe啟動nginx服務
upstream backServer{ server 127.0.0.1:81; server 127.0.0.1:82; } server { listen 80; server_name qinfeng.zheng.com; location / { ### 指定上游服務器負載均衡服務器 proxy_pass http://backServer/; index index.html index.htm; } }
3.5 在本地host文件中配置qinfeng.zheng.com 的域名
4.測試
第一次請求: http://qinfeng.zheng.com/api-hello/hello/index?token=123
第二次請求:http://qinfeng.zheng.com/api-hello/hello/index?token=123
感謝各位的閱讀!關于“SpringCLoud如何搭建Zuul網關集群”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。