第六节 服务端负载均衡 zuul

定于客户端的负载均衡后,那么定义服务端的负载均衡的目的和意义

  • 本质上zuul 是一个基于jvm的路由器和服务端的负载均衡器。我们可以将zuul server理解为一个 代理服务器承担内部网络的网关。zuul默认和Ribbon结合实现了负载均衡的功能

本质上zuul充当的负载均衡器和路由是一致的,比如请求url: /api/restaurant_server/get 和 /api//user_ser/get 两者通过zuul可以分别映射到restaurant server和user server上 zuul 除了上述两大功能外海具有:

    Authentication
    Insights
    Stress Testing
    Canary Testing
    Dynamic Routing
    Service Migration
    Load Shedding
    Security
    Static Response handling
    Active/Active traffic management
  1. 简单使用

pom 文件添加

 <!--其他省略-->
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
  1. 在启动工程类加上注解@EnableZuulProxy,开启zuul的功能
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run( ZuulApplication .class, args );
    }
}
  1. 配置文件application.yml需要添加zuul 服务以及需要的路由规则,简单参考如下:
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769
spring:
  application:
    name:  zuul-server  # Service registers under this name
zuul:
    ignoredServices: "*"
    routes:
        restaurantapi:
            path: /api/**
            serviceId: api-service
            stripPrefix: true

指定服务注册中心的地址为http://localhost:8761/eureka/,服务的端口为8769,服务名为service-zuul;以/api/ 开头的请求都转发给api-service服务

  1. 使用,通过u形如 /api/xx即可
  2. 基于zuul的过滤功能,做一些安全验证(通过继承ZuulFilter 我们可以像在servlet Filter一样做一些业务上的处理)
@Component
public class MyFilter extends ZuulFilter {

    private static Logger log = LoggerFactory.getLogger(MyFilter.class);
    @Override
    public String filterType() {
        return "pre";
    //pre:路由之前
    //routing:路由之时
    //post: 路由之后
    //error:发送错误调用
    //filterOrder:过滤的顺序
    //shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
    //run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
    }

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

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

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}

            return null;
        }
        log.info("ok");
        return null;
    }
}
  • 接下来如果我们访问参数中没有带token 就会返回相应的错误

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CodingBlock

Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身

本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html 在Android...

2896
来自专栏一个会写诗的程序员的博客

Spring Boot : 使用 Zuul 实现 API Gateway 的路由和过滤 ( Routing and Filtering )应用场景配置管理稳定性完整示例

Spring Boot : 使用 Zuul 实现 API Gateway 的路由和过滤 ( Routing and Filtering )

2902
来自专栏IT笔记

Spring Cloud实战微服务精华视频教程

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线...

61011
来自专栏云原生架构实践

Jhipster技术栈定制 - 基于UAA的微服务之间安全调用

3个微服务都是通过Jhipster生成。 工程代码生成完之后,根据上一节启动的组件的实际情况,修改微服务配置文件中Eureka和database相关的配置。

9653
来自专栏A周立SpringCloud

Spring Cloud各组件超时总结

Ribbon的超时 全局设置: ribbon: ReadTimeout: 60000 ConnectTimeout: 60000 局部设置: servi...

3906
来自专栏Ryan Miao

gradle中使用嵌入式(embedded) tomcat, debug 启动

在gradle项目中使用embedded tomcat。 最开始部署项目需要手动将web项目打成war包,然后手动上传到tomcat的webapp下,然后启动t...

4769
来自专栏Objective-C

iOS-将自己的库支持CocoaPods

7914
来自专栏Java Web

使用RESTful风格开发Java Web

1303
来自专栏后端云

部署实时OpenStack实例

最近的OpenStack nova版本增加了对实时实例的支持,即提供实时应用所需的确定性和性能保证的实例。这项工作在OpenStack Ocata发行版中最终标...

3043
来自专栏技术翻译

使用Spring Cloud Netflix的Kotlin微服务:第2部分

在本系列的第1部分中,我们使用Kotlin介绍了Spring Cloud。我们讨论了Config Server,Discovery Server(Eureka)...

2212

扫码关注云+社区

领取腾讯云代金券