Spring Cloud Zuul的Api网关实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/it_lihongmin/article/details/90673501

目录

1、在start.spring.io中添加Web、Actuator、Zuul模块

2、application.properties配置

3、自定义Filter

4、在启动类中添加@EnableZuulProxy启动服务,并且注册自定义Filter位Bean

5、启动服务,查看路由规则

6、自定义日志filter


    项目地址为:https://github.com/kevin-lihongmin/spring-cloud-project-kevin/tree/master/zuul-demo

    在Spring Cloud Zuul官网上的一句话简介: Zuul is a JVM-based router and server-side load balancer from Netflix.Zuul是一个基于内存的路由器,是服务端的负载均衡器。主要功能包括:

    Authentication:安全验证,基于filter实现

    Stress Testing:压力测试

扫描二维码关注公众号,回复: 6754522 查看本文章

    Dynamic Routing: 动态路由

    Static Response handling: 静态资源处理,类似Nginx

 

1、在start.spring.io中添加Web、Actuator、Zuul模块

2、application.properties配置

    为了理解方便把部分应该放到bootstrap.properties中的配置也放到了该配置中。需要注意:

zuul.routes.user-consumer中的user-consumer为注册到Eureka Server中的服务名称

# 服务注册名称
spring.application.name=zuul-gateway
# 服务端口
server.port=8800
# 注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,\
  http://localhost:8760/eureka/,http://localhost:8759/eureka/
# 将IP注册到Eureka Server上,如果不配置就是机器的主机名
eureka.instance.prefer-ip-address=true
# 默认路由规则是使用Eureka注册的服务名称  http://ZUULHOST:ZUULPORT/serviceId/**
# 配置路由规则
zuul.routes.ribbon-user-consumer-eureka = /kevin-user/**
# 忽略的服务
zuul.ignored-services=ribbon-provider

3、自定义Filter

    在上面说到Zuul可以作为(Authentication:安全验证,基于filter实现)的实现,所以就自己写一个Filter继承自 ZuulFilter ,以实现服务请求的时候打印日志,当然也可以在这里做服务的安全验证等。需要实现多个Filter的时候,可以按照实现的filterOrder()方法返回的值进行排序这些后面再去深入研究。

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

import javax.servlet.http.HttpServletRequest;

public class PreRequestLogFilter extends ZuulFilter {

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

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

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

    @Override
    public Object run() {
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        System.out.print(String.format("send %s request to %s", request.getMethod(),
 request.getRequestURL()));
        return null;
    }
}

4、在启动类中添加@EnableZuulProxy启动服务,并且注册自定义Filter位Bean

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

/**
 *  路由Api gateway
 *  默认路由规则为: http://ZUUL-HOST:ZUUL-PORT/serviceId/**
 *
 * @author kevin
 * @date 2019/5/30 9:15
 * @since 1.0
 */
@SpringBootApplication
@EnableZuulProxy
public class ZuulDemoApplication {

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

    @Bean
    public PreRequestLogFilter preRequestLogFilter(){
        return new PreRequestLogFilter();
    }
}

5、启动服务,查看路由规则

    由于zuul只是做代理服务,所以需要将请求进行mapping到一个具体的注册到Eureka Server的注册中心的服务,选择了之前搭建过的ribbon-demo项目:地址为 Spring Cloud-Ribbon负载均衡实现中启动ribbon-provider ribbon-consumer-eureka两个服务。 

    需要注册:当在start.spring.io中添加zuul的时候,依赖添加了ribbon相关的包,并且zuul代理的服务需要引入ribbon,否则就会报错。刚开始搭建的时候就遇到了问题。

    1)、服务启动之后,ribbon-consumer-rureka的服务访问地址为: http://localhost:8769/getRemoteUser/1

    2)、添加zuul.routes.ribbon-user-consumer = /kevin-user/**配置后,访问地址为:

http://localhost:8800/kevin-user/getRemoteUser/1

    3)、去掉zuul.routes.ribbon-user-consumer = /kevin-user/**配置后,默认路由规则是使用Eureka注册的服务名称 http://ZUULHOST:ZUULPORT/serviceId/**,如我们要访问ribbon-user-consumer-eureka服务,访问地址为:

http://localhost:8800/ribbon-user-consumer-eureka/getRemoteUser/1

6、自定义日志filter

当请求访问服务的时候,打印日志如下:

send GET request to http://localhost:8800/ribbon-user-consumer-eureka/getRemoteUser/1

猜你喜欢

转载自blog.csdn.net/it_lihongmin/article/details/90673501