飞道的博客

Spring Cloud 之服务网关 Zuul (一)

346人阅读  评论(0)
Spring Cloud 之服务网关 Zuul (一)

诞生背景

微服务架构体现了面向服务开发的敏捷性. 很多公司开始重构应用, 拆解服务. 出现一个新的问题: 有时候完成某个业务, 需要到不同的主机和不同的端口上面调取接口. 服务多了以后, 这是一件很麻烦的过程. 逐渐诞生了一个面向服务治理、服务编排的组件–微服务网关

Zuul 能解决哪些问题

Zuul 是从设备或者网站请求后端应用程序的一个大门. 为内部服务提供了可配置的对外 URL 到服务的映射关系, 基于 JVM的后端路由器:

  • 认证和鉴权
  • 动态路由
  • 压力测试
  • 负载削减

简单案例

项目结构

zhiqu
|_ eureka-server
   |_ pom.xml
|_ gateway-zuul
   |_ pom.xml
|_ good-server
   |_ pom.xml

创建 Eureka-server 工程

参考: https://blog.csdn.net/zjhcxdj/article/details/104637536

创建 Zuul Server 工程

  • pom.xml 配置, 需要引入 Zuul 依赖

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    
  • application.yml 配置

    eureka:
      client:
        serverUrl:
          defaultZone: http://localhost:8761/eureka/
      instance:
        lease-renewal-interval-in-seconds: 5
        lease-expiration-duration-in-seconds: 15
        perfer-in-address: true
    
    server:
      port: 8765
    
    spring:
      application:
        name: gateway-zuul
    
    zuul:
      routes:
        joke-server:
          path: /good-server/**
          serviceId: good-server
    

    最后 5 行配置的意思是, 把所有以 good-server 开头的 URL 映射到 good-server 这个服务上去. 即可以通过访问 gateway-zuul 服务, 间接的访问 good-server 服务

  • 启动类, 要添加 @EnableZuulProxy 注解

    @EnableAutoConfiguration
    @EnableDiscoveryClient
    @EnableZuulProxy
    public class ZuulServerApplication {
        public static void main(String[] args){
            SpringApplication.run(ZuulServerApplication.class,args);
        }
    }
    

创建 good-server 服务

  • pom 文件配置

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  • application.yml 配置

    eureka:
      client:
        serverUrl:
          defaultZone: http://localhost:8761/eureka/
      instance:
        lease-renewal-interval-in-seconds: 5
        lease-expiration-duration-in-seconds: 15
        perfer-in-address: true
    
    server:
      port: 8764
    
    spring:
      application:
        name: good-server
    
  • 项目启动类

    @SpringBootApplication
    public class GoodServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(GoodServerApplication.class, args);
        }
    }
    
  • 写一个 Restful 接口

    @RestController
    @RequestMapping("/goods")
    public class GoodController {
    
        @GetMapping("/{id}")
        public String getGood(@PathVariable("id") String id) {
            return "good";
        }
    }
    
  • 测试

    1. 直接访问 good-server 服务

      http://localhost:8764/goods/fdafda

      返回: good

    2. 通过 gateway-zuul 服务间接访问 good-server 服务

      http://localhost:8765/good-server/goods/fdafda

      返回:good

      当向 gateway-zuul 发送请求的时候, 网关会向 Eureka 拉取服务列表, 然后按照路由映射规则(url 前缀:good-server -> 服务id: good-server) 路由到相应的服务上去

路由配置

简化配置

Zuul 的配置可以简化, 下面是 /good-server/** 请求映射到 joke-server 服务的路由规则

zuul:
  routes:
    good-server: /good-server/**

或者可以直接把映射规则和 serviceId 都去掉, Zuul 会生成默认的映射规则(good-server: /good-server/**):

zuul:
  routes:
    good-server:
    
# 等价于 => 
# zuul:
#   routes:
#     good-server:
#       path: /good-server/**
#       serviceId: good-server

映射到 url

如果想映射大一个具体的物理地址, 把serviceId 替换成 url 就可以了

zuul:
  routes:
    good-server:
      path: /good-server/**
      url: http://localhost: 8764		# good-server 的地址

路由前缀

一般做版本配置的时候, 会给所有的 url 加一个版本前缀:

zuul:
  prefix: /v1
  routes:
    good-server:

这样请求路径会变成: /v1/joke-server/**

路由通配符

规则 说明 示例
/** 匹配任意数量的路径和字符 /good-server/aa、/good-server/bb/cc
/* 匹配任意数量的字符 /good-server/aa、/good-server/dddd
/? 匹配单个字符 /good-server/a、/good-server/b

转载:https://blog.csdn.net/zjhcxdj/article/details/105687138
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场