1 zuul网关
1.1 新建工程
填写基本信息:
添加Zuul依赖
1.2 编写配置
server:
port: 10010 #服务端口
spring:
application:
name: api-gateway #指定服务名
1.3 编写引导类
通过@EnableZuulProxy注解开启Zuul的功能:
@SpringBootApplication
@EnableZuulProxy // 开启网关功能
public class ItcastZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ItcastZuulApplication.class, args);
}
}
1.4 编写路由规则
我们需要用Zuul来代理service-provider服务,先看一下控制面板中的服务状态:
- ip为:127.0.0.1
- 端口为:8081
映射规则:
server:
port: 10010 #服务端口
spring:
application:
name: api-gateway #指定服务名
zuul:
routes:
service-provider: # 这里是路由id,随意写
path: /service-provider/** # 这里是映射路径
url: http://127.0.0.1:8081 # 映射路径对应的实际url地址
我们将符合path 规则的一切请求,都代理到 url参数指定的地址
本例中,我们将 /service-provider/**开头的请求,代理到http://127.0.0.1:8081
1.5 启动测试
访问的路径中需要加上配置规则的映射路径,我们访问:http://127.0.0.1:10010/service-provider/user/1
2. 面向服务的路由
在刚才的路由规则中,我们把路径对应的服务地址写死了!如果同一服务有多个实例的话,这样做显然就不合理了。我们应该根据服务的名称,去Eureka注册中心查找 服务对应的所有实例列表,然后进行动态路由才对!
对itcast-zuul工程修改优化:
2.1 添加Eureka客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.2 添加Eureka配置,获取服务信息
eureka:
client:
registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
service-url:
defaultZone: http://127.0.0.1:10086/eureka
2.3 开启Eureka客户端发现功能
@SpringBootApplication
@EnableZuulProxy // 开启Zuul的网关功能
@EnableDiscoveryClient
public class ZuulDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulDemoApplication.class, args);
}
}
2.4 修改映射配置,通过服务名称获取
zuul:
routes:
service-provider: # 这里是路由id,随意写
path: /service-provider/** # 这里是映射路径
serviceId: service-provider # 指定服务名称
2.5 启动测试
再次启动,这次Zuul进行代理时,会利用Ribbon进行负载均衡访问
3 简化的路由配置
在刚才的配置中,我们的规则是这样的:
- zuul.routes..path=/xxx/**: 来指定映射路径。是自定义的路由名
- zuul.routes..serviceId=service-provider:来指定服务名。
而大多数情况下,我们的路由名称往往和服务名会写成一样的。因此Zuul就提供了一种简化的配置语法:zuul.routes.=
比方说上面我们关于service-provider的配置可以简化为一条:
zuul:
routes:
service-provider: /service-provider/** # 这里是映射路径
省去了对服务名称的配置。
4 默认的路由规则
在使用Zuul的过程中,上面讲述的规则已经大大的简化了配置项。但是当服务较多时,配置也是比较繁琐的。因此Zuul就指定了默认的路由规则:
- 默认情况下,一切服务的映射路径就是服务名本身。例如服务名为:service-provider,则默认的映射路径就 是:/service-provider/**
也就是说,刚才的映射规则我们完全不配置也是OK的,不信就试试看
5 路由前缀
配置示例:
zuul:
routes:
service-provider: /service-provider/**
service-consumer: /service-consumer/**
prefix: /api # 添加路由前缀
我们通过zuul.prefix=/api来指定了路由的前缀,这样在发起请求时,路径就要以/api开头。