热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

influxdbjava_干掉zuul:这就是代码写的最好的Java网关

封面:湖南湘西我们还是先来看看新增功能,然后再讲故事。完全的插件化架构设计,插件热插拔。完整支持dubbo所有版本,alib

99bc723928eb94ca0aa25a1762e92cff.png

   封面:湖南湘西

我们还是先来看看新增功能,然后再讲故事。

  • 完全的插件化架构设计,插件热插拔。
  • 完整支持dubbo所有版本,alibaba-dubbo ,apache-dubbo。
  • 支持dubbo泛化调用,多参数,复杂参数接口。
  • 增强monitor插件,移除influxdb支持,新增内存,CPU,QPS,TPS,响应迟延等metrics,支持接入Prometheus。
  • springCloud插件支持eureka与nacos二种注册中心。
  • waf插件增强,支持黑白名单,以及混合模式。
  • 抽离Hystrix熔断功能,独立成插件支持。
  • 修护Zookeeper数据同步方式bug,新增nacos同步数据方式。
  • 多种soul-client支持,提供传统spring,以及springboot等方式接入。
  • 优化 soul-admin后台控制界面。
  • 负载均衡算法bug修护。
  • 修护大文件上传时候的bug。
  • .......太多了不一一列举了。

体验新架构,10分钟搞定一个高可用高性能网关

启动 soul-admin
  • 下载soul-admin.jar包,并启动.

> wget  https://yu199195.github.io/jar/soul-admin.jar
> java -jar soul-admin.jar --spring.datasource.url="jdbc:mysql://你的url:3306/soul?useUnicode=true&characterEncoding=utf-8&useSSL=false"  
  --spring.datasource.username='you username'  --spring.datasource.password='you password'

  • 访问 http://localhost:9095/index.html 默认的用户名:admin  密码:123456。
搭建属于你的网关
  • 首先你新建一个空的springboot项目,可以参考 soul-bootstrap. 也可以在spring官网:[https://spring.io/quickstart]

  • 引入如下jar包:

  
        org.springframework.bootgroupId>
        spring-boot-starter-webfluxartifactId>
        2.2.2-RELEASEversion>
  dependency>

  
        org.springframework.bootgroupId>
        spring-boot-starter-actuatorartifactId>
        2.2.2-RELEASEversion>
  dependency>

  
  
        org.dromaragroupId>
        soul-spring-boot-starter-gatewayartifactId>
        2.2.0version>
  dependency>

   
   
        org.dromaragroupId>
        soul-spring-boot-starter-sync-data-websocketartifactId>
        2.2.0version>
   dependency>

  • 在你的 application.yaml 文件中加上如下配置:

spring:
   main:
     allow-bean-definition-overriding: true

management:
  health:
    defaults:
      enabled: false
soul :
    sync:
        websocket :
             urls: ws://localhost:9095/websocket  //设置成你的soul-admin地址

  • 这样网关的环境就已经搭建完成。

体验新架构下的插件热插拔

  • 问:我想使用熔断功能,应该如何做呢?
  • 答:你可以在pom.xml文件 引入以下依赖,更多的还请看:https://dromara.org/zh-cn/docs/soul/soul.html

  
  
      org.dromaragroupId>
      soul-spring-boot-starter-plugin-hystrixartifactId>
      2.2.0version>
  dependency>
  

  • 问:我怎么接入dubbo服务呢?
  • 答:1)如果你使用的是alibaba-dubbo,那么你应该引入如下:

   
    org.dromarasoul-spring-boot-starter-plugin-alibaba-dubbo2.2.0
   

2) 如果你使用apache-dubbo,那么你应该引入如下:

   
    org.dromarasoul-spring-boot-starter-plugin-apache-dubbo2.2.0
   

  1. 更多的使用请你参考:https://dromara.org/zh-cn/docs/soul/user-dubbo.html
  • 问:如果我想使用限流功能呢?
  • 答:你可以引入以下依赖,具体的参考:https://dromara.org/zh-cn/docs/soul/plugin-rateLimiter.html

  
  
      org.dromaragroupId>
      soul-spring-boot-starter-plugin-ratelimiterartifactId>
      2.2.0version>
  dependency>
  

  • 总而言之,你想要使用什么插件,你就新增该插件的依赖。就这?是热插拔么。。

  • 问:那有些插件我不想用了怎么办?

  • 答:在soul-admin后台禁用该插件即可,想用就开启。

Soul网关的特性

  • 我觉得最大的特色是在流量筛选和管控方面。无论多复杂的请求,可以根据各种条件,规则,匹配方式,来进行流量过滤,筛选,处理。这个过程完全是可视化,自定义,即时生效的,程序无需任何更改。

  • 每个配置都在soul-admin 控制台配置,会同步到每个Soul网关节点的JVM内存,这也是Soul集群高性能的关键之一,在soul网关内部,使用了http长轮询,websocket,zookeeper等方式,独立实现了分布式配置中心的功能。

  • Soul网关使用Reactor编程方式来实现,独立了线程调度,低消耗,经过网关的流量,我们在开启10个插件都处理的情况下,延迟是1~2ms。

  • 插件机制,默认提供了限流,熔断,黑白名单,认证等等插件。

  • 支持A/B test,蓝绿发布(因为掌控了所有流量这个很容易做)。

Soul网关有哪些使用场景,又有哪些值得你关注或者学习的?

首先我觉得还是实用主义,需要用到,才会去了解。那么在什么场景下,你需要用到呢?

后台管理web

  • 首先随便微服务的流行,我们的后台都划分成很多的微服务,我相信你们每个公司都有一个后台管理系统吧,如果我没猜错的话,他们大体上是如下架构。ada30065c681f6d64b89545e539a1d36.png

  • 它会有什么问题呢?大家思考一下。

    • 每个微服务项目的开发人员都在这上面进行开发,会越来越笨重。
    • 如何发版的问题?你要发布商品模块的接口,会造成所有其他的模块使用不了。
    • 假如某一个模块接口的请求量很大(需要部署多个),另一个模块而不需要,你又怎么做?
  • 有人又会说,那我把他们拆处理,拆成一个一个web不就行了么?但是这样又会带来一个新的问题,负载均衡在哪里做?统一的认证在哪里做?

  • Soul网关就很好了解决了以上所有问题,只需要把你的微服务注册到Soul网关。你想怎么玩都可以,不重样的.. 比如 order模块有2个应用,你要发布新的版本,你可以在网关里面,把流量先打到其中一个,另一个进行更新,更新完了以后,再把流量放过去。改变了以前运维掌控一切的观念,java程序员,也可以玩的更好,运维都省了,向老板申请加薪指日可待。

  • 需要统一鉴权?你只需要在网关新增一个适合自己业务的鉴权插件就OK。

公司入口网关(开放平台)

  • 如果一个公司要做开放平台或者入口网关,鉴权,限流,监控,熔断肯定少不了。

  • 如果贵公司是dubbo体系,开发人员写了dubbo服务后,还要傻乎乎的新增一个web项目,来提供接口给别人调用吗?

  • 如果一个接口被攻击,你怎么处理呢?如果被大流量攻击,你怎么处理呢?

  • 不巧,soul 在设计之初就是来干这种事情的,我们来看一下整体的架构图:38cc0473b1b7e26f9fcd05bba45116df.png

  • Soul网关是使用响应式编程实现的,响应式编程绝对是未来 java邻域的重要方向,看风向标Spring体系就好了。我在14年的时候,天天写for循环操作集合,溜的一笔。领导对我说,要使用lambda表达式,这是未来的重点,今天来看,如果你是java程序员,你不会lambda函数式编程,你好意思么。

从发布2.2.0,谈谈近几年的开源体会

我是17年左右的时候,开始写开源项目的,最开始我和王亮一起讨论设计了LCN分布式事务,后面自己又陆续写了Hmily,Raincat,Myth等分布式事务中间件,再后来写了Soul网关,这一路走来,遇到很多很有意思的事,也遭受很多小白用户的摧残。总的感觉,一个好的开源项目,高扩展,可插拔的设计实在太重要了。

  • 案例一 : Soul网关刚开始数据同步只支持Zookeeper方式,有些用户反馈,我们没有zk,那怎么办?

  • 案例二 :Soul网关是支持Dubbo的,但是有些用户是alibaba-dubbo,有些用户apache-dubbo,你又怎么说?

  • 案例三 :soul刚开始提供的客户端都是基于Springboot的,有些用户是传统的Spring,你又怎么说?

所以插件化设计,SPI可插拔设计势在必行。

SPI VS 可插拔

诚然SPI扩展方式,是可插拔的基石,但是他们又不完全等同。举个列子:假如我们先存储一条数据,你定好了SPI接口,也有Mysql,mongodb,elasticseach,zookeeper等等多种方式实现,现在你要考虑的是把它组合在一起项目里面,还是放在不同的项目,按需打包和加载呢?这些都是要考虑的,所以不能一股脑的SPI方式。

checkStyle
  • 严格的代码规范,是对源码学习中,框架使用者的尊重,更是一种开源的态度。
  • 严格的代码规范,让人看起来舒服,也更容易让人理解整个代码。
  • 也希望各位小伙伴提交PR的时候,至少本地要Install成功,之前有些PR,为了不打击他们的积极性,合并之后流着泪修改。



推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
author-avatar
mobiledu2502859233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有