假设有两个服务提供者:service1和service2,它们都提供了一个名为hello的接口。
配置文件
代码语言:javascript复制zuul:
routes:
service1:
path: /service1/**
serviceId: service1
service2:
path: /service2/**
serviceId: service2
service1:
ribbon:
listOfServers: server1:8080,server2:8080
service2:
ribbon:
listOfServers: server3:8080,server4:8080
启动服务提供者
分别启动service1和service2两个服务提供者。
启动Zuul
代码语言:javascript复制@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
访问接口
现在可以通过Zuul来访问服务提供者的接口了,例如访问service1的hello接口:
代码语言:javascript复制http://localhost:8080/service1/hello
Zuul会将请求路由到service1服务提供者的其中一个实例上,实现负载均衡。同样的,访问service2的hello接口:
代码语言:javascript复制http://localhost:8080/service2/hello
配置负载均衡算法
Zuul使用Ribbon来实现负载均衡,可以配置不同的负载均衡算法。例如,将service1服务的负载均衡算法改为随机算法:
代码语言:javascript复制service1:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
listOfServers: server1:8080,server2:8080
配置路由策略
Zuul支持多种路由策略,可以根据请求的路径、参数等条件进行路由。例如,将所有以/api开头的请求路由到service1服务:
代码语言:javascript复制zuul:
routes:
service1:
path: /api/**
serviceId: service1
配置过滤器
Zuul支持自定义过滤器,可以对请求进行预处理、校验、修改等操作。例如,编写一个自定义的过滤器,在请求头中添加一个X-Request-ID字段:
代码语言:javascript复制public class AddRequestHeaderFilter extends ZuulFilter {
@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 ctx = RequestContext.getCurrentContext();
ctx.addZuulRequestHeader("X-Request-ID", UUID.randomUUID().toString());
return null;
}
}
然后在应用程序中注册这个过滤器:
代码语言:javascript复制@Bean
public AddRequestHeaderFilter addRequestHeaderFilter() {
return new AddRequestHeaderFilter();
}
现在,每个请求都会在经过Zuul之前,被这个过滤器拦截,并在请求头中添加一个X-Request-ID字段。