Zuul的概念和作用:
Zuul包含了对请求的路由和过滤两个最主要的功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,过滤功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础;
Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的信息,也即以后的访问微服务都是通过Zuul跳转后获得。
路由实现过程:
第一步: 项目加入依赖:
<!--spring-cloud-starter-netflix-eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- spring-cloud-starter-netflix-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
第二步: 配置文件(由于Zuul最终也会注册进eureka,所以也需要配置eureka)
server.port=80
#是eureka注册中心首页的Application这一栏
spring.application.name=34-springcloud-service-zuul
#每间隔2s,向服务端发送一次心跳,证明自己依然"存活"
eureka.instance.lease-renewal-interval-in-seconds=2
#告诉服务端,如果我10s之内没有给你发心跳,就代表我故障了,将我踢出掉
eureka.instance.lease-expiration-duration-in-seconds=10
#告诉服务端,服务实例以IP作为链接,而不是取机器名
eureka.instance.prefer-ip-address=true
#告诉服务端,服务实例的id,id必须要唯一,是eureka注册中心首页的Status这一栏
eureka.instance.instance-id=34-springcloud-service-zuul
#eureka注册中心的连接地址
eureka.client.service-url.defaultZone=http://192.168.10.128:8761/eureka,http://192.168.10.128:8762/eureka,http://192.168.10.128:8763/eureka
第三步: 启动类上配置注解
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
通过zuul进行测试
启动项目后进行访问测试:
路径:
http://localhost/34-springcloud-service-portal/cloud/goodsFeign
其中:
http://localhost:80/
这个是zuul本身的项目路径
34-springcloud-service-portal
这个是要调用的项目名称(eureka的唯一id,注册到服务中心的id)
/cloud/goodsFeign
这个是被调用的contrller上的接口路径;
路径配置问题
在实际开发当中我们肯定不会通过微服务名去调用,比如我要调用消费者可能只要一个/cloud/goodsFeign
就好了,而不是/34-springcloud-service-portal/cloud/goodsFeign
加入以下配置即可:
#配置路由规则
zuul.routes.portal.service-id=34-springcloud-service-portal
zuul.routes.portal.path=/portal/**
然后:http://localhost/portal/cloud/goodsFeignHystrix
即可访问到。
/ **代表是所有(多个)层级 /cloud/goodsFeignHystrix
/ * 是代表一层;
如果是/ * 的话 /api/goods 就不会被路由;
禁止通过微服务名称访问
此时我们能通过自定义的规则进行访问,但是我们现在依然能用之前的微服务名调用,这是不合理的,第一是有多重地址了, 第二一般微服务名这种最好不要暴露在外,所以我们一般会禁用微服务名方式调用。
加入配置:
zuul.ignored-services=34-springcloud-service-portal
这里能发现我们不能通过微服务名来调用了, 不过这个配置如果一个一个通过微服务名来配置难免有点复杂,所以一般这样配置来禁用所有:
zuul.ignored-services=*
对访问路径加统一规范
可能有时候我们的接口调用需要一定的规范,比如调用微服务的API URL前缀需要加上/api 对于这种情况,zuul也考虑到了并给出了解决方案:
zuul.prefix=/api
比如:http://localhost/api/portal/cloud/goodsFeignHystrix
通配符
通配符 | 含义 | 举例 | 说明 |
---|---|---|---|
? | 匹配任意单个字符 | /34-springcloud-service-feign/? | 匹配/34-springcloud-service-feign/a, /34-springcloud-service-feign/b, /34-springcloud-service-feign/c 等 |
* | 匹配任意数量的字符 | /34-springcloud-service-feign/* | 匹配 /34-springcloud-service-feign/aaa, /34-springcloud-service-feign/bbb, /34-springcloud-service-feign/ccc 等, 无法匹配 /34-springcloud-service-feign/a/b/c |
** | 匹配任意数量的字符 | /34-springcloud-service-feign/** | 匹配 /34-springcloud-service-feign/aaa, /34-springcloud-service-feign/bbb, /34-springcloud-service-feign/ccc 等, 也可以匹配 /34-springcloud-service-feign/a/b/c |