zuul是一个路由功能组件,当连上eureka后,可通过url/服务id/api
进行服务的调用,例如,原生为http://192.168.2.201:8080/provider/1
使用zuul为http://192.168.2.201:8040/
simple-provider/provider/1
zuul配置(path+serviceId)
配置方式一
zuul:
routes:
simple-provider: /pro/**
#applicationName 服务重定向到一个新的URL上
配置方式二
#abcUnique 名称唯一即可
zuul:
routes:
abcUnique:
path: /pro/**
serviceId: simple-provider
zuul配置(path+url)
#abcUnique 名称唯一即可
zuul:
routes:
abcUnique:
path: /pro/**
url: http://192.168.2.201:8080
#url为服务器的host
zuul配置ribbon负载均衡
zuul:
routes:
abcUnique:
path: /pro/**
service-id: simple-provider
simple-provider: #这个ribbon要请求serviceId
ribbon:
listOfServers: http://127.0.0.1:8080,http://127.0.0.1:8008
配完serviceId后,再配ribbon的服务器列表,即可实现负载均衡
zuul配置断路器fallback
为单个路由设置fallback
getRoute
里面就是要配的路由ID
class MyFallbackProvider implements ZuulFallbackProvider {
@Override
public String getRoute() {
return "customers";
}
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "OK";
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("fallback".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
全局路由设置fallback
其实和单个一样的,只是路由ID设置为通配符
class MyFallbackProvider implements ZuulFallbackProvider {
@Override
public String getRoute() {
return "*";
}
@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "OK";
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("fallback".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
zuul过滤器配置
过滤器原理
编写过滤器类
package com.example.demo;
import com.netflix.zuul.ZuulFilter;
public class CustomZuulFilter extends ZuulFilter {
/**
* 执行逻辑
*/
@Override
public Object run() {
System.err.println("经过了zuul filter");
return null;
}
/**
* 返回一个boolean类型来判断该过滤器是否要执行。我们可以通过此方法来指定过滤器的有效范围。
*/
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true;
}
/**
* 通过int值来定义过滤器的执行顺序,数值越小优先级越高
*/
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
/**
* 有三种可以选 pre:可以在请求被路由之前调用。 routing:在路由请求时候被调用。 post:在routing和error过滤器之后被调用。
* error:处理请求时发生错误时被调用。
*/
@Override
public String filterType() {
// TODO Auto-generated method stub
return "pre";
}
}
配置到spring管理
@SpringBootApplication
@EnableZuulProxy
public class MicroserviceGatewayApplication {
@Bean
public CustomZuulFilter customZuulFilter() {
return new CustomZuulFilter();
}
public static void main(String[] args) {
SpringApplication.run(MicroserviceGatewayApplication.class, args);
}
}