APIGateway网关安全设计

APIGateway网关安全设计

Spring Cloud里面有个组件 Zuul网关

 

网关和 过滤器 拦截器很相似

网关可以实现过滤器 拦截器的功能 而且可以实现Nginx的基本功能 反向代理 负载均衡ribbon  

Nginx是软负载 ribbon本底客户端负载均衡

网关的核心基本作用: 路由地址  反向代理  黑名单与白名单系统(HTTP请求头的来源字段) 授权安全

 

DNS过程:先浏览器缓存 然后本底host文件 最后外网DNS解析  最终获取IP地址

 

      访问虚拟的VIP 

      lvs是四层负载均衡  基于IP+端口号  可以管理Nginx集群 

      外网部署LVS  (阿里云有负载均衡器可以买)

       Nginx基本要求: 一主一备

       Nginx走完再走网关

       网关可以拦截所有服务请求: 日志管理 权限控制 限流 安全控制

           

    

 

 

       

 

     既然Nginx可以实现网关,为什么需要Zuul。

      Zuul使用Java开发的 。Nginx是C开发的。Nginx功能比Zuul更强大。Zuul针对微服务的,Nginx针对服务器的。

      Zuul框架是微服务里面的一个组件,网关。

   

 

 注意:  LVS管理Nginx

  

搭建网关:

  1、Nginx也可以实现网关。

         a. 基于域名区分

         b.基于项目名称 

         

       拦击域名进行跳转:

     

    访问:

     

 

   

 

 

          

  2、基于SpringCloud Zuul搭建网关

      Eureka 

      服务A 

      服务B 

   

     网关的核心配置:

   

### 配置网关反向代理    
zuul:routes:api-a:path: /api-a/**serviceId: toov5_a     ##服务名称api-b:path: /api-b/** serviceId: toov5_b     ##服务名称  

所以:

###注册 中心
eureka:client:serviceUrl:defaultZone: http://localhost:8100/eureka/
server:port: 80
###网关名称
spring:application:name: service-zuul
### 配置网关反向代理    
zuul:routes:api-a:path: /api-a/**serviceId: toov5_aapi-b:path: /api-b/**serviceId: toov5_b

 

pom:

<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.0.1.RELEASEversion><relativePath /> parent><properties><project.build.sourceEncoding>UTF-8project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding><java.version>1.8java.version><spring-cloud.version>Finchley.RC1spring-cloud.version>properties><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starterartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-netflix-ribbonartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-netflix-zuulartifactId>dependency><dependency><groupId>org.projectlombokgroupId><artifactId>lombokartifactId><optional>trueoptional>dependency><dependency><groupId>com.alibabagroupId><artifactId>fastjsonartifactId><version>1.2.3version>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-testartifactId><scope>testscope>dependency>dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-dependenciesartifactId><version>${spring-cloud.version}version><type>pomtype><scope>importscope>dependency>dependencies>dependencyManagement><build><plugins><plugin><groupId>org.springframework.bootgroupId><artifactId>spring-boot-maven-pluginartifactId>plugin><plugin><groupId>org.apache.maven.pluginsgroupId><artifactId>maven-compiler-pluginartifactId><configuration><source>1.8source><target>1.8target>configuration>plugin><plugin><groupId>org.apache.maven.pluginsgroupId><artifactId>maven-resources-pluginartifactId><version>3.0.1version><executions><execution><id>copy-confid><phase>packagephase><goals><goal>copy-resourcesgoal>goals><configuration><encoding>UTF-8encoding><outputDirectory>${project.build.directory}/ext/confoutputDirectory><resources><resource><directory>ext/confdirectory><includes><include>logback.xmlinclude>includes><filtering>truefiltering>resource>resources>configuration>execution>executions>plugin><plugin><groupId>org.jacocogroupId><artifactId>jacoco-maven-pluginartifactId><version>0.7.5.201505241946version><executions><execution><id>default-prepare-agentid><goals><goal>prepare-agentgoal>goals>execution><execution><id>default-prepare-agent-integrationid><goals><goal>prepare-agent-integrationgoal>goals>execution>executions>plugin><plugin><groupId>com.spotifygroupId><artifactId>docker-maven-pluginartifactId><version>0.4.3version><configuration><imageName>hy_uav_gatewayimageName><dockerDirectory>src/main/dockerdockerDirectory><resources><resource><targetPath>/targetPath><directory>${project.build.directory}directory><include>${project.build.finalName}.jarinclude><include>ext/conf/logback.xmlinclude>resource>resources>configuration>plugin>plugins>build><repositories><repository><id>spring-milestonesid><name>Spring Milestonesname><url>https://repo.spring.io/milestoneurl><snapshots><enabled>falseenabled>snapshots>repository>repositories>

Filter:

import javax.servlet.http.HttpServletRequest;import org.springframework.util.StringUtils;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;// 验证Tomcat 参数
public class TokenFilter extends ZuulFilter {
public Object run() throws ZuulException {// 拦截参数执行业务逻辑RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();String token = request.getParameter("token");if (StringUtils.isEmpty(token)) {// 直接不能够继续执行下面业务逻辑ctx.setSendZuulResponse(false); // 不继续执行下面业务逻辑ctx.setResponseStatusCode(500);// 不继续执行下面业务逻辑ctx.setResponseBody("token is null");return null;}// 继续正常执行业务逻辑return null;}public boolean shouldFilter() {return true; // 是否开启当前ilter(
    }@Overridepublic int filterOrder() {return 0; // 过滤器优先级 数字越大 越优先执行大
    }@Overridepublic String filterType() {return "pre";// 前置执行
    }}

启动类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;import com.itmayiedu.filter.TokenFilter;@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class AppZuul {// @EnableZuulProxy 开启Zuul网关代理// @EnableEurekaClient 注册到EurekaCpublic static void main(String[] args) {SpringApplication.run(AppZuul.class, args);}// 注册到SpringBoot 容器
    @Beanpublic TokenFilter accessFilter() {return new TokenFilter();}}

 

补充:

  自己实现一套RPC远程调用框架。如何设计?

   核心在服务治理。

  传统服务与服务之间通讯URL地址管理 包括实现负载均衡 熔断机制 服务降级

   服务和服务之间的依赖关系 (注册中心)

 

 

API网关是一个公共基础组件,无状态,可支持多套分布式部署。如下图所示:

 

posted @ 2019-01-26 00:40 toov5 阅读( ...) 评论( ...) 编辑 收藏


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部