博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud 之Zuul服务网关
阅读量:2455 次
发布时间:2019-05-10

本文共 3252 字,大约阅读时间需要 10 分钟。

文章目录

微服务架构

在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统。一个简单的微服务系统如下图:

在这里插入图片描述
在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡Ngnix,再到达服务网关(Zuul集群),然后再到具体的服。,服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件由配置服务中心管理,配置服务的配置文件放在Git仓库,方便开发人员随时改配置。

Zuul简介

Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。

快速入门

创建一个model工程作为服务网关,即service-zuul

导入依赖。

org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul

使用注解@EnableZuulProxy,开启zuul的功能:

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.zuul.EnableZuulProxy;@SpringBootApplication@EnableEurekaClient// 开启zuul的功能@EnableZuulProxypublic class ServiceZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceZuulApplication.class, args); }}

配置文件application.yml:

server:  port: 8084spring:  application:      name: service-zuuleureka:  client:    serviceUrl:      defaultZone: http://localhost:9100/eureka/zuul:  # 定义服务转发规则  routes:    # 这个名字任意取的,建议取有意义的    api-ribbon:      # 配置请求URL的请求规则      path: /api-ribbon/**      # 真正的微服务地址,path匹配的请求都转发到这里      serviceId: eureka-ribbon-client    api-feign:      path: /api-feign/**      serviceId: eureka-feign-client

通过zuul访问服务。

在这里插入图片描述

服务过滤

过滤器是Zuul的重要组件。

过滤器ZuulFilter是一个抽象类,其实现类需要实现4个方法:

  • filterType:返回字符串代表过滤器的类型
    a)pre:请求在被路由之前执行
    b)routing:在路由请求时调用
    c)post:在routing和errror过滤器之后调用
    d)error:处理请求时发生错误调用
  • filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。
  • shouldFilter:返回一个Boolean值,判断该过滤器是否需要执行。返回true执行,返回false不执行。
  • run:过滤器的具体业务逻辑。

执行流程:

执行流程
需求:通过编写过滤器实现用户是否登录的检查。
实现:通过判断请求中是否有token,如果有认为就是已经登录的,如果没有就认为是非法请求,响应401。

过滤器实现:

import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;@Slf4j@Componentpublic class LoginZuulFilter extends ZuulFilter {
@Override public String filterType() {
return "pre"; // 设置过滤器类型为:pre } @Override public int filterOrder() {
return 0;// 设置执行顺序为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); ctx.setResponseBody(" token is empty!!"); return null; } log.info("ok"); return null; }}

不带token访问提示token不能为空:

在这里插入图片描述
带token正常访问:
在这里插入图片描述

默认开启Ribbon

Zuul网关默认开启了 Ribbon 负载均衡,当启动多个服务提供者进行测试,不断刷新浏览器请求,发现多个服务会被轮询访问。

转载地址:http://pgdhb.baihongyu.com/

你可能感兴趣的文章
linux开源游戏_适用于Linux的5个开源策略和模拟游戏
查看>>
Buffer看到透明的员工薪资政策有明显好处
查看>>
raspberry pi_将您的旧Raspberry Pi变成自动备份服务器
查看>>
幕后产品_3月17日#OpenOrgChat:幕后开放组织
查看>>
前5名:Linux计算机故事,超酷的docker工具,2016年有10个项目值得分派
查看>>
sphinx 文档_像埃及人一样的Doc:使用Sphinx管理项目文档
查看>>
git运行 vagrant_前5名:Vagrant,Git,GitHub等
查看>>
docker strace_前5名:适用于初学者,strace,Kubernetes,Docker,专利和DevOps的OpenStack
查看>>
linux发行版 哪个快_前5名:您使用哪个Linux发行版?,用于音乐的Linux等
查看>>
开源社区_开源社区需要导师
查看>>
openstack 云_面向初学者的OpenStack云简介
查看>>
破解专利系统:开源和专利
查看>>
简约主页_简约的调试方法
查看>>
cassandra 单节点_ScyllaDB:Cassandra兼容性,每个节点180万个请求
查看>>
kibana 创建文档_创建世界一流技术文档的7条规则
查看>>
openstack安装指南_7个新的OpenStack指南和技巧
查看>>
开源的定义_年轻的制造商谈论软件定义的广播,开源和指导者
查看>>
Kubernetes如何帮助Docker蓬勃发展
查看>>
童子军原则_女童子军:Cookies还是代码?
查看>>
vs2015软件系统开源_2015年十大开源法律发展
查看>>