我们为什么要构建 Zuul?
Netflix API 流量的数量和多样性有时会导致生产问题在没有警告的情况下迅速出现。我们需要一个允许我们快速改变行为以应对这些情况的系统。
Zuul 使用一系列不同类型的过滤器,使我们能够快速灵活地将功能应用到我们的边缘服务。这些过滤器帮助我们执行以下功能:
- 身份验证和安全性 - 确定每个资源的身份验证要求并拒绝不满足要求的请求。
- 洞察力和监控 - 在边缘跟踪有意义的数据和统计数据,以便为我们提供准确的生产视图。
- 动态路由 - 根据需要将请求动态路由到不同的后端集群。
- 压力测试 - 逐渐增加集群的流量以衡量性能。
- 减载 - 为每种类型的请求分配容量并丢弃超出限制的请求。
- 静态响应处理 - 直接在边缘构建一些响应,而不是将它们转发到内部集群
- 多区域弹性 - 跨 AWS 区域路由请求,以使我们的 ELB 使用多样化并使我们的优势更接近我们的成员
以父工程SpringCloud创建zuul子工程
导入相关jar包至pom文件
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.junjay</groupId>
<artifactId>SpringCloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.junjay</groupId>
<artifactId>springcloud-zuul-9527</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-zuul-9527</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- 消费者只需要实体类+web -->
<dependency>
<groupId>com.junjay</groupId>
<artifactId>springcloud-pai</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- 热部署工具 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- 添加负载均衡Ribbon依赖 -->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 加入eureka依赖进行服务注册 -->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 增加hystrix依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 增加dashboard依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- 增加zuul配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
</dependencies>
</project>
配置yml文件配置zuul
server:
port: 9527
#spring配置
spring:
application:
name: springcloud-zuul-geteway
#eureka 的配置
eureka:
client:
service-url:
# 服务注册到哪里 打开eureka服务配置以配置中的地址为准
# eureka配置好之后,开启eureka功能注解
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7001.com:7002/eureka,http://eureka7001.com:7003/eureka
instance:
# 修改eureka——Status up 描述
instance-id: zuul9527.com
prefer-ip-address: true
# actuator 监控配置
info:
app.name: junjay.com
company.name: blog.junjay.com
# 服务开发者名称(作者)
author: junjay
编写启动类开启@EnableZuulProxy
package org.springcloud.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy // 开启zuul代理
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
public class ZuulApplication_9527 {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication_9527.class, args);
}
}
在C:\Windows\System32\drivers\etc添加zuul地址
0.0.0.0 account.jetbrains.com
127.0.0.1 activate.navicat.com
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
127.0.0.1 www.junjay.com
启动服务集群,服务提供者
使用zuul访问
http://www.junjay.com:9527 zuul
springcloud-provider-dept 服务地址
dept/queryById/1 接口访问地址
http://www.junjay.com:9527/springcloud-provider-dept**/**dept/queryById/1
访问不在需要使用服务端地址,以zuul配置地址隐藏服务地址和端口
修改zuul配置完全隐藏服务端信息
server:
port: 9527
#spring配置
spring:
application:
name: springcloud-zuul-geteway
#eureka 的配置
eureka:
client:
service-url:
# 服务注册到哪里 打开eureka服务配置以配置中的地址为准
# eureka配置好之后,开启eureka功能注解
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7001.com:7002/eureka,http://eureka7001.com:7003/eureka
instance:
# 修改eureka——Status up 描述
instance-id: zuul9527.com
prefer-ip-address: true
# actuator 监控配置
info:
app.name: junjay.com
company.name: blog.junjay.com
# 服务开发者名称(作者)
author: junjay
# zuul 配置
zuul:
routes:
# 原来要用springcloud-provider-dept 现在可以使用/mydept 代替微服务名称
provider:
path: /mydept/**
url: springcloud-provider-dept
配置zuul,使其完全隐藏
http://www.junjay.com:9527/mydept/dept/queryById/1
现在是俩个路径都可以访问,设置zuul不在使用原项目路径访问
# zuul 配置
zuul:
ignored-services: springcloud-provider-dept #不能再使用本服务路径访问,ignored忽略
routes:
# 原来要用springcloud-provider-dept 现在可以使用/mydept 代替微服务名称
provider:
path: /mydept/**
url: springcloud-provider-dept
仅仅可用配置的访问路径访问
# 配置ignored-patterns之后 使用 http://localhost:9100/suibian/send/msg 不可以访问,
# 其他的 /mytttttt/send/msg,/mysuibian/send/msg,/service-sms/send/msg都可以访问
ignored-patterns: /**/suibian/**
#配置prefix之后,所有的请求都需要加上/api才能访问,
#/mytttttt/send/msg,/mysuibian/send/msg,/service-sms/send/msg无法访问,
#需要使用/api/mytttttt/send/msg,/api/service-sms/send/msg进行访问
prefix: /api