【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)
该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一)
springcloud学习(dalston.sr1)系统文章汇总如下:
【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一)
【springcloud学习(dalston.sr1)】Eureka服务端集群的搭建(含源代码)(二)
【springcloud学习(dalston.sr1)】Eureka单个服务端的搭建(含源代码)(三)
【springcloud学习(dalston.sr1)】Eureka 客户端服务注册(含源代码)(四)
【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)
【springcloud学习(dalston.sr1)】Eureka 服务发现(含源代码)(六)
【springcloud学习(dalston.sr1)】Ribbon负载均衡(含源代码)(七)
【springcloud学习(dalston.sr1)】使用Feign实现接口调用(含源代码)(八)
【springcloud学习(dalston.sr1)】Hystrix服务熔断(含源代码)(九)
【springcloud学习(dalston.sr1)】Hystrix服务降级(含源代码)(十)
【springcloud学习(dalston.sr1)】Hystrix Dashboard服务监控(含源代码)(十一)
【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)
【springcloud学习(dalston.sr1)】Config配置中心-ConfigServer端与Git通信(含源代码)(十三)
【springcloud学习(dalston.sr1)】Config配置中心-Configclient端通过和Config server端通信来获取配置文件信息(含源代码)(十四)
(一)zuul路由规则的理解
Zuul包含了对请求的路由和过滤功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获取其他微服务的消息,也即以后得访问微服务都是通过Zuul跳转后获得。Zuul最终还是会注册进Eureka。
这点Zuul有点类似于Nginx
(二)Zuul路由配置,这里需要新建一个项目microservicecloud-zuul-gateway-9527。该项目的整体结构如下图:
(1)在POM文件中增加如下依赖
<?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>springcloud2025</artifactId><groupId>com.company</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>microservicecloud-zuul-gateway-9527</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.company</groupId><artifactId>microservicecloud-api</artifactId><version>${project.version}</version></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>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency></dependencies></project>
(2)application.yml文件中增加如下配置信息
server:port: 9527spring:application:name: microservicecloud-zuul-gatewayeureka:client:service-url:defaultZone: http://localhost:7001/eureka/ #http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: gateway-9527.com #这里用于修改eureka服务注册列表的status字段值,替换默认的展示prefer-ip-address: true #服务注册列表中的status字段值,其访问路径可以显示IP地址,而不是展示localhost#如果不做如下配置,访问地址是 http://myzuul.com:9527/microservicecloud-goods/goods/list/
#会包漏出真实的服务地址,存在安全隐患
#如果增加了以下配置,可以采用 http://myzuul.com:9527/myrule/goods/list/
zuul:#prefix: /mycompany #加上这个配置表示,访问必须要加前缀才能访问,否则无法正常访问,也即需要通过 http://myzuul.com:9527/mycompany/myrule/goods/list/ 来访问#ignored-services: microservicecloud-goods #不增加这条配置,两种路径(真实路径和路由路径都能访问),增加配置后,只能通过路由路径访问,从而实现了隐藏真实服务地址。如果有多个服务名称都需要隐藏,则可以用"*"代替routes:myrule.serviceId: microservicecloud-goodsmyrule.path: /myrule/**info:app.name: company-microservicecloudcompany.name: www.company.combuild.artifactId: $project.artifactId$build.version: $project.version$
(3)在启动类中增加注解@EnableZuulProxy
package com.company.zuul;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;/*** 启用路由时访问地址* http://myzuul.com:9527/microservicecloud-goods/goods/list/* 不用路由时访问地址* http://localhost:8001/goods/list/*/
@SpringBootApplication
@EnableZuulProxy
public class Zuul9527Application {public static void main(String[] args) {SpringApplication.run(Zuul9527Application.class, args);}}
创建好后,我们依次按序启动以下项目
Eureka server端项目microservicecloud-eureka-7001
服务提供者microservicecloud-provider-8001
zuul服务microservicecloud-zuul-gateway-9527
前面已经提到,zuul自身也会注册进eureka的注册中心,所以我们访问注册中心http://localhost:7001也能看到zuul服务,如下图
(三)zuul的使用
启动好相关项目后(microservicecloud-eureka-7001、microservicecloud-provider-8001、microservicecloud-zuul-gateway-9527),我们首先直接在浏览器地址栏访问服务提供者(microservicecloud-provider-8001)的接口localhost:8001/goods/list,如下图,我们可以看到服务能正常访问
接下来,我们通过Zuul的服务来访问,在浏览器地址栏输入localhost:9527/myrule/goods/list,如下图,我们发现也能正常调用服务提供者的该接口
这是因为我们在Zuul服务的application.yml配置文件中,做过了如下配置,其中zuul.routes.myrule.serviceId是指定了需要做代理的服务名称(因为服务提供者项目microservicecloud-provider-8001的application.yml中配置项spring.applicaiton.name=microservicecloud-goods),而zuul.routes.myrule.path则指定了替换的路径,即需要在服务提供者的原始接口(/goods/list)前面再增加/myrule才能访问(也即在zuul中则通过/myrule/goods/list可以访问)
另外我们发现通过zuul的localhost:9527/microservicecloud-goods/goods/list也能正常访问
也即在zuul中通过localhost:9527/microservicecloud-goods/goods/list和localhost:9527/myrule/goods/list两种方式都能实现对服务提供者的/goods/list接口进行访问。一般出于安全方面考虑,我们可以通过在zuul项目中增加zuul.ignored-services=microservicecloud-goods来禁止通过localhost:9527/microservicecloud-goods/goods/list方式的访问(如果我们想忽略所有的服务,那么可以增加配置项zuul.ignored-services="*"即可)。
接下来我们在项目中增加zuul.ignored-services=microservicecloud-goods,如下图,然后重新启动项目microservicecloud-zuul-gateway-9527,然后我们发现现在依然能通过
和localhost:9527/myrule/goods/list访问,但无法通过http://localhost:9527/microservicecloud-goods/goods/list访问了,如下图
通过/myrule/goods/list依然能正常访问
通过/microservicecloud-goods/goods/list无法访问
如果我们还希望在zuul中增加接口访问前缀,比如增加/mycompany前缀,那么可以通过在application.yml中增加配置项zuul.prefix=/mycompany,这样我们修改下配置,然后重启项目可以通过http://myzuul.com:9527/mycompany/myrule/goods/list/方式来访问了,如下图
以上就是zuul服务路由规则的配置及使用。