这边只介绍zuul相关部分的配置代码,不了解Spring Cloud的同学,最好先了解下eureka。
1. pom.xml里添加zuul依赖
1 2 3 4 |
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> |
2. 启动类上加上@EnableZuulProxy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@EnableZuulProxy @EnableEurekaClient @SpringBootApplication public class ZuulServer extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(ZuulServer.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ZuulServer.class); } } |
3. bootstrap.yml里添加zuul路由配置
这边假设有三个服务需要路由,device-service、order-service、customer-service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
zuul: routes: api-order: path: /order/v1.0/** sensitiveHeaders: Cookie,Set-Cookie,AppId serviceId: order-service api-device: path: /device/v1.0/** sensitiveHeaders: Cookie,Set-Cookie serviceId: device-service api-customer: path: /customer/v1.0/** ignoredHeaders: Cookie,Set-Cookie serviceId: customer-service ignored-services: '*' |
说明
- zuul.routes 是固定的
- api-order、api-device、api-customer 是自己定的,但最好根据要路由的服务取名
- serviceId 是 eureka 服务注册时的名称
- /order/v1.0/ 、/device/v1.0/ 、/customer/v1.0/是前端请求某个微服务的一个公共的路径名
- sensitiveHeaders 表示会过滤客户端附带的headers,例如上面设置的sensitiveHeaders=Cookie,Set-Cookie, 那如果客户端在发请求时带了Cookie,那么Cookie不会传递给下游服务。默认:zuul.sensitiveHeaders= ,什么都不设置代表不过滤任何信息。
- ignoredHeaders 会过滤服务之间通信附带的headers
如果是客户端带了Cookie,在ZUUL的Filter中又addZuulRequestHeader(“Cookie”, “new”),那么客户端的Cookie将会被覆盖,此时不需要sensitiveHeaders。
4. 添加一个filter
以下是伪代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
@Component public class UrlPathFilter extends ZuulFilter { private static final String ROUTER_ORDER = "api-order"; private static final String ROUTER_DEVICE = "api-device"; private static final String ROUTER_CUSTOMER = "api-customer"; // 四个type,route是路由真正发起的时候走的 @Override public String filterType() { return "route"; } // 数值越大,优先级越小 @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); String url = String.valueOf(ctx.get(requestUrlKey)); String routerProxy = String.valueOf(ctx.get("proxy")); if (ROUTER_DEVICE.equals(routerProxy)) { url = "/device/v1.0.0" + url; ctx.set(requestUrlKey, url); } else if (ROUTER_ORDER.equals(routerProxy)) { url = "/order/v1.0.0" + url; ctx.set(requestUrlKey, url); } else if (ROUTER_CUSTOMER.equals(routerProxy)) { url = "/customer/v1.0.0" + url; ctx.set(requestUrlKey, url); } return null; } } |
0