# bs-api-gateway **Repository Path**: SpringCloudTestGroup/bs-api-gateway ## Basic Information - **Project Name**: bs-api-gateway - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-11-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # bs-api-gateway #### 项目介绍 1. Zuul 介绍 Zuul 在 Spring Cloud 微服务体系中担任很重要的角色--服务网关,是基于JVM的路由器和负载均衡器。 2. Zuul 的主要功能 ``` 1. 身份认证 2. 审查与监控 3. 压力测试 4. 金丝雀测试 5. 动态路由 5. 服务迁移 6. 负载分配 7. 安全 8. 静态响应处理 9. 主动/主动流量管理 ``` #### 软件架构 软件架构说明 主要参考 [SpringCloud 之 Zuul 源代码详细笔记](https://my.oschina.net/alexqdjay/blog/1802503) #### 主要安装教程 1. pom.xml 主要 ``` org.springframework.cloud spring-cloud-starter-netflix-zuul ``` 2. 主类 ``` package com.example.gateway; import com.example.gateway.filter.AccessFilter; import com.example.gateway.filter.ResponseFilter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; @SpringBootApplication @EnableDiscoveryClient `注册中心-客户端标记` //@EnableFeignClients @EnableZuulProxy `Zuul服务器标记` public class GatewayApplication { public static void main(String[] args) { long starTime = System.currentTimeMillis(); SpringApplication.run(GatewayApplication.class, args); long endTime = System.currentTimeMillis(); long time = endTime - starTime; System.out.println("\nStart Time: " + (time / 1000) + " s"); System.out.println("..............................................................."); System.out.println("..................Service starts successfully.................."); System.out.println("..............................................................."); } @Bean public AccessFilter accessFilter() {`访问过滤器` return new AccessFilter(); } @Bean public ResponseFilter responseFilter() {`返回过滤器` return new ResponseFilter(); } } ``` 3. AccessFilter过滤器 ``` package com.example.gateway.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import javax.servlet.http.HttpServletRequest; /** * Created by liuliyun-ds on 2018/12/13. */ public class AccessFilter extends ZuulFilter{ /** * per:路由之前,如实现认证、记录调试信息等 * routing:路由时 * post:路由后,比如添加HTTP Header * error:发生错误时调用 */ @Override public String filterType() { //过滤器类型 return "pre"; // return "post"; } @Override public int filterOrder() { //过滤器顺序 return 0; } @Override public boolean shouldFilter() { //true 过滤 false 不过滤 return true; } @Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); //是否路由到相应的服务`根据自已的业务写` ctx.setSendZuulResponse(true); ctx.setResponseStatusCode(422); // ctx.setResponse(null); // ctx.setResponseBody("message from api access filter"); // if (request.getParameter("type").equals("apiError")){ // throw new RuntimeException("exception from gateway"); // } return null; } } ``` 4. ResponseFilter过滤器 ``` package com.example.gateway.filter; import com.google.common.io.CharStreams; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * Created by liuliyun-ds on 2018/12/13. */ public class ResponseFilter extends ZuulFilter { @Override public String filterType() { return "post"; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException {`主要是返回过滤信息` RequestContext ctx = RequestContext.getCurrentContext(); int statusCode = ctx.getResponseStatusCode(); InputStream inputStream = ctx.getResponseDataStream(); ctx.getResponse().setCharacterEncoding("utf-8"); try {`可以根据实际业务改写` final String responseData = CharStreams.toString(new InputStreamReader(inputStream, "UTF-8")); System.out.println(responseData); ctx.setResponseBody(responseData); } catch (IOException e) { e.printStackTrace(); } return null; } } ``` #### 使用说明 1. eg: http://localhost:9000/bs-server/hello?token=1 2. eg: http://10.115.37.19:9006/serviceA/test 3. xxxx #### 参考 1. [SpringCloud 之 Zuul 源代码详细笔记](https://my.oschina.net/alexqdjay/blog/1802503) 2. [一起来学SpringCloud之 - 路由网关(Zuul)](https://blog.csdn.net/memmsc/article/details/78122914)