8、Spring Cloud Zuul
1.Zuul简介
Zuul包含了对请求的路由和过滤两个最主要的功能。
路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。
过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。
Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注:Zuul服务最终还是会注册进Eureka
Zuul提供代理、路由、过滤三大功能。
|
https://github.com/Netflix/zuul/wiki/Getting-Started |
2.Zuul配置
(1).创建工程
新建Module模块microservicecloud-zuul-gateway-9527
(2).配置pom
[1].修改部分
|
<dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-zuulartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-eurekaartifactId> dependency> |
[2].完整部分
|
<?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>microservicecloudartifactId> <groupId>com.hosystemgroupId> <version>1.0-SNAPSHOTversion> parent> <modelVersion>4.0.0modelVersion>
<artifactId>microservicecloud-zuul-gateway-9527artifactId> <dependencies>
<dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-zuulartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-eurekaartifactId> dependency>
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-actuatorartifactId> dependency>
<dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-hystrixartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-configartifactId> dependency>
<dependency> <groupId>com.atguigu.springcloudgroupId> <artifactId>microservicecloud-apiartifactId> <version>${project.version}version> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-jettyartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> dependency>
<dependency> <groupId>org.springframeworkgroupId> <artifactId>springloadedartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-devtoolsartifactId> dependency> dependencies>
project> |
(3).applicaiton.yml
|
server: port: 9527
spring: application: name: microservicecloud-zuul-gateway
eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka instance: instance-id: gateway-9527.com prefer-ip-address: true
info: app.name: hosystem-microcloud company.name: www.hosystem.com build.artifactId: $project.artifactId$ build.version: $project.version$ |
(4).修改hosts
|
127.0.0.1 myzuul.com |
(5).主启动类
创建主启动类Zuul_9527_StartSpringCloudApp,并添加注解@EnableZuulProxy.
|
package com.hosystem.springcloud;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication @EnableZuulProxy public class Zuul_9527_StartSpringCloudApp { public static void main(String[] args) { SpringApplication.run(Zuul_9527_StartSpringCloudApp.class, args); } } |
(6).启动项目
[1].启动eureka7001、eureka7002、eureka7003
启动microservicecloud-eureka-7001、microservicecloud-eureka-7002、microservicecloud-eureka-7003
[2].启动provider8001
启动microservicecloud-provider-dept-8001
[3].启动zuul9527
启动microservicecloud-zuul-gateway-9527
(7).测试
[1].未启用路由
|
http://localhost:8001/dept/get/2 |
[2].启动路由
|
http://myzuul.com:9527/microservicecloud-dept/dept/get/2 |
3.Zuul路由访问映射规则
(1).修改application.yml
修改部分:
|
zuul: routes: mydept.serviceId: microservicecloud-dept mydept.path: /mydept/** |
完整部分:
|
server: port: 9527
spring: application: name: microservicecloud-zuul-gateway
eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka instance: instance-id: gateway-9527.com prefer-ip-address: true
zuul: routes: mydept.serviceId: microservicecloud-dept mydept.path: /mydept/**
info: app.name: hosystem-microcloud company.name: www.hosystem.com build.artifactId: $project.artifactId$ build.version: $project.version$ |
访问效果
|
#之前访问的时候通过'microservicecloud-dept‘ http://myzuul.com:9527/microservicecloud-dept/dept/get/2
#之后访问的时候通过'mydept' http://myzuul.com:9527/mydept/dept/get/1 |
出现的问题,通过'microservicecloud-dept‘或者'mydept'都可以访问。如何限制只允许'mydept'访问,而'microservicecloud-dept'访问失败呢?具体解决方法如下,
|
#解决单个的时候指定具体的servideId #如果想要解决多个的时候可以使用 "*" zuul: ignored-services: microservicecloud-dept routes: mydept.serviceId: microservicecloud-dept mydept.path: /mydept/** |
统一公共前缀
|
zuul: prefix: /hosystem ignored-services: "*" routes: mydept.serviceId: microservicecloud-dept mydept.path: /mydept/** |
完整的applicaiton.yml文件
|
server: port: 9527
spring: application: name: microservicecloud-zuul-gateway
eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka instance: instance-id: gateway-9527.com prefer-ip-address: true
zuul: prefix: /hosystem ignored-services: "*" routes: mydept.serviceId: microservicecloud-dept mydept.path: /mydept/**
info: app.name: hosystem-microcloud company.name: www.hosystem.com build.artifactId: $project.artifactId$ build.version: $project.version$ |
参考文档:
https://github.com/Netflix/zuul/wiki/Getting-Started