Spring boot 2.0 zuul routes db网关
前言:该文章只是记录自己平时的点点滴滴.来激励自己成长.长成自己喜欢的人!
环境:
- 电脑 Mac 10.13.1
- IntelliJ IDEA 2018.2 (Ultimate Edition)
- Spring boot 2.0.1.RELEASE
实现方案:
- 对外提供接口只暴漏一个接口名称,通过入参的形式路由服务对象
- 要求数据加密
- 要求传输每一步有日志输出
实现细节:
- Zuul
- Feign
- ZuulFilter
- ErrorController
- RefreshableRouteLocator
这里记录 RefreshableRouteLocator 实现db路由配置.
- DB - table
CREATE TABLE `saas_zuul_route` (`id` varchar(64) NOT NULL COMMENT 'zuul routes id',`path` varchar(64) DEFAULT NULL COMMENT 'zuul path',`service_id` varchar(64) DEFAULT NULL COMMENT 'zuul serviceId',`url` varchar(64) DEFAULT NULL COMMENT 'zuul url',`enabled` tinyint(1) DEFAULT '1' COMMENT '是否启用,默认启用',`retryable` tinyint(1) DEFAULT '1' COMMENT '是否重复使用',`strip_prefix` tinyint(1) DEFAULT '1' COMMENT '是否添加前缀',`prefix` varchar(32) DEFAULT NULL,`gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_update` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',`state` tinyint(1) DEFAULT '1' COMMENT '数据状态',`remark` varchar(255) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='zuul 动态路由主表'CREATE TABLE `saas_zuul_route_detail` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`zuul_route_id` varchar(64) DEFAULT NULL COMMENT 'zuul routes id',`service_path` varchar(64) DEFAULT NULL COMMENT '微服务controller path',`service_name` varchar(64) DEFAULT NULL COMMENT '对外service',`zuul_name` varchar(64) DEFAULT NULL COMMENT '微服务中文名称',`gmt_create` datetime DEFAULT NULL COMMENT '创建时间',`gmt_update` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',`state` tinyint(1) DEFAULT '1' COMMENT '数据状态',`remark` varchar(255) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='zuul 动态路由详情表'
业务逻辑代码(借鉴 https://blog.csdn.net/tianyaleixiaowu/article/details/77933295 )
public class DBRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {private JdbcTemplate jdbcTemplate;private ZuulProperties properties;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public DBRouteLocator(String servletPath, ZuulProperties properties) {super(servletPath, properties);this.properties = properties;log.info("servletPath:{}", servletPath);}//父类已经提供了这个方法,这里写出来只是为了说明这一个方法很重要!!!
// @Override
// protected void doRefresh() {
// super.doRefresh();
// }@Overridepublic void refresh() {doRefresh();}@Overrideprotected Map<String, ZuulProperties.ZuulRoute> locateRoutes() {LinkedHashMap<String, ZuulProperties.ZuulRoute> routesMap = new LinkedHashMap<>();routesMap.putAll(super.locateRoutes());//从db中加载路由信息routesMap.putAll(locateRoutesFromDB());LinkedHashMap<String, ZuulProperties.ZuulRoute> values = new LinkedHashMap<>();for (Map.Entry<String, ZuulProperties.ZuulRoute> entry : routesMap.entrySet()) {log.info("数据集合 + {}",entry);String path = entry.getKey();if (!path.startsWith("/")) {path = "/" + path;}if (StringUtil.hasText(this.properties.getPrefix())) {path = this.properties.getPrefix() + path;if (!path.startsWith("/")) {path = "/" + path;}}values.put(path, entry.getValue());}return values;}private Map<String, ZuulProperties.ZuulRoute> locateRoutesFromDB() {Map<String, ZuulProperties.ZuulRoute> routes = new LinkedHashMap<>();List<ZuulRouteDO> results = jdbcTemplate.query("select * from saas_zuul_route where enabled = true ", new BeanPropertyRowMapper<>(ZuulRouteDO.class));for (ZuulRouteDO result : results) {if (StringUtil.isEmptys(result.getPath()) ) {continue;}if (StringUtil.isEmptys(result.getServiceId()) && StringUtil.isEmptys(result.getUrl())) {continue;}ZuulProperties.ZuulRoute zuulRoute = new ZuulProperties.ZuulRoute();try {BeanUtils.copyProperties(result, zuulRoute);} catch (Exception e) {log.error("=============load zuul route info from db with error==============", e);}routes.put(zuulRoute.getPath(), zuulRoute);}return routes;}@Dataprivate static class ZuulRouteDO {private String id;private String path;private String serviceId;private String url;private Boolean stripPrefix = true;private Boolean retryable;private Boolean enabled;private String prefix;private Date gmtCreate;private Date gmtUpdate;private String state;private String remark;}
zuul 启动时加载配置
@Configuration
public class ZuulGatewayConfig {@AutowiredJdbcTemplate jdbcTemplate;@AutowiredZuulProperties zuulProperties;@AutowiredServerProperties server;/*** @return DBRouteLocator 动态路由*/@Beanpublic DBRouteLocator routeLocator() {DBRouteLocator routeLocator = new DBRouteLocator(server.getServlet().getServletPrefix(), this.zuulProperties);routeLocator.setJdbcTemplate(jdbcTemplate);return routeLocator;}}
刷新缓存.我这里用的是db链接.所以不需要刷新缓存.毕竟spring boot 2.0 提供了定时刷新任务
bootstrap.yml
server:port: 8080spring:application:name: zuulcloud:config:enabled: false #关闭加载远程配置logging:level:root: INFO
application.yml 配置,因为db读取routes . 所以这里不配置任何routes
spring:datasource:name: mysql_devtype: com.alibaba.druid.pool.DruidDataSource#druid相关配置druid:#监控统计拦截的filters#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙,防止sql注入filters: statdriver-class-name: com.mysql.jdbc.Driver#基本属性url: jdbc:mysql://localhost/abcusername: rootpassword: dasd#配置初始化大小/最小/最大initial-size: 1min-idle: 1max-active: 20#获取连接等待超时时间max-wait: 60000#间隔多久进行一次检测,检测需要关闭的空闲连接time-between-eviction-runs-millis: 60000#一个连接在池中最小生存的时间min-evictable-idle-time-millis: 300000validation-query: SELECT 'x'test-while-idle: truetest-on-borrow: falsetest-on-return: false#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为falsepool-prepared-statements: falsemax-pool-prepared-statement-per-connection-size: 20filter:stat:log-slow-sql: trueeureka:client:service-url:defaultZone: http://admin:admin@localhost:1111/eurekainstance:prefer-ip-address: true #开启ip访问. (默认主机名访问)instance-id: ${spring.application.name}:${server.port} #主机名:主机ip:portzuul:ignoredServices: '*' # 所有的微服务 ignored, 拒绝
Spring boot 2.0 zuul routes db网关相关推荐
- Spring Boot 2.0选择HikariCP作为默认数据库连接池的五大理由
转载自公众号:工匠小猪猪的技术世界 摘要: 本文非原创,是「工匠小猪猪的技术世界」搜集了一些HikariCP相关的资料整理给大家的介绍,主要讲解了为什么sb2选择了HikariCP以及HikariCP ...
- SpringBoot2.0(一):【重磅】Spring Boot 2.0权威发布
就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...
- (转)Spring Boot 2(一):【重磅】Spring Boot 2.0权威发布
http://www.ityouknow.com/springboot/2018/03/01/spring-boot-2.0.html 就在今天Spring Boot2.0.0.RELEASE正式发布 ...
- Spring Boot 3.0.0-M1 Reference Documentation(Spring Boot中文参考文档) 9-16
9. 数据 Spring Boot与多个数据技术集成,包括SQL和NoSQL. 9.1. SQL数据库 Spring Framework提供扩展支持用于与SQL数据工作,从使用JdbcTemplate ...
- 聊聊 Spring Boot 2.0 的 WebFlux
https://zhuanlan.zhihu.com/p/30813274 首发于极乐科技 写文章登录 聊聊 Spring Boot 2.0 的 WebFlux 泥瓦匠BYSocket 4 个月前 聊 ...
- 使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目
使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目 一:创建项目,并添加相应依赖 新建Project,并指定Project为Spring Initializr ...
- spring boot 2.0 源码分析(二)
在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数. 先把这段run函数的代码贴出来: /*** Run the ...
- Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到 17 了吗?
欢迎关注方志朋的博客,回复"666"获面试宝典 文章来源:程序猿DD 2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M ...
- Spring Boot 2.0 热部署指南
Spring Boot 2.0 支持热部署,实现方法很简单 Spring Boot 2.0 有几种热重载的选项. 推荐的方法是使用spring-boot-devtools 因为它提供了额外的开发时间功 ...
最新文章
- csgo 人数文件_学生机简单开一个CSGO的社区服务器
- Python高级特性:切片
- 数据结构整理中。。。
- LeetCode 388. 文件的最长绝对路径(不用栈,前缀和)
- 如何领导团队做好技术债管理?
- mysql文章列表_MySQL-分享文章列表 - Su的博客
- SimpleDateFormat中参数对照表
- offsetX、clientX、screenX、pageX、layerX
- 2.3.PHP7.1 狐教程-【PHP变量的作用域】
- 深入理解Java堆内存分配策略(Xmx和Xms)
- 【FreeSWITCH】录音功能调试报告-2
- ELK filebeat和logstash使用:配置单个文件来源、配置多个文件来源
- 《专业嵌入式软件开发》的样章、建议和勘误
- Vue 电商管理系统
- keil编程和c语言,C语言编程及keil软件使用.ppt
- 织梦CMS首页被篡改怎么办?
- 51Talk-Level 7 Unit 2 L3
- 【LeetCode/力扣】1723. 完成所有工作的最短时间
- Windows下使用Linux scp 命令
- 【IT项目管理】第4章 习题
热门文章
- uni-app应用内跳转至app-store
- Kindle解决卡索引问题(耗电速度大幅度提升)
- 使用gensim计算文本相似度
- Viola-Jones人脸检测
- HTML5基础知识习题及答案
- python相关性分析后怎样删除特征_震惊!数据分析还能这样做?
- web2.0之后是什么
- 小白必备的区块链项目分析攻略一:学会分辨“官网”
- ERROR: libgomp.so.1: version `GOMP_4.0‘ not found报错解决
- 最新基于Qt实现多电脑屏幕监控