前言:该文章只是记录自己平时的点点滴滴.来激励自己成长.长成自己喜欢的人!

环境:

  1. 电脑 Mac 10.13.1
  2. IntelliJ IDEA 2018.2 (Ultimate Edition)
  3. Spring boot  2.0.1.RELEASE

实现方案:

  1. 对外提供接口只暴漏一个接口名称,通过入参的形式路由服务对象
  2. 要求数据加密
  3. 要求传输每一步有日志输出

实现细节:

  1. Zuul
  2. Feign
  3. ZuulFilter
  4. ErrorController
  5. 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网关相关推荐

  1. Spring Boot 2.0选择HikariCP作为默认数据库连接池的五大理由

    转载自公众号:工匠小猪猪的技术世界 摘要: 本文非原创,是「工匠小猪猪的技术世界」搜集了一些HikariCP相关的资料整理给大家的介绍,主要讲解了为什么sb2选择了HikariCP以及HikariCP ...

  2. SpringBoot2.0(一):【重磅】Spring Boot 2.0权威发布

    就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...

  3. (转)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正式发布 ...

  4. Spring Boot 3.0.0-M1 Reference Documentation(Spring Boot中文参考文档) 9-16

    9. 数据 Spring Boot与多个数据技术集成,包括SQL和NoSQL. 9.1. SQL数据库 Spring Framework提供扩展支持用于与SQL数据工作,从使用JdbcTemplate ...

  5. 聊聊 Spring Boot 2.0 的 WebFlux

    https://zhuanlan.zhihu.com/p/30813274 首发于极乐科技 写文章登录 聊聊 Spring Boot 2.0 的 WebFlux 泥瓦匠BYSocket 4 个月前 聊 ...

  6. 使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目

    使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目 一:创建项目,并添加相应依赖 新建Project,并指定Project为Spring Initializr ...

  7. spring boot 2.0 源码分析(二)

    在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数. 先把这段run函数的代码贴出来: /*** Run the ...

  8. Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到 17 了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 ‍ ‍文章来源:程序猿DD‍ ‍ 2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M ...

  9. Spring Boot 2.0 热部署指南

    Spring Boot 2.0 支持热部署,实现方法很简单 Spring Boot 2.0 有几种热重载的选项. 推荐的方法是使用spring-boot-devtools 因为它提供了额外的开发时间功 ...

最新文章

  1. csgo 人数文件_学生机简单开一个CSGO的社区服务器
  2. Python高级特性:切片
  3. 数据结构整理中。。。
  4. LeetCode 388. 文件的最长绝对路径(不用栈,前缀和)
  5. 如何领导团队做好技术债管理?
  6. mysql文章列表_MySQL-分享文章列表 - Su的博客
  7. SimpleDateFormat中参数对照表
  8. offsetX、clientX、screenX、pageX、layerX
  9. 2.3.PHP7.1 狐教程-【PHP变量的作用域】
  10. 深入理解Java堆内存分配策略(Xmx和Xms)
  11. 【FreeSWITCH】录音功能调试报告-2
  12. ELK filebeat和logstash使用:配置单个文件来源、配置多个文件来源
  13. 《专业嵌入式软件开发》的样章、建议和勘误
  14. Vue 电商管理系统
  15. keil编程和c语言,C语言编程及keil软件使用.ppt
  16. 织梦CMS首页被篡改怎么办?
  17. 51Talk-Level 7 Unit 2 L3
  18. 【LeetCode/力扣】1723. 完成所有工作的最短时间
  19. Windows下使用Linux scp 命令
  20. 【IT项目管理】第4章 习题

热门文章

  1. uni-app应用内跳转至app-store
  2. Kindle解决卡索引问题(耗电速度大幅度提升)
  3. 使用gensim计算文本相似度
  4. Viola-Jones人脸检测
  5. HTML5基础知识习题及答案
  6. python相关性分析后怎样删除特征_震惊!数据分析还能这样做?
  7. web2.0之后是什么
  8. 小白必备的区块链项目分析攻略一:学会分辨“官网”
  9. ERROR: libgomp.so.1: version `GOMP_4.0‘ not found报错解决
  10. 最新基于Qt实现多电脑屏幕监控