API网关服务:Spring Cloud Zuul_蹊源的奇思妙想的博客-程序员秘密

技术标签: # spring  Zuul  # 分布式  # 计算机和网络  

API网关服务:Spring Cloud Zuul

在这里插入图片描述

门面(facade)模式
门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。
门面模式提供一个高层次的接口,使得子系统更易于使用。

API Gateway的优势
1.给每个客户端一个特定的API,减少了客户端与服务端的连接,简化了客户端代码。
2.可以实现web协议和非web协议之间的转换

Zuul的优势
1.它作为系统的统一入口,屏蔽了系统内部各个微服务的细节。
2.与服务治理框架结合,实现服务实例维护以及负载均衡的路由转发。
3.实现接口权限校验与微服务业务逻辑的解耦。(如SpringSecurity只要在Zuul中使用)
4.通过服务网关过滤器,在各个生命周期中去校验请求的内容,保证了微服务的无状态性,让服务本身更关注业务逻辑处理。(如身份验证、自定义路由状态等)

Zuul请求过滤
Zuul可以通过定义过滤器来实现对请求的拦截与过滤。
通过继承ZuulFilter抽象类并实现它定义的4个抽象函数:
1.filterType():过滤器的类型,它决定过滤器在请求的那个生命周期执行。 pre、routing、post、error(绝大数是pre)
2.filterOrder():过滤器的执行顺序,它决定这个过滤器执行的优先级。 数值越小优先级越高
3.shouldFilter():判断该过滤器是否需要被执行,可以指定过滤器的有效范围。
4.run():过滤器的具体逻辑。

/**
* Zuul过滤器 实现对请求进行编码格式过滤
*/
public class CharacterEncodingFilter extends ZuulFilter {
    private static Logger logger= LoggerFactory.getLogger(CharacterEncodingFilter.class);
    @Override public String filterType() {
        return "pre";
    }
    @Override public int filterOrder() {
        return 0;
    }
    @Override public boolean shouldFilter() {
        return true;
    }
    @Override public Object run() {
        RequestContext ctx=RequestContext.getCurrentContext();
        HttpServletRequest request=ctx.getRequest();


        try {
            request.setCharacterEncoding("UTF-8");
        }catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

Zuul路由
路由:即实现请求转发、合成和协议转换。
zuul本身带有hystirx和ribbon模块的依赖,所以Zuul天生拥有线程隔离和熔断器的自我保护功能,以及对服务调用的客户端负载均衡能力。

单实例配置

zuul.routes.user-url.path=/user/**   #url存在这个 路由到指定客户端    
zuul.routes..user-url.url=http://localhost:8000

多实例配置

zuul.routes.user-url.path=/user/**   #url存在这个 路由到指定客户端    
zuul.routes..user-url.serviceId=springcloud-eureka-client-user
ribbon.eureka.enable=false
springcloud-eureka-client-user.ribbon.listOfServers=http://localhost:8000,http://localhost:8001

服务路由配置

  • 可以保证API网关的健壮性和稳定
  • 实现Ribbon的客户端负载均衡功能
    zuul.routes.user-url.path=/user/**   #url存在这个 路由到指定客户端    
    zuul.routes..user-url.service-id=springcloud-eureka-client-user

动态路由
API网关服务是外部访问统一的入口,任何关闭和重启该组件都会导致对外服务停止,所以它必须具备动态更新内部逻辑的能力
比如动态修改路由规则和添加或者删除过滤器。
方式:
通过SpringCloudConfig连接的Git仓库存储和管理,从而实现动态刷新路由规则的功能。

在这里插入图片描述

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

智能推荐

CSE的REST接口存在重载的时候报错: OperationId must be unique_looook的博客-程序员秘密

Exception in thread "main" java.lang.IllegalStateException: ServiceComb init failed.at org.apache.servicecomb.core.SCBEngine.init(SCBEngine.java:220)at org.apache.servicecomb.core.CseApplicationLi...

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: #42000_mysqlsyntaxerrorexception:#42000_init2022的博客-程序员秘密

SELECT re.id, if(re.is_confirmed <> 2,0,2) as re.is_confirmed, re.receive,select语句中的as的字段名还是原字段名,导致出现以下异常;换一个字段名就可以了:if(re.is_confirmed <> 2,0,2) as is_confirmed### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQL

不知道Android 中Gradle 的这些技巧,活该你加班_gradle artifacts.add_teamoforever的博客-程序员秘密

现在基本上都使用Android Studio 来开发,使用Gradle 构建项目,Gradle 的种种优点,多渠道打包方便,依赖类库统一管理,基于Groovy 的DSL 语言简洁方便。这些好处在我们开发省了我们不少事,但是唯一的问题就是编译构建运行的时候特别慢,甚至是致命的,最后发现加班的时间都浪费在编译构建上(说多了都是泪)。下面有几个技巧,让你你的Android Gradle 运行,编译更加快速。

Python练习题答案: 整数组合的总和【难度:2级】--景越Python编程实例训练营,1000道上机题等你来挑战_编程某些整数的总和_景越的博客-程序员秘密

整数组合的总和【难度:2级】:答案1:from itertools import combinations_with_replacementdef find(arr,n): return sum( sum(c) == n for x in range(1,len(arr)+1) for c in combinations_with_replacement(arr, x) )​答...

mybatis(6)——mybatis-config.xml文件configuration标签内的标签顺序_mybatis-config标签顺序_木子 旭的博客-程序员秘密

mybatis-config.xml文件中的configuration标签里面的子标签必须遵循以下顺序排序,否则会报错1.properties2.settings3.typeAliases4.typeHandlers5.objectFactory6.objectWrapperFactory7.reflectorFactory8.plugins9.environments10.databaseldProvider11.mappers...

教你win8系统中安装.net framework 3.5最详细图文步骤_qq_42873717的博客-程序员秘密

我们在win8系统电脑的使用总,有小伙伴在安装.net framework 3.5的时候出现了错误,不知道怎么安装,而我却针对不同的系统我们有不同的版本,有小伙伴想要在win8系统中安装.net framework 3.5却不知道方法,今天小编就来给大家分享一下教你win8系统中安装.net framework 3.5最详细图文步骤。 本文转自:http://www.xtzjw7.com/new...

随便推点

GetVersion和GetVersionEx_getversion 欺骗_slmmlk2011_2的博客-程序员秘密

Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx。      GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返回值中用低位的那个字表示MS-DOS的版本号,高位的那个字表示Windows版本号。对于每个字来说,高位字节代表主要版本号,低位字节代表次要版本号。可是因为编写此函数的程序员犯了一个错误,使得此函数返

连接SQLyog时,出现错误1862:your password has expired_weixin_30872733的博客-程序员秘密

参考博客:http://www.mamicode.com/info-detail-2280376.html解决方法:    1.打开cmd(用管理员身份)    2.cd 到mysql安装bin目录,如:D:\develop\mysql-5.7.26-winx64\bin    3.连接mysql,输入命令:mysql -u root -p 回车后,输入密码    4.输入...

【公告】第二届仲裁委员选举,向第一届仲裁委员会委员表示真挚的感谢。_u010679892的博客-程序员秘密

效仿民主制度的三权分立的感觉:网站管理员方制订投票规则;大家民主投票,仲裁委员会监督投票,互相制衡,最大限度的保证评分制度的合理。每届仲裁委员会9位成员组成,由管理员推荐,大家也可以推荐或者自荐,每3个月选举一次,可以连任。现在三个月仲裁委员的任期已满,开始第二届仲裁委员会选举,考虑到第一届委员仲裁帖子比较辛苦,这次暂时不考虑连任,全部重新改选。[color=red][si...

python(二)安装pip及第三方库requests_花木深的博客-程序员秘密

1.首先在官网下载requests包http://www.python-requests.org/en/latest/user/install/#install下载的tar.gz包里面目录内容解压至Python36-32文件夹(图是后截的)2.下载piphttps://pypi.python.org/pypi/pip#downloads 同样下载下面的tar.gz包 解压至cmd根目录,以我为例,...

java spring 配置log_spring-logger spring中日志配置_Eva-ModUMP45的博客-程序员秘密

默认日志 Logback:默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。从上图可以看到,日志输出内容元素具体如下:时间日期:精确到毫秒日志级别:ERROR, WARN, INFO, DEBUG or TRACE进程ID分隔符:— 标识实际日志的开始线程名:方括号括起来(可能会截断控制...

【184天】黑马程序员27天视频学习笔记【Day14-中】_weixin_33885676的博客-程序员秘密

叨逼叨两句情绪上的紧张,让人真的很累。14-(6-10):正则表达式给定字符串数字排序package com.test.regex;import java.util.Arrays;public class Demo06 { public static void main(String[] args) { ...

推荐文章

热门文章

相关标签