zuul学习总结

zuul简介

路由在微服务架构的一个组成部分。 例如,/可以映射到您的Web应用程序,/ api / users映射到用户服务,并且/ api / shop映射到商店服务。 Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。

zuul功能:

验证、见解、压力测试、金丝雀测试、动态路由、服务迁移、减载、安全、静态响应处理、主动/主动流量管理

zuul路由的配置
1、默认配置

zuul在启动的时候,可以设置默认的路由规则。在默认的情况下,zuul会获取注册到Eureka Server中的服务,并且配置下面的的路由规则

http://GATEWAY:GATEWAY_PORT/serviceId/** 将会访问到 http://serviceId/**

其中GATEWAY为zuul的服务部署的地址,GATEWAY_PORT为zuul服务启动的端口,serviceId为注册到Eureka Server的服务, 该值为配置在服务配置文件的spring.application.name中。service_port为服务启动的端口。

2、指定路由规则

zuul:
  routes:
    users:
      path: /myusers/**
        url: http://example.com/users_service

其中users是一个标志,可以标志为指向某个系统。path表示访问的地址规则,url为访问的实际地址。访问 http://GATEWAY:GATEWAY_PORT/myusers/** 将会被路由到 http://example.com/users_service/** 上面去

3、指定serviceId路由规则
zuul:
  routes:
    user: # 可以随便写,在zuul上面唯一即可;当这里的值 = service-id时,service-id可以不写。
      path: /user/** # 想要映射到的路径
        service-id: microservice-provider-user # Eureka中的serviceId

microservice-provider-user是Eureka Server注册中心上面的服务id,访问地址:http://GATEWAY:GATEWAY_PORT/user/**将会被路由到 http://microservice-provider-user/**上面

4、忽略服务配置
zuul:
  ignored-services: microservice-provider-user # 需要忽视的服务(配置后将不会被路由)
zuul:
  ignored-services: * # 表示忽略所有的服务
5、从数据库获取动态获取配置
可以参考博客:http://blog.csdn.net/u013815546/article/details/68944039
里面已经有详细介绍了如何开发从数据库读取配置。
存在一个问题,如果我有多个实例,那我如何进行配置,保重实例直接的负载均衡。
6、使用Spring Cloud Config(分布式配置中心)进行动态配置路由
首先需要创建一个config-server的模块,用于分布式配置的修改都从这里获得。
需要加入的依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
          <groupId>org.eclipse.jgit</groupId>
           <artifactId>org.eclipse.jgit</artifactId>
           <version>4.7.0.201704051617-r</version>
        </dependency>

在application.yml配置文件中,进行如下的配置:

server:
  port:  7001
spring:
  application:
    name:  config-server
  cloud:
    config:
      server:
        git:
          uri:  https://github.com/lichencai/springcloud-config #指定git的地址
          searchPaths:  config-repo  #在该respository上面建立该目录
          username:  793385991@qq.com
          password:  ####替换成这个用户的密码

启动spring cloud config:

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

在需要从spring cloud config上面获取配置文件的模块中,如client上面,需要在配置文件bootstrap.properties上面进行如下配置(好像只能写在该配置文件上面,目前还不知道原因):

server.port=9001
# 这里必须和git的上面的文件名即application-dev相同
spring.application.name=didispace
# 获取哪个环境的配置
spring.cloud.config.profile=dev
# 从哪个分支上面获取配置
spring.cloud.config.label=master
# 配置中心的地址
spring.cloud.config.uri=http://localhost:7001/

如何做到修改配置文件,让客户端client也能够感知到呢?
首先,需要在client项目中加入下面依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

可以使用端点/refresh进行刷新,如:http://localhost:9001/refresh 发送post请求即可进行刷新。在每次修改配置文件的时候,都有访问下客户端的/refresh。
代码在:https://github.com/lichencai/springcloud-demo 的feature-001分支上面。

zuul过滤器
过滤器类型和请求生命周期:

Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。
PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
ERROR:在其他阶段发生错误时执行该过滤器。
除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。
这里写图片描述

过滤类:
package com.clsaa.learn.zuul;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class PreZuulFilter extends ZuulFilter{
    private final static Logger LOGGER = LoggerFactory.getLogger(PreZuulFilter.class);

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

    @Override
    public int filterOrder() {
        return 1;//数字越大越靠后
    }

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

    @Override
    public Object run() {
        HttpServletRequest servletRequest = RequestContext.getCurrentContext().getRequest();
        String host = servletRequest.getRemoteHost();
        PreZuulFilter.LOGGER.info("request host : " + host);
        return null;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值