网关在整个微服务的系统中角色是非常重要的。很多公司网关都是自己写的。网关的作用非常多,比如路由、限流、降级、安全控制、服务的聚合。
目前有哪些技术可以用来做网关:
- nginx upstream app{ip,ip,ip}
- spring cloud gateway
- netflix zuul
- 自定义网关
1. 使用网络做接口路由
步骤一: 引入依赖
org.springframework.cloudspring-cloud-starter-netflix-zuul
步骤二:编写配置文件
步骤三:打上注解
@EnableDiscoveryClient@EnableZuulProxy
@SpringBootApplicationpublic class QfSpringCloudNetflixZuulApplication {public static void main(String[] args) {SpringApplication.run(QfSpringCloudNetflixZuulApplication.class, args);}}
2. 统一前缀的设置
当strip-prefix: true 时,在接口中使用的路径,是接口真实存在的路径。
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 ==>对所有服务进行错误回调*/
@Overridepublic String getRoute() {return "hello-spring-cloud-web-admin-ribbon";}/*具体的回调内容*/
@Overridepublic ClientHttpResponse fallbackResponse(String route, Throwable cause) {return new ClientHttpResponse() {/*返回一个状态码*/
@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return HttpStatus.OK.value();}@Overridepublic String getStatusText() throws IOException {return HttpStatus.OK.getReasonPhrase();}@Overridepublic void close() {}@Overridepublic 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));}@Overridepublic 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过滤器*/
@Overridepublic String filterType() {return "pre";}//相同过滤器类型之间确定执行的顺序,0就表示第一个执行。
@Overridepublic int filterOrder() {return 0;}/*配置是否需要过滤:true 需要 false 不需要*/
@Overridepublic boolean shouldFilter() {return true;}/*** 过滤器要执行过滤的具体的内容* 如果这一次请求,没有携带COOKIE,那么就不进行路由。* @return
* @throws ZuulException*/
@Overridepublic 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;}
}
过滤器的执行流程