zuul集成Eureka
通过刚才的示例,我们已经可以简单地使用 Zuul 进行路由的转发了,在实际使用中我们通常是用 Zuul 来代理请求转发到内部的服务上去,统一为外部提供服务。内部服务的数量会很多,而且可以随时扩展,我们不可能每增加一个服务就改一次路由的配置,所以也得通过结合 Eureka 来实现动态的路由转发功能。首先需要添加 Eureka 的依赖,代码如下所示。
<dependency>
<groupId>org.springframework.cloud</groupId >
<artifactId>spring-cloud- starter-netflix-eureka-client</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
说明:这里的eureka-client版本要使用2.2.9.RELEASE,否则会报错!
启动类不需要修改,因为 @EnableZuulProxy 已经自带了 @EnableDiscoveryClient。只需要在配置文件中增加Eureka 的地址即可:
eureka:
client:
service-url:
defaultZone: http://admin:1357@localhost:8761/eureka
重启服务,我们可以通过默认的转发规则来访问 Eureka中的服务。访问规则是“网关服务地址+访问的服务名称+接口 URI”。
如上面的访问改为: http://localhost:7000/ws-user-server/user/23
Zuul路由配置
当 Zuul 集成 Eureka 之后,其实就可以为 Eureka 中所有的服务进行路由操作了,默认的转发规则就是“网关 服务地址+访问的服务名称+接口 URI”。在给服务指定名称的时候,应尽量短一点,这样的话我们就可以用默认的路由规则进行请求,不需要为每个服务都定一个路由规则,这样就算新增了服务,API 网关也不用修改和重启了。
1. 指定具体服务路由
我们可以为每一个服务都配置一个路由转发规则:
zuul:
routes: #路由转发
ws-user-server:
path: /api-user @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { RequestContext requestContext=RequestContext.getCurrentCo ntext();String token= requestContext.getRequest().getHeader("tok en"); //如果token没传或 失效 if(null==token){ requestContext.setSendZuulResponse(false); //告诉 Zuul 不需要将当前请求转发到后端的服务了 requestContext.setResponseBody(" {code:0,msg:'返回给客户端的数据'}"); requestContext.getResponse().setContentTyp e("application/json; charset=utf-8"); }return null; } }