springCloud - 第6篇 - 网关的实现:ZUUL
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到教程。
在Spring Cloud 微服務(wù)系統(tǒng)中,一種常見的負(fù)載均衡方式是,客戶端的請(qǐng)求首先經(jīng)過負(fù)載均衡(zuul、Ngnix),再到達(dá)服務(wù)網(wǎng)關(guān)(zuul集群),然后再到具體的服務(wù)。服務(wù)統(tǒng)一注冊到高可用的服務(wù)注冊中心集群,服務(wù)的所有的配置文件由配置服務(wù)管理,配置文件放在 git 倉庫,方便開發(fā)人員隨時(shí)更新配置。
Zuul 的主要功能是路由轉(zhuǎn)發(fā)和過濾器。路由功能是微服務(wù)的一部分,比如/api/user 轉(zhuǎn)發(fā)到到 user 服務(wù),/api/shop 轉(zhuǎn)發(fā)到到 shop服務(wù)。zuul 默認(rèn)和 Ribbon 結(jié)合實(shí)現(xiàn)了負(fù)載均衡的功能。
以上出自:https://blog.csdn.net/forezp/article/details/81041012?
實(shí)現(xiàn)網(wǎng)關(guān):
1. file - new - module?
2. spring Initializr - module SDK 選擇自己的 JDK ,其余的可以不用填寫,next。
3. 填寫工程相關(guān)信息:包名、工程名等,next。
4. spring cloud routing - 勾選 zuul,next。
5. 工程名,代碼存放位置等,finish 。
6. 工程結(jié)構(gòu)如下:
7.?pom.xml:(? 沒有使用base 工程的pom 。換來換去,只有 2.0.5 這個(gè)版本能正常引用所有 jar )
<?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>com.zuul</groupId><artifactId>zuul</artifactId><version>0.0.1-SNAPSHOT</version><name>zuul</name><description>網(wǎng)關(guān)(路由)</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version><relativePath /></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</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>?8. 在工程啟動(dòng)類上加注解:?@EnableZuulProxy ,開啟網(wǎng)關(guān)功能 。
package com.zuul.zuul;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;@SpringBootApplication @EnableEurekaClient// 開啟網(wǎng)關(guān) @EnableZuulProxy public class ZuulApplication {public static void main(String[] args) {SpringApplication.run(ZuulApplication.class, args);}}9. 配置文件:
# 注冊中心 - 端口: 1234、工程名: eureka (見 eureka 工程中配置)。 eureka.client.serviceUrl.defaultZone= http://localhost:1234/eureka/# 端口 server.port= 2222# 工程名 spring.application.name= zuul# 以/api-x/ 開頭的請(qǐng)求都轉(zhuǎn)發(fā)給服務(wù) : ribbon # ribbon 是服務(wù)名,見 ribbon 工程的配置文件 zuul.routes.api-x.path= /api-x/** zuul.routes.api-x.serviceId= ribbon# 以/api-y/開頭的請(qǐng)求都轉(zhuǎn)發(fā)給服務(wù) :feign zuul.routes.api-y.path = /api-y/** zuul.routes.api-y.serviceId= feign10. 在 feign 、ribbon 工程的 controller 中分別加上一句:“ 我來自服務(wù) xxx ” :
11. 啟動(dòng) 5 個(gè)工程:eureka(端口1234)、feign (端口8702)、ribbon(端口8701)、
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?see-param(端口8803)、zuul(端口2222) ,可見 4 個(gè)不同服務(wù)都已注冊成功 。
12. 測試?api-x 的請(qǐng)求、測試?api-y 的請(qǐng)求,可見實(shí)現(xiàn)了對(duì)應(yīng)的轉(zhuǎn)發(fā):
至此,網(wǎng)關(guān)的請(qǐng)求轉(zhuǎn)發(fā)就已經(jīng)實(shí)現(xiàn)。
13. zuul 過濾功能實(shí)現(xiàn) 。
new 一個(gè)類:JYZuulFilter, 繼承?ZuulFilter ,實(shí)現(xiàn)其 abstract 方法:
package com.zuul.zuul;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.stereotype.Component;import java.util.Objects;/*** @author yujiang* @description* @date 2019/7/25 16:24*/ @Component public class JYZuulFilter extends ZuulFilter {@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext rc = RequestContext.getCurrentContext();if (Objects.isNull(rc.getRequest().getParameter("name"))) {rc.setSendZuulResponse(false);try {rc.getResponse().getWriter().write(" name cannot be null ...");} catch (Exception e) {}return null;}return null;}}14. 測試 請(qǐng)求中不帶參數(shù) name 時(shí),服務(wù)接口返回:
請(qǐng)求中有參數(shù) name 時(shí),服務(wù)接口返回:
這樣,過濾功能也實(shí)現(xiàn)了。
-------------------------------------------------------------
下一篇:springCloud - 第7篇 - 配置文件管理中心 ( SpringCloud Config )
源碼見:https://gitee.com/FJ_WoMenDeShiJie/springcloud-zuul
-------------------------------------------------------------
PS:這個(gè)系列不定時(shí)更新,只是個(gè)人的學(xué)習(xí)分享,
內(nèi)容全程參考書目:
《Spring Cloud 與 Docker 微服務(wù)架構(gòu)空實(shí)戰(zhàn)?》、
《Spring Cloud 微服務(wù)實(shí)戰(zhàn)》及此書作者博客:http://blog.didispace.com/spring-cloud-learning/
《深入理解 Spring Cloud 與微服務(wù)構(gòu)建》及此書作者博客:https://blog.csdn.net/forezp/article/details/70148833
--------------------------------------------------------------
以下出自:https://blog.csdn.net/forezp/article/details/81041012
關(guān)于 ZuulFilter:?
?
?
總結(jié)
以上是生活随笔為你收集整理的springCloud - 第6篇 - 网关的实现:ZUUL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asposeword.dll通过word
- 下一篇: Qt-窗口消息处理机制及拦截消息的五种方