本文共 3542 字,大约阅读时间需要 11 分钟。
网关在整个微服务的系统中角色是非常重要的。很多公司网关都是自己写的。网关的作用非常多,比如路由、限流、降级、安全控制、服务的聚合。
目前有哪些技术可以用来做网关:
- nginx upstream app{ip,ip,ip}
- spring cloud gateway
- netflix zuul
- 自定义网关
步骤一: 引入依赖
org.springframework.cloud spring-cloud-starter-netflix-zuul
步骤二:编写配置文件
步骤三:打上注解
@EnableDiscoveryClient@EnableZuulProxy@SpringBootApplicationpublic class QfSpringCloudNetflixZuulApplication { public static void main(String[] args) { SpringApplication.run(QfSpringCloudNetflixZuulApplication.class, args); }}
当strip-prefix: true 时,在接口中使用的路径,是接口真实存在的路径。
1)全局路径的设置
2)局部路径的设置
/**/admin/**在zuul的配置文件中加入这一段:ignored-patterns: /**/admin/**那么接口中只要带有/admin/的,就都不能访问
zuul: routes: api-a: path: /api/a/** serviceId: hello-spring-cloud-web-admin-ribbon# stripPrefix: false# 是可以携带cookie,如果不加的话,那cookie携带不过来 sensitiveHeaders:
通过创建一个FallbackProvider的实现类,在类中指明错误回调内容
@Componentpublic class MyGatewayFallback implements FallbackProvider { /* 设置要对哪些服务进行错误回调,return 具体的服务名称, 也可以return "*" 获得return null ==>对所有服务进行错误回调 */ @Override public String getRoute() { return "hello-spring-cloud-web-admin-ribbon"; } /* 具体的回调内容 */ @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { return new ClientHttpResponse() { /* 返回一个状态码 */ @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return HttpStatus.OK.value(); } @Override public String getStatusText() throws IOException { return HttpStatus.OK.getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); Mapmap = new HashMap (); map.put("status",200); map.put("message","无法连接,请检查您的网络"); return new ByteArrayInputStream(objectMapper.writeValueAsBytes(map)); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); // 和 getBody 中的内容编码一致 headers.setContentType(MediaType.APPLICATION_JSON_UTF8); return headers; } }; }}
1)过滤器的类型
2)过滤器该怎么样实现过滤和放行
@Componentpublic class MyZuulFilter extends ZuulFilter { /* 配置过滤器类型,根据生命周期的不同,有四种类型 1.pre: 路由之前 2.routing: 路由之时 3.post: 路由之后 4.error: 在上面三者执行过程中出现了异常就会调用该error过滤器 */ @Override public String filterType() { return "pre"; } //相同过滤器类型之间确定执行的顺序,0就表示第一个执行。 @Override public int filterOrder() { return 0; } /* 配置是否需要过滤:true 需要 false 不需要 */ @Override public boolean shouldFilter() { return true; } /** * 过滤器要执行过滤的具体的内容 * 如果这一次请求,没有携带cookie,那么就不进行路由。 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { //得到request的当前的上下文对象 RequestContext ctx = RequestContext.getCurrentContext(); //得到request对象 HttpServletRequest request = ctx.getRequest(); Cookie[] cookies = request.getCookies(); if(cookies==null||cookies.length==0){ //不进行路由 ctx.setSendZuulResponse(false); //设置返回状态码 ctx.setResponseStatusCode(401); //设置返回体 ctx.setResponseBody("no permission"); //设置自定义键值对 ctx.set("isSuccess",false); }else{ //进行路由 ctx.setSendZuulResponse(true); ctx.setResponseStatusCode(200); ctx.set("isSuccess",true); } return null; }}
过滤器的执行流程
转载地址:http://sdncl.baihongyu.com/