诞生背景
微服务架构体现了面向服务开发的敏捷性. 很多公司开始重构应用, 拆解服务. 出现一个新的问题: 有时候完成某个业务, 需要到不同的主机和不同的端口上面调取接口. 服务多了以后, 这是一件很麻烦的过程. 逐渐诞生了一个面向服务治理、服务编排的组件–微服务网关
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"; } }
-
测试
-
直接访问 good-server 服务
http://localhost:8764/goods/fdafda
返回: good
-
通过 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