背景:
既然zuul作为微服务“路由器”,那么他的路由功能一定非常的丰富,所以这里就简单的列举几种路由配置:
第一种:单实例serviceId映射
思路:是一个/client/**到client-a服务的一个映射规则
zuul:
routes:
client-a:
path: /client/**
serviceId: client-a
#更简单的写法就是
zuul:
routes:
client-a: /client/**
第二种:单实例url映射
思路:除了路由到服务外,还能路由到物理地址,将上面的serviceId换成url即可
zuul:
routes:
client-a:
path: /client/**
url: http://localhost:9001 # client-a的地址
第三种:多实例路由
思路:在默认情况下,zuul会使用Eureka中集成的基本负载均衡功能,如果要使用ribbon的负载均衡功能,就需要指定一个serviceId,此操作需要禁止ribbon使用eureka,
zuul:
routes:
client-a:
path: /client/**
serviceId: client-a
#禁止ribbon使用Eureka
ribbon:
eureka:
enabled: false
ribbon-route:
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
listOfServers: localhost:9001,localhost:9002
第四种:forward本地跳转
思路:如果我们希望在访问/client这个接口的时候跳转到这个方法上来处理,就需要使用zuul的本地跳转
zuul:
routes:
client-a:
path: /client/**
url: forward: /client
然后需要在网关中写好一个接口,接口代码如下
@RestController
public class TestZuulController{
@GetMapping("/client")
public Result add(Integer a,Intager b){
System.out.println(a+b);
return new Result(0000,"zuul测试成功");
}
}
第五种:相同路径的加载配置
思路:有一种特殊的情况,为一个映射路径指定多个serviceId,那么他应该加载那个服务呢?
zuul:
routes:
client-a:
path: /client/**
serviceId: client-a
client-b:
path: /client/**
serviceId: client-b
经过我的测试,他总是会路由到最后一个服务中,应该是yml解释器工作的时候,一个映射路径配置多个服务的话,他最后一个应该覆盖掉前面的服务,
最后说下路由通配符
/** #匹配任意数量的路径与字符 /client/add, /client/add/add , /client/add/c
/* #匹配任意数量的字符 /client/add /client/as /client/a
/? #匹配单个字符 /client/a /client/b /client/c