Spring Cloud之API 网关Zuul

一、为什么需要网关?
安全性:
1.最主要的一点是网关可以将所有服务的API接口统一聚合,并统一对外暴露。外界系统调用API接口时,都是由网关对外暴露的API接口,外界系统不需要知道微服务系统中各个服务之间相互调用的复杂性。微服务系统也保护了七内部微服务单元的API接口,防止其被外部直接调用,导致服务的敏感信息泄露。
2.网关可以做用户身份认证和权限认证,防止非法请求操作API接口,对服务器起到保护作用。
性能:
1.zuul、ribbon、eureka相结合,可以实现路由和负载均衡的功能,zuul可以将请求流量按照默认轮询策略分发到集群状态下的不同服务实例。
作用:
1.可以实现负载均衡、路由转发、实时日志输出、权限控制、系统监控等
2.可以实现流量监控,在高流量的情况下,对服务进行降级

二、网关框架分类
1.Netflix Zuul,zuul是spring cloud的一个推荐组件,https://github.com/Netflix/zuul
    --本博客讲解Zuul
2.Kong kong是基于Nginx+Lua进行二次开发的方案, https://konghq.com/
3.orange,这个开源程序是国人开发的, http://orange.sumory.com/

三、怎么使用网关(Zuul)==>实战?
1.jar包依赖
<groupId>com.suning.drp</groupId>
    <artifactId>drp-gateway</artifactId>
    <version>0.0.1</version>
    <packaging>war</packaging>

    <parent>
        <artifactId>drp-parent</artifactId>
        <groupId>com.suning.drp</groupId>
        <version>0.0.1</version>
           <relativePath>../drp-parent/pom.xml</relativePath>
    </parent>
    
    <dependencies>
        <!-- spring boot 1.X版本所依赖的zuul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <!-- spring boot 2.X版本所依赖的zuul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!-- SpringBoot整合eureka客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

2.配置文件
    ### eureka注册服务中心
    server.port=80
    eureka.client.serviceUrl.defaultZone=${eurekaServiceDefaultZone}
        ### eurekaServiceDefaultZone取值不同环境下的值,例子取的生产中的值,vars.prd.properties
        eurekaServiceDefaultZone=http://10.235.5.28:8080/eureka,http://10.235.5.29:8080/eureka,http://10.235.5.30:8080/eureka
    
    ### 网关名称
    spring.application.name=tigbs-gateway
    ### 反向代理,将服务的IP隐藏,通过项目名访问
    ### 以/cms/访问的请求地址转发到管理端
    zuul.routes.cms.path=/cms/**
    zuul.routes.cms.serviceId=drp-cms
    ### 以/portal/访问的请求地址转发到管理端
    zuul.routes.portal.path=/portal/**
    zuul.routes.portal.serviceId=drp-portal
3.启动类
// EnableZuulProxy开启zuul功能
@EnableZuulProxy 
// EnableEurekaClient将网关服务当做客户端注册到eureka服务中心
@EnableEurekaClient
@SpringBootApplication
public class GateWayServiceApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(GateWayServiceApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(GateWayServiceApplication.class);
    }
}
4.业务代码--验证用户在客户端是否有登陆
@Component
public class TokenFilter extends ZuulFilter {
    //具体过滤的逻辑
    public Object run() throws ZuulException {
        // 获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        String userToken = request.getParameter("userToken");
        if (StringUtils.isEmpty(userToken)) {
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseStatusCode(401);
            currentContext.setResponseBody("userToken is empty");
            return null;
        }
        // 否则正常执行业务逻辑.....
        return null;
    }

    // 判断过滤器是否生效,为true,说明需要过滤,则执行run()
    public boolean shouldFilter() {
        return true;
    }

    // 过滤器的执行顺序。当请求在一个阶段的时候存在多个多个过滤器时,需要根据该方法的返回值依次执行
    // 优先级为0,数字越小,越早执行该过滤器
    public int filterOrder() {
        return 0;
    }

    // 过滤器类型:pre,post,routing,error四种。 pre表示在请求之前进行拦截
    public String filterType() {
        return "pre";
    }

}

转载于:https://my.oschina.net/xiaomiaonevergiveup/blog/3075473

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值