阅读完需:约 3 分钟
Spring Cloud中的Ribbon、Hystrix、Feign这些知识点大家都耳熟能详了,我们在前文也提到过微服务就是把一个大的项目拆分成很多小的独立模块,然后通过服务治理让这些独立的模块配合工作等。那么大家来想这样两个问题:1.如果我的微服务中有很多个独立服务都要对外提供服务,那么对于开发人员或者运维人员来说,他要如何去管理这些接口?特别是当项目非常大非常庞杂的情况下要如何管理?2.权限管理也是一个老生常谈的问题,在微服务中,一个独立的系统被拆分成很多个独立的模块,为了确保安全,我难道需要在每一个模块上都添加上相同的鉴权代码来确保系统不被非法访问?如果是这样的话,那么工作量就太大了,而且维护也非常不方便。
为了解决上面提到的问题,我们引入了API网关的概念,API网关是一个更为智能的应用服务器,它有点类似于我们微服务架构系统的门面,所有的外部访问都要先经过API网关,然后API网关来实现请求路由、负载均衡、权限验证等功能。Spring Cloud中提供的Spring Cloud Zuul实现了API网关的功能。
中文文档:
https://www.springcloud.cc/spring-cloud-dalston.html#_external_configuration_archaius

Zuul 的功能:
- 权限控制,可以做认证和授权
- 监控
- 动态路由
- 负载均衡
- 静态资源处理
1.创建项目:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
2.配置
将 zuul 注册到 eureka 上:
spring.application.name=zuul
server.port=2020
eureka.client.service-url.defaultZone=http://localhost:1111/eureka
3. 开启网关代理
@SpringBootApplication
@EnableZuulProxy//开启网关代理
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
4.项目启动
配置完成后,重启 Zuul,接下来,在浏览器中,通过 Zuul 的代理就可以访问到 provider 了
在这个访问地址中,provider 就是要访问的服务名称,/hello 则是要访问的服务接口。(项目启动的前提是要有 provider 和 (Eureka)注册中心)
这是一个简单例子,Zuul 中的路由规则也可以自己配置。
zuul.routes.javaboy-a.path=/javaboy-a/**
zuul.routes.javaboy-a.service-id=provider
上面这个配置,表示 /javaboy-a/** ,满足这个匹配规则的请求,将被转发到 provider 实例上。上面两行配置,也可以进行简化:
zuul.routes.provider=/javaboy-a/**