一、Zuul的介绍
Zuul包含了对请求的路由和过滤两个最主要的功能:
其中路由功能负责将外部请求转发到具体的微服务实力上,是实现外部访问统一入口基础而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。
Zuul和eureka进行整合,将Zuul自身注册到Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得的。
注意:Zuul最终还是会注册到Eureka。
提供=代理+路由+过滤三大功能
二、路由的基本配置
1、新建工程:microservicecloud-zuul-gateway-9527
2、pom.xml文件添加依赖的jar
<dependencies> <!-- zuul路由网关 --> <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> <!-- actuator监控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- hystrix容错 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- 日常标配 --> <dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- 热部署插件 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
3、yml文件的配置
server: port: 9527 spring: application: name: microservicecloud-zuul-gateway # zuul注册到Eureka 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: yufeng-microcloud company.name: www.yufeng.com build.artifactId: $project.artifactId$ build.version: $project.version$
4、hosts的修改
(1)打开 C:\Windows\System32\drivers\etc\hosts 文件;
(2)增加:127.0.0.1 myzuul.com
5、主启动类,添加@EnableZuulProxy
@SpringBootApplication @EnableZuulProxy public class Zuul_9527_StartSpringCloudApp { public static void main(String[] args) { SpringApplication.run(Zuul_9527_StartSpringCloudApp.class); } }
6、测试
(1)启动三个eureka集群, 一个microservicecloud-provider-dept-8001,启动路由网关微服务;
(2)不用路由和启动路由的结果一样;
不用路由:http://localhost:8001/dept/get/2
启用路由:http://myzuul.com:9527/microservicecloud-dept/dept/get/2
三、路由访问映射规则
以上使用 http://myzuul.com:9527/microservicecloud-dept/dept/get/2 访问,则暴露出了调用的微服务名为 microservicecloud-dept;为了不暴露出微服务的真正名称,使用路由访问映射;
1、在yml文件中增加路由映射
# 路由映射 zuul: routes: mydept: serviceId: microservicecloud-dept path: /mydept/**
serviceId:映射的服务名;path:映射成为的路径;
在yml修改之前使用:http://myzuul.com:9527/microservicecloud-dept/dept/get/2 访问;
在yml修改之后使用:http://myzuul.com:9527/mydept/dept/get/2 访问;
2、此时使用 http://myzuul.com:9527/microservicecloud-dept/dept/get/2 和 http://myzuul.com:9527/mydept/dept/get/2 都可以成功的调用该接口,还是会暴露调用的微服务名为microservicecloud-dept;所以需要去让使用 http://myzuul.com:9527/microservicecloud-dept/dept/get/2 链接不能够访问;
(1)因此,需要在yml文件中增加原服务的忽略:
# 路由映射 zuul: ignored-services: microservicecloud-dept routes: mydept: serviceId: microservicecloud-dept path: /mydept/**
ignored-services:特别注意此处的配置。通过配置此选项,限制不能通过访问服务名去访问微服务
如果想把其他很多的微服务都通过配置忽略掉真实访问路径则直接使用 ”*” 来代替。
(2)重启微服务
<1> 使用原路径访问报错,http://myzuul.com:9527/microservicecloud-dept/dept/get/2
<2> 使用路由映射路径可以正常访问:http://myzuul.com:9527/mydept/dept/get/2
(3)在实际的使用时候,有很多个服务器需要限制不能通过服务名去访问;则在yml做如下的修改:
# 路由映射 zuul: ignored-services: "*" routes: mydept: serviceId: microservicecloud-dept path: /mydept/**
测试结果与上面的结果一样;
3、设置统一公共前缀
(1)修改yml文件,如下所示
# 路由映射 zuul: prefix: /yufeng ignored-services: "*" routes: mydept: serviceId: microservicecloud-dept path: /mydept/**
(2)测试
<1> 在浏览器中打开:http://myzuul.com:9527/mydept/dept/get/2,报错如下:
<2> 在浏览器中打开:http://myzuul.com:9527/yufeng/mydept/dept/get/2,可以正常访问;