SpringCloud之zuul(网关)转发服务(四)
简介:zuul在Spring Cloud微服务系统中,客户端的请求首先经过负载均衡(zuul、Ngnix),再到达服务网关(zuul集群),再到具体的路由(服务)。主要功能:主要是转发请求与过滤器,还有全局处理异常,它默认集成了ribbon实现负载均衡的效果。有时候还和Spring security配合使用,达到对每个服务安全和高可用的效果。(此处不举例子,以后更新)开始搞!!!:...
·
简介:zuul
在Spring Cloud微服务系统中,客户端的请求首先经过负载均衡(zuul、Ngnix),再到达服务网关(zuul集群),再到具体的路由(服务)。
主要功能:主要是转发请求与过滤器,还有全局处理异常,它默认集成了ribbon实现负载均衡的效果。
有时候还和Spring security配合使用,达到对每个服务安全和高可用的效果。(此处不举例子,以后更新)
开始搞!!!:
一丶创建module项目
二丶我的核心依赖供参考
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
三丶启动类书写
@SpringBootApplication
/**
*开启网关
**/
@EnableZuulProxy
/**
*将网关注册到(eureka)服务中心去
**/
@EnableEurekaClient
public class XwlZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(XwlZuulServerApplication.class, args);
}
}
四丶配置文件如下
server:
port: 5786
spring:
#设置网关在规定时间响应时进行重机制
#cloud:
# loadbalancer:
# retry:
# enabled: true
application:
name: xwl-zuul-server
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8764/eureka/
register-with-eureka: true
fetch-registry: true
#设置熔断器执行时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
#客户端响应等待时间
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000
zuul:
routes:
##意味着通过/xwlget 的http呼叫将转发到xwl-git-server 服务,
#标识
xwl-get-server:
path: /xwlget/**
serviceId: xwl-git-server
xwl-gitxiao-server:
path: /xwlgitxiao/**
serviceId: xwl-gitxiao-server
##为所有路由添加前缀
prefix: /test
#设置敏感标题
sensitive-headers: Cookie,Set-Cookie
#待核实
endpoints:
routes:
enabled: false
五丶全局控制异常类
说明:主要控制所有服务的请求转发时由zuul监控,如果出现超时等情况,这里会回退异常,可自行关闭之前的服务进行请求测试。
package com.itxwl.xwlzuulserver.filter;
import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 全局控制异常信息
*/
@Component
public class ServiceFallbackProvider 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("服务故障,请稍后重试!".getBytes());
}
//设置编码为utf-8
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
};
}
}
六丶过滤器拦截处理
说明:这里就拦截通过网关访问其它服务时,没有带参数tocken的情况,如果携带了验证通过返回信息,如果未通过,拦截。
package com.itxwl.xwlzuulserver.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Component
public class ZuulFilterEveryServer extends ZuulFilter {
/**
* pre:可以在请求被路由之前调用
* route:在路由请求时候被调用
* post:在route和error过滤器之后被调用
* error:处理请求时发生错误时被调用
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 优先级为0,数字越大,优先级越低
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* // 是否执行该过滤器,此处为true,说明需要过滤
* @return
*/
@Override
public boolean shouldFilter() {
//RequestContext currentContext = RequestContext.getCurrentContext();
//if ((boolean)currentContext.get("isSuccess")==true){
return true;
//}
//return false;
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String tocken = request.getParameter("tocken");
if (tocken==null||tocken.isEmpty()){
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody("token is null,please add tocken !");
}
return null;
}
}
更多推荐
已为社区贡献3条内容
所有评论(0)