博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
routing zuul_Zuul网关
阅读量:6914 次
发布时间:2019-06-27

本文共 3542 字,大约阅读时间需要 11 分钟。

网关在整个微服务的系统中角色是非常重要的。很多公司网关都是自己写的。网关的作用非常多,比如路由、限流、降级、安全控制、服务的聚合。

目前有哪些技术可以用来做网关:

- nginx upstream app{ip,ip,ip}

- spring cloud gateway

- netflix zuul

- 自定义网关

1. 使用网络做接口路由

步骤一: 引入依赖

org.springframework.cloud
spring-cloud-starter-netflix-zuul

步骤二:编写配置文件

3d7430eeda7b6b1a448f98d5a46e7355.png

步骤三:打上注解

@EnableDiscoveryClient@EnableZuulProxy@SpringBootApplicationpublic class QfSpringCloudNetflixZuulApplication {    public static void main(String[] args) {        SpringApplication.run(QfSpringCloudNetflixZuulApplication.class, args);    }}

2. 统一前缀的设置

当strip-prefix: true 时,在接口中使用的路径,是接口真实存在的路径。

1)全局路径的设置

a92eb47d62dfbaeba0a330478848771f.png

2)局部路径的设置

e21115935420a2dedb2c9360b7580735.png

3. 保护敏感路径

/**/admin/**在zuul的配置文件中加入这一段:ignored-patterns: /**/admin/**那么接口中只要带有/admin/的,就都不能访问

4. 过滤掉敏感头

zuul:  routes:    api-a:      path: /api/a/**      serviceId: hello-spring-cloud-web-admin-ribbon#      stripPrefix: false# 是可以携带cookie,如果不加的话,那cookie携带不过来      sensitiveHeaders:

5. 设置服务的回调方法实现服务降级

通过创建一个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();                Map
map = 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; } }; }}

6. 网关过滤器的用法

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;    }}

过滤器的执行流程

042d496cc6d76b9ad1c98771aeae15c0.png

042d496cc6d76b9ad1c98771aeae15c0.png

转载地址:http://sdncl.baihongyu.com/

你可能感兴趣的文章
习题10-1 UVA 11040(无聊水一水)
查看>>
Robotframe work之环境搭建(一)
查看>>
uvm_reg_adapter——寄存器模型(十八)
查看>>
运行时异常与编译时异常
查看>>
Excel自定义函数开发手记
查看>>
Shell编程练习
查看>>
Magento多语言设置——优化前台与后台实现方法
查看>>
如何修改遗失的MySQL的ROOT用户密码
查看>>
leetcode121买股票
查看>>
搭建dubbo+zookeeper+dubboadmin分布式服务框架(windows平台下)
查看>>
Python利用带权重随机数解决抽奖和游戏爆装备问题
查看>>
Zabbix 源码编译安装
查看>>
Kickstart无人值守安装[转载]
查看>>
消息队列一:为什么需要消息队列(MQ)?
查看>>
最基本springMVC,响应页面请求
查看>>
Sencha-概念-Environment Detection(环境检测)(官网文档翻译12)
查看>>
jsp学习-分页功能的实现
查看>>
第三章 熟悉常用的HDFS操作
查看>>
23种C++设计模式:Factory 模式
查看>>
Tomcat在webapps下部署多个项目
查看>>