Zuul 网关

一、什么是Zuul

服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外提供REST API .除了具备服务路由、负载均衡功能之外, 它还具备权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。

Zuul加入后的架构

 不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都会经过Zuul这个网关,然后再由网关来实现 鉴权、动态路由等等操作。Zuul就是我们服务的统一入口

二、Zuul 快速入门

1、添加依赖

2、编写启动类

通过 @EnableZuulProxy 注解开启Zuul的功能

@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
public class ZuulDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulDemoApplication.class, args);
    }
}

3、编写配置

server:
  port: 10010 #服务端口
spring: 
  application:  
    name: api-gateway #指定服务名 

4、编写路由规则

我们需要用Zuul 来代理User-Service 服务

映射规则

zuul:
  routes:
    user-service: # 这里是路由id,随意写
      path: /user-service/** # 这里是映射路径
      url: http://127.0.0.1:8081 # 映射路径对应的实际url地址

我们将 /user-service/**开头的请求,代理到http://127.0.0.1:8081

5、面向服务的路由(改进)

在刚才的路有规则中,我们吧路径对应的服务地址写死了! 如果一个服务有多个实例,这样

做显然就是不合理的。

我们应该根据服务的名称,去Eureka注册中心 查询该服务对应的所有实例列表,然后进行动态路由

1)添加Eureka 客户端依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)开启客户端的发现功能

@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
@EnableDiscoveryClient
public class ZuulDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulDemoApplication.class, args);
    }
}

3)添加Eureka 配置,获取服务信息

eureka:
  client:
    registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1

4)修改映射配置,通过服务名称获取

zuul:
  routes:
    user-service: # 这里是路由id,随意写
      path: /user-service/** # 这里是映射路径
      serviceId: user-service # 指定服务名称

5)测试

6)补充:简化的路由配置

而大多数情况下,我们的<route>路由名称往往和 服务名会写成一样的。因此Zuul就提供了一种简化的配置语法:zuul.routes.<serviceId>=<path>

zuul:  
  routes:  
     user-service: /user-service/** # 这里是映射路径

7)指定前缀

zuul:
  prefix: /api # 添加路由前缀
  routes:
      user-service: # 这里是路由id,随意写
        path: /user-service/** # 这里是映射路径
        service-id: user-service # 指定服务名称

我们通过zuul.prefix=/api来指定了路由的前缀,这样在发起请求时,路径就要以/api开头。

路径/api/user-service/user/1将会被代理到/user-service/user/1

原文地址:https://www.cnblogs.com/houchen/p/12063985.html