一次zuul网关配置探究
使用过zuul网关的都知道,网关的路由是这样配置的:
网关配置即在配置文件routes下配置一系类的映射关系。但是这样会出现一个问题,需要修改配置的时候怎么处理?因为在生产环境中,可不像测试环境那样随便,想重启服务器就重启服务器。
因此,spring引入了spring cloud config server,目的是为了在程序运行刷新微服务配置。
官网的一篇说明:https://spring.io/guides/gs/centralized-configuration/
官网截图所以呢,要程序运行时刷新配置文件,需要经历以下步骤:(内容来自官方说明)
1、启动一个配置中心。
spring cloud config配置请查看官网说明2、启动另外一个微服务项目,消费配置中心配置。具体内容查请看官网
官网截图3、通过发送刷新请求,通知目标客户端刷新配置
官网截图从这种模式可以发现几个问题:
1、能否不通过http请求刷新,对于一个多实例微服务的项目,难道每次修改都发送几个http请求,针对具体的客户端刷新吗。即便可以在server端利用发送http请求的jar包进行操作,这不是同时也说明了还需要额外维护需要刷新项目的http访问信息吗?而发送http请求的目标主机不是恒久不变的,往往有项目会进行迁移,结果就是频繁的修改配置。
2、spring cloud server没有可视化的统一配置界面。虽然现在流行devops开发运维一体化,但是每次都到git或者其他地方修改配置文件,过程是有点痛苦的。
3、如果spring cloud server的配置需要根据系统本身权限进行控制,git或svn之类权限体系,比较难和系统本身的权限体系协调。
4、每个可以修改的配置属性,都需要在方法或者类上添加@RefreshScope注解,代码比较分散。
-------------------------------------------------------解决问题分割线---------------------------------------------------
Spring cloud server官方文档
https://cloud.spring.io/spring-cloud-config/single/spring-cloud-config.html
针对问题一:可以引入消息插件。所有多实例的微服务项目监听同一个消息源。当修改时,通过消息事件传递变化。参考:https://www.cnblogs.com/ityouknow/p/6931958.html
图片来自 https://www.cnblogs.com/ityouknow/p/6931958.html针对问题二、三:spring cloud config支持jdbc数据库配置。
官网截图但也没有可视化操作界面提供。不过针对系统本身的数据库增删改查进行权限控制,起码会比git或svn那边重新配一套权限体系容易得多。Spring cloud config jdbc配置,参考 https://blog.csdn.net/tian6318/article/details/79091372
针对问题四:查看源码后,会发现刷新配置比想象中的复杂。其中涉及spring bean的重新创建与销毁。参考https://blog.csdn.net/cml_blog/article/details/78411312
整理后的代码地址:https://github.com/sale-oranges-xyz/sale-oranges-xyz