前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
在Spring Cloud 微服務系統中,一種常見的負載均衡方式是,客戶端的請求首先經過負載均衡(zuul、Ngnix),再到達服務網關(zuul集群),然后再到具體的服務。服務統一注冊到高可用的服務注冊中心集群,服務的所有的配置文件由配置服務管理,配置文件放在 git 倉庫,方便開發人員隨時更新配置。
Zuul 的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如/api/user 轉發到到 user 服務,/api/shop 轉發到到 shop服務。zuul 默認和 Ribbon 結合實現了負載均衡的功能。
以上出自:https://blog.csdn.net/forezp/article/details/81041012?
實現網關:
1. file - new - module?
2. spring Initializr - module SDK 選擇自己的 JDK ,其余的可以不用填寫,next。
3. 填寫工程相關信息:包名、工程名等,next。
4. spring cloud routing - 勾選 zuul,next。
5. 工程名,代碼存放位置等,finish 。
6. 工程結構如下:
7.?pom.xml:(? 沒有使用base 工程的pom 。換來換去,只有 2.0.5 這個版本能正常引用所有 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>網關(路由)</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. 在工程啟動類上加注解:?@EnableZuulProxy ,開啟網關功能 。
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// 開啟網關
@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/ 開頭的請求都轉發給服務 : ribbon
# ribbon 是服務名,見 ribbon 工程的配置文件
zuul.routes.api-x.path= /api-x/**
zuul.routes.api-x.serviceId= ribbon# 以/api-y/開頭的請求都轉發給服務 :feign
zuul.routes.api-y.path = /api-y/**
zuul.routes.api-y.serviceId= feign
10. 在 feign 、ribbon 工程的 controller 中分別加上一句:“ 我來自服務 xxx ” :
11. 啟動 5 個工程:eureka(端口1234)、feign (端口8702)、ribbon(端口8701)、
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?see-param(端口8803)、zuul(端口2222) ,可見 4 個不同服務都已注冊成功 。
12. 測試?api-x 的請求、測試?api-y 的請求,可見實現了對應的轉發:
至此,網關的請求轉發就已經實現。
13. zuul 過濾功能實現 。
new 一個類:JYZuulFilter, 繼承?ZuulFilter ,實現其 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. 測試 請求中不帶參數 name 時,服務接口返回:
請求中有參數 name 時,服務接口返回:
這樣,過濾功能也實現了。
-------------------------------------------------------------
下一篇:springCloud - 第7篇 - 配置文件管理中心 ( SpringCloud Config )
源碼見:https://gitee.com/FJ_WoMenDeShiJie/springcloud-zuul
-------------------------------------------------------------
PS:這個系列不定時更新,只是個人的學習分享,
內容全程參考書目:
《Spring Cloud 與 Docker 微服務架構空實戰?》、
《Spring Cloud 微服務實戰》及此書作者博客:http://blog.didispace.com/spring-cloud-learning/
《深入理解 Spring Cloud 與微服務構建》及此書作者博客:https://blog.csdn.net/forezp/article/details/70148833
--------------------------------------------------------------
以下出自:https://blog.csdn.net/forezp/article/details/81041012
關于 ZuulFilter:
?
?
?