用Spring Boot & Cloud,Angular2快速搭建微服务web应用 - 增加代理服务器

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cuiwader/article/details/52635709

上一章提到在HTTP Response中添加头的问题,如果在微服务里面添加,比如UserService项目,则每个项目都需要做重复的工作。每次遇到这样的情况,那肯定会有更好的解决方案。在前端的反向带来服务统一添加,就是一个更好的方案。这样每个微服务只需要解决自己关心的领域问题。基本思路就是在反向代理上面添加一个过滤器,对每个HTTP响应都增加一个头。

Zuul

Spring的代理服务使用了Netflix的Zuul。按照Zuul官方的介绍,https://github.com/Netflix/zuul,是一个Edge Service。Edge Service是边界服务,提供了接入的功能,包括动态路由,过滤,监控等。

Spring Cloud提供了Zuul的集成,只需要在http://start.spring.io/中添加对zuul的依赖,就可以通过简单的配置使用zuul了。Spring提供的官方文档如下:

http://cloud.spring.io/spring-cloud-netflix/

https://spring.io/guides/gs/routing-and-filtering/

实现

新建一个叫做gateway的项目,添加的依赖是zuul。然后SPRING INITIALIZR自动生成maven项目。

GatewayApplication.java:
package com.healtrav;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication {

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

    @Bean
    public PostFilter postFilter() {
        return new PostFilter();
    }
}

除了自动生成的代码以外,增加了一个PostFilter。注意要使用Zuul服务,只需要在Spring Application增加一个注解:@EnableZuulProxy。

PostFilter.java:
package com.healtrav;

import javax.servlet.http.HttpServletResponse;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

public class PostFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "post";
    }

    @Override
    public int filterOrder() {
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletResponse response = ctx.getResponse();
        response.addHeader("Access-Control-Allow-Origin", "*");

        return null;
    }<a target=_blank href="http://blog.csdn.net/cuiwader/article/details/52806589">用Spring Boot & Cloud,Angular2快速搭建微服务web应用 - 增加权限控制</a>
}

在Spring Cloud Zuul里面添加一个ZuulFilter非常简单,只需要从ZuulFilter继承,并且重写四个方法。第一个filterType指明了过滤的类型,包括pre,routing,post,error,即对应HTTP请求在路由前,中,后和错误时候的过滤。现在我们需要添加的是路由后的过滤,所以返回post字符串即可。filterOrder给出了过滤执行的顺序。shouldFilter用来设置是否执行该过滤的条件。一般是像在run里面一样,拿到RequestContext,然后用它来判断某些条件是否满足,返回true或者false。现在我们需要过滤所有Response,所以返回true。run就是过滤的逻辑了。这里是拿到RequestContext中的HttpServletResponse,然后给它添加一个HTTP头,添加Access-Control-Allow-Origin,后面的*表示允许所以域的请求。请注意这样的设置是不安全的,正确的做法应该是在这里设置一个域名,或者IP地址。写好PostFilter之后,只需要添加一个带@Bean注解的实例化方法,Spring Cloud Zuul会自动查找从ZuulFilter继承的Bean。完整的代码请参考这个tag:https://github.com/cuiwader/healtrav/releases/tag/simple-gateway-no-auth,注意不要使用master HEAD的代码,而是用链接里面这个tag的代码。

验证

在chrome中再次打开链接http://localhost:3000,会发现现在所有的用户都可以正常显示了。
上一章:用Spring Boot & Cloud,Angular2快速搭建微服务web应用 - AngularJS2客户端

下一章:用Spring Boot & Cloud,Angular2快速搭建微服务web应用 - 增加权限控制

展开阅读全文

没有更多推荐了,返回首页