微服务一般是由几十、上百个服务组成,对于一个URL请求,最终会确认一个服务实例进行处理。如果对每个服务实例手动指定一个唯一访问地址,然后根据
URL去手动实现请求匹配,这样做显然就不合理。
Zuul支持与
Eureka
整合开发,根据
ServiceID自动的从注册中心中获取服务地址并转发请求,这样做的好处不仅可以通过单个端点来访问应用的所有服务,而且在添加或移除服务实例的时候不用修改
Zuul的路由配置。
一,在zuul 模块添加
1.1 添加Eureka客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1.2 开启Eureka客户端发现功能 添加@EnableDiscoveryClient
@SpringBootApplication
@EnableZuulProxy //开启zuul网关服务
@EnableDiscoveryClient //开启eureka 服务
public class ZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication.class,args);
}
}
1.3 配置yml 文件,添加eureka 配置
server:
port: 8086 #服务端口
spring:
application:
name: api-gateway #指定服务名
zuul:
routes:
service-order: # 这里是路由id,随意写
path: /service-order/** # 这里是映射路径
#url: http://127.0.0.1:9002 # 映射路径对应的实际url地址
serviceId: service-order
sensitiveHeaders: #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取 消默认的黑名单,如果设置了具体的头信息则不会传到下游服务
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:9003/eureka/
registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
instance:
preferIpAddress: true
ip-address: 127.0.0.1
1.4 修改映射配置,通过服务名称获取
因为已经有了
Eureka
客户端,我们可以从
Eureka
获取服务的地址信息,因此映射时无需指定
IP地址,而是通过服务名称来访问,而且
Zuul
已经集成了
Ribbon
的负载均衡功能。
server:
port: 8086 #服务端口
spring:
application:
name: api-gateway #指定服务名
zuul:
routes:
service-order: # 这里是路由id,随意写
path: /service-order/** # 这里是映射路径
#url: http://127.0.0.1:9002 # 映射路径对应的实际url地址
serviceId: service-order
sensitiveHeaders: #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取 消默认的黑名单,如果设置了具体的头信息则不会传到下游服务
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:9003/eureka/
registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
instance:
preferIpAddress: true
ip-address: 127.0.0.1
zuul:
routes:
service-order: # 这里是路由id,随意写
path: /service-order/** # 这里是映射路径
#url: http://127.0.0.1:9002 # 映射路径对应的实际url地址
serviceId: service-order
sensitiveHeaders: #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取 消默认的黑名单,如果设置了具体的头信息则不会传到下游服务
serviceId:
指定需要转发的微服务实例名称
也是同样效果。