# spring-cloud-parent **Repository Path**: QuanbIn30/spring-cloud-parent ## Basic Information - **Project Name**: spring-cloud-parent - **Description**: spring cloud 技术栈学习 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 222 - **Created**: 2022-03-10 - **Last Updated**: 2022-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-cloud-parent #### 项目介绍 spring cloud 的一个简单的学习 |项目名|描述| |--------|---------| |eureka-server|eureka-server的单机服务端,增加security保护服务端,关闭自我保护,具体操作见日志| |eureka-client|eureka-client的单机客户端| |eureka-server-ha|服务端的高可用配置| |ribbon|ribbon的简单使用| |feign|feign的简单使用| |feign-conf|feign的各种配置的使用| |hystrix|和hystrix相关的使用| |hystrix-dashboard-turbine|hystrix的dashboard和turbine| |zuul|服务网关的使用| |config|配置中心的使用| |monitor|服务监控| |prometheus|指标埋点| |springboot|处理SpringBoot中的一些特性| |es|处理es相关的内容| |mybatis|处理mybatis相关的内容| |sharding-jdbc|处理分表的逻辑| |canal|canal相关的内容| |security|security安全相关| |seata|分布式事物seata的相关用法| |redis|redis的一些用法| |mini-project|一些小的测试项目| ~~~ spring-cloud-parent │ |- 父项目 │ >> eureka优雅停机[博客](https://blog.csdn.net/fu_huo_1993/article/details/115255222?spm=1001.2014.3001.5501) ├─eureka-server [博客](http://huan1993.iteye.com/blog/2423631) │ |- 项目中用到的eureka server 注册中心 │ │ >> 开启注册中心的权限验证 │ │ >> 关闭eureka 的自我保护(开发环境修改,正式环境不要修改) │ │ >> 修改清除节点的时间(开发环境修改,正式环境不要修改) │ │ >> 修改instanceId的值 │ │ >> 显示ip地址,而不是使用主机名 ├─eureka-client │ |- 一个单独的服务提供者模版 │ │ >> 如何连接到有权限的服务段 │ │ >> 减小客户端和服务端的心跳和租约(开发环境修改,正式环境不要修改) ├─eureka-server-ha [博客](http://huan1993.iteye.com/blog/2423635) │ ├─eureka-server-ha-8764 │ │ |- 8764注册中心 │ ├─eureka-server-ha-8765 │ │ |- 8765注册中心 │ ├─eureka-client-8766 │ │ >> 演示如何注册到高可用的注册中心上 │ │ >> 本地测试需要配置虚拟域名 │ │ >> 本地测试需要注意prefer-ip-address的值,看eureka server界面上显示是否正确,即有没有显示当前节点的复制节点 ├─ribbon [博客](http://huan1993.iteye.com/blog/2423850) │ ├─product-provider-8777 │ ├─product-provider-8778 │ ├─product-provider-8779 │ ├─product-provider-8780 │ ├─order-consumer │ │ >> 为具体的某个服务单独配置策略,比如修改负载均衡策略等 │ │ >> 需要注意全局和局部配置的区别 │ │ >> 使用配置文件进行配置(略) │ │ >> 解决ribbon项目第一次访问时才加载 ribbon.eager-load.enabled:true ribbon.eager-load.clents: 需要立即启动client的名字 ├─feign [博客](http://huan1993.iteye.com/blog/2423924) │ ├─product-provider-8083 │ ├─product-provider-8084 │ ├─product-consumer-8082 │ │ >> 演示 feign 的调用远程服务的各种参数的调用形式 │ │ >> 演示 feign 调用方法参数的各种坑 ├─feign-conf [博客](http://huan1993.iteye.com/blog/2424108) │ ├─product-provider-8085 │ ├─product-provider-8086 │ ├─product-provider-8087 │ ├─product-provider-8088 │ ├─product-consumer-8089 │ │ >> feign 的默认配置类 (FeignClientsConfiguration) │ │ >> 单独对某个客户端修改配置 │ │ >> 修改默认的契约 │ │ >> 修改feign的日志级别 │ │ >> 根据url直接进行调用,和增加自定义请求头 (如果使用了hystrix,那么在RequestInterceptor中要想使用ThreadLocal的值,隔离策略需要修改成信号量隔离) │ │ >> 增加压缩 │ │ >> 增加超时时间的配置 │ │ >> 配置重试 │ │ >> yml 文件中对feign的各种配置 │ │ ├─hystrix [回退](http://huan1993.iteye.com/blog/2424282) │ ├─product-provider-8091 │ ├─product-consumer-feign-hystrix-8093 │ │ >> feign 中使用 fallback 实现回退 │ │ >> feign 中使用 fallbackFactory 实现回退,拿到回退的原因 │ │ >> 修改feign的日志级别 │ ├─product-consumer-feign-hystrix-isolation-dashboard-8094 │ │ >> 使用 hystrix 的 dashboard 监控单个微服务的各种参数 │ │ >> 配置全局的隔离策略 │ │ >> 配置某个具体方法的隔离策略 │ │ >> 修改HystrixCommad命令的超时时间 │ │ >> 修改回退的最大并发 │ │ >> 修改局部或全局的Thread隔离时最大的线程并发数 │ │ >> 修改 fallback 最大的并发数 │ │ >> 修改 feign 中默认使用 HttpUrlConnection 进行远程方法请求,修改成 apache httpclient │ │ ** 需要增加 feign-httpclient 依赖,其余默认可以不用修改,也可以修改一些httpclient的参数 │ │ >> 请求缓存(略) │ │ >> 请求合并(略) => 当某个请求在极短的时间内大量请求可以使用请求合并来提高效率 ├─hystrix-dashboard-turbine [hystrix图表监控](http://huan1993.iteye.com/blog/2424491) │ ├─hystrix-dashboard │ │ >> 监控单个工程(指的时同一个服务消费者部署一个,监控这一个的数据) │ ├─hystrix-single-cluster-turbine │ │ >> 监控单个集群(指的是同一个服务消费者部署多个,监控这一整个的数据) │ ├─hystrix-more-cluster-turbine │ │ >> 监控多个集群(指的是存在多个服务消费者,且多个服务消费者可能都部署了多个,监控这多个的数据) │ ├─hystrix-all-cluster-turbine │ │ >> 监控默认的集群 ├─zuul [zuul的各种配置](http://huan1993.iteye.com/blog/2424491) │ ├─product-provider-8202 │ ├─product-provider-8203 │ │ >> 服务提供者 │ ├─product-consumer-8201 │ │ >> 服务消费者 │ ├─product-gateway-8204 │ │ >> 网关程序 │ │ >> 查看 zuul 中配置好的路由和过滤器信息 │ │ >> 忽略所有微服务或某些微服务 │ │ >> 忽略所有为服务,只路由指定的微服务 │ │ >> 通过path和url访问到具体的某台机器上 │ │ >> 脱离eureka进行访问,并使之具有负载均衡和隔离的机制等 │ │ >> 转发前是否去掉路由前缀 │ │ >> 为所有路由都增加一个通过的前缀 │ │ >> 忽略某些路径不进行路由 │ │ >> 敏感头的传递(比如Cookie等)全局设置和某个微服务设置 │ │ >> 忽略头 │ │ >> spring security 在classpath 下会忽略的头 │ │ >> 本地调换和路由的优先级 │ │ >> 网关(zuul)的超时配置,看网关中yml中的配置 │ │ >> 重写 Location 头 │ │ >> 文件上传处理 │ │ >> zuul 中使用ribbon进行负载均衡调用,ribbon是在第一次调用时由Spring Cloud延时加载,现在修改成程序启动时就立即加载 │ ├─product-gateway-filters-8205 │ │ >> 使用 pre 过滤器进行权限的校验 │ │ >> 使用 post 过滤器添加额外的响应头 │ │ >> 禁用过滤器 │ ├─product-gateway-fallbackprovider-8206 │ │ >> zuul 服务网关的回退,即zuul访问某个微服务访问不到时的 fallback 处理 │ │ >> 单个服务回退 getRoute() 直接返回那个服务的serviceId的值,为所有的回退,直接返回 null 或 * │ ├─product-gateway-aggregation-swagger2-8207 │ │ >> 聚合各个工程的 swagger api 接口文档 ├─config [spring cloud config 的使用](http://huan1993.iteye.com/blog/2425032) │ ├─config-server-8301 │ │ >> config server 端的编写并注册到eureka上 │ │ >> config server 端增加 basic 认证 │ │ >> config server 配置路径查找规则 │ │ >> config server 的加密和解密端点 │ │ >> 配置进行加密处理 │ │ >> 其它的一些配置见具体的配置文件上 │ ├─product-provider-config-client-8302 │ │ >> config client 端 │ ├─config-bus-webhook [spring cloud config 结合 spring cloud bus实现配置自定的刷新](http://huan1993.iteye.com/blog/2425170) │ ├────config-server-bus-8305 │ │ >> config server 服务端,整合spring cloud bus 实现配置自动刷新 │ ├────product-provider-config-client-bus-webhook-8303 │ ├────product-provider-config-client-bus-webhook-8304 │ │ >> config client 客户端,git 的webhook请求config server的 /bus/refresh完成各个客户端配置的自动刷新 ├─monitor │ ├─admin [spring boot admin 的使用](http://huan1993.iteye.com/blog/2425265) │ │ >> 使用spring boot admin 进行监控 │ │────spring-boot-admin-server-8401 │ │ >> 在 spring boot 1.5.x 后,要监控端点,需要management.security.enabled=false │ │ >> 引入 spring security 后,就可以使用 spring security 保护admin server │ │ >> 引入 spring security 保护admin server │ │ >> 作为一个服务发现者注册到 eureka 上 │ │ >> 给 admin server 提供一个表单登录 │ │ >> 服务的下上线进行邮件的通知 │ │────client-product-provider-8402 │ │ >> 动态控制日志级别 │ │ >> 当设置了management.context-path,如何进行配置 │ │ >> 显示版本号 │ │ >> 客户端使用了 spring security 做了权限保护,admin server如何访问 │ │ >> 整合 hystrix ui │ ├─zipkin │ │ >> 使用 zipkin 进行分布式服务追踪,分析服务调用耗时、服务之间的依赖 │ │────product-consumer-feign-hystrix-zipkin-8502 │ │────product-provider-zipkin-8501 │ │────zipkin-server-8503 │ │ >> 以上三个应用程序为一组,实现 zipkin 数据存储在 mysql 中 │ │ >> 如何进行配置参考 spring-cloud-parent -- monitor -- readme.txt 文件 ├─prometheus │ ├─actuator-prometheus [博客 springboot接入prometheus](https://blog.csdn.net/fu_huo_1993/article/details/114841836) │ │ >> 接入Prometheus │ │ >> 自定义业务指标埋点 │ │ >> 增加全局tag,过滤tag,个性化MeterRegistry │ ├─eureka-prometheus-parent │ │ >> 使用 eureka 作为 prometheus 的服务发现 │ │ >> 在1分钟之内支付订单支付失败产生告警数据 │ │ >> 具体参考 eureka-prometheus-parent/order-provider-10004/订单支付失败告警.md文件 │ ├─prometheus-histogram │ │ >> 在prometheus中使用直方图 ├─springboot │ ├─bean-definition-registrar [博客](https://blog.csdn.net/fu_huo_1993/article/details/115699479?spm=1001.2014.3001.5501) │ │ >> 实现手动动态的注入Bean。 │ │ >> 实现 ImportBeanDefinitionRegistrar 接口,实现手动注入 BeanDefinition │ │ >> 1、实现此接口的类需要配合@Configuration和@Import注解使用。 │ │ >> 实现 FactoryBean 接口,实现个性化构建Bean。 │ │ >> 1、getObject() 方法返回的对象的内部是无法使用@Autowired等注解注入的,使用自己使用applicationContext.getAutowireCapableBeanFactory().autowireBean(instance)实现等等。 │ ├─logstash-grok [博客](https://blog.csdn.net/fu_huo_1993/article/details/116744920?spm=1001.2014.3001.5501) │ │ >> 实现使用 logstash 的 grok 插件解析springboot程序的日志 │ │ >> 实现自定义 grok 的模式。 │ │ >> 实现多行匹配 │ ├─spring-parent-child-context [博客](https://blog.csdn.net/fu_huo_1993/article/details/117708365?spm=1001.2014.3001.5501) │ │ >> 实现Spring的父子上下文 │ ├─class-method-pointcut │ │ >> 使用 Pointcut 和 Advisor 实现切面效果。(类似于@Validate的实现效果) │ ├─springboot-task │ │ >> 使用 @Scheduled 注解实现定时任务 │ │ >> 使用 ThreadPoolTaskScheduler 实现动态的注册定时任务,需要修改ThreadPoolTaskScheduler的线程数,默认值是1 │ │ >> 验证 cron 表达式的正确性和计算下次执行的时间 │ │ >> Spring 的低版本使用 CronSequenceGenerator │ │ >> Spring 的高版本使用 CronExpression │ ├─spring-deferred-result [异步处理](https://blog.csdn.net/fu_huo_1993/article/details/120780925) │ │ >> 实现异步处理 │ │ >> 可以实现 长轮训 操作 │ ├─springboot-encrypt-config [博客](https://blog.csdn.net/fu_huo_1993/article/details/120826254) │ │ >> 实现配置属性的加密 │ ├─springboot-plugin 使用场景:见项目下的README.md文件 │ │ >> Spring Plugin 工程的使用 │ ├─springboot-redis-lua [博客](https://blog.csdn.net/fu_huo_1993/article/details/121001911) │ │ >> springboot中在redis中调用lua脚本 │ │ >> 使用 lua 实现一个简单的锁 │ │ >> 使用 lua 实现一个简单分布式限流 │ ├─springboot-method-argument-resolver [博客](https://blog.csdn.net/fu_huo_1993/article/details/121774150) │ │ >> 自定义参数解析器(类似于实现@RequestParam) ├─es │ ├─es-api [api地址](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.12/index.html) │ │ >> es-api的简单使用。 │ │ >> 完成 geo_point api的简单使用。(com.huan.study.esapi.dslapi.geoapi.DistanceQueryApi) │ │ >> 直接根据json字符串查询 │ │ >> 完成 简单的crud操作。(com.huan.study.esapi.documentapi.DocumentCrudApi) │ │ >> 1、添加文档。 │ │ >> 2、替换文档(替换一整个文档,比如之前的文档10个字段,此处只给了2个字段,那么替换后的文档只有2个字段)。 │ │ >> 3、修改文档(修改部分字段)。 │ │ >> 4、删除文档。 │ │ >> 5、获取文档。 │ │ >> 6、只获取文档的_source部分的内容。 │ │ >> 7、判断文档是否存在。 │ │ >> 8、获取某个索引下所有的文档。 │ │ >> 使用function_score重新打分。(com.huan.study.esapi.dslapi.functionscore.FunctionScoreApi) ├─mybatis │ ├─mybatis-typehandler-encrypt │ │ >> 使用TypeHandler完成数据的加密和解密操作。 │ │ >> 完成 简单的crud操作。 ├─sharding-jdbc │ >> 实现对customer的分表操作。 │ >> 实现对customer_order使用复合分片算法,根据order_id和customer_id来实现。[博客](https://blog.csdn.net/fu_huo_1993/article/details/117258672?spm=1001.2014.3001.5501) │ >> 实现 customer_order 和 customer_order_item 绑定表的查询,绑定表的分表规则需要一致。 │ >> 强制走主库(HitManager.getInstance().setMasterRouteOnly())。 ├─canal │ ├─canal-api(canal client api的使用) │ │ >> CanalClientApi(完成Canal Client Api的测试)。[博客](https://blog.csdn.net/fu_huo_1993/article/details/117469080?spm=1001.2014.3001.5501) │ │ >> CanalClientApi(相同的代码启动多次,只有一个客户端可以获取到数据)。 │ ├─canal-kafka-consumer(kafka接收canal发送过来的消息)[博客](https://blog.csdn.net/fu_huo_1993/article/details/120075606) ├─security │ ├─authorization-server(Spring Authorization Server 的使用)[博客](https://blog.csdn.net/fu_huo_1993/article/details/118798160?spm=1001.2014.3001.5501) │ ├ >> 1、完成授权码、客户端的授权 │ ├ >> 2、增加认证、授权异常处理 │ ├ >> 3、完成JWTtoken的个性化 │ ├ >> 4、为每个客户端都分配自己的公私钥,为每个客户端签名的JWT都使用自己的私钥 │ ├ >> 5、授权服务器使用固定的公私钥,参考文档 security/生成证书和导出公钥.md │ ├─authorization-server-prod │ ├ >> 1、完成授权码、客户端的授权 │ ├ >> 2、增加认证、授权异常处理 │ ├ >> 3、完成JWTtoken的个性化 │ ├ >> 4、为每个客户端都分配自己的公私钥,为每个客户端签名的JWT都使用自己的私钥 │ ├ >> 5、授权服务器使用固定的公私钥,参考文档 security/生成证书和导出公钥.md │ ├─resource-server 资源服务器 │ ├ >> 1、完成资源服务器的搭建 │ ├ >> 2、完成异常的处理 │ ├ >> 3、完成解析JWT │ ├ >> 1、从那个地方进行解析,请求头还是请求参数 │ ├ >> 2、对jwt进行校验 │ ├ >> 3、设置获取jwk的超时时间 │ ├ >> 4、给jwt的claim增加内容 │ ├ >> 5、设置从jwt的那个字段中获取权限 │ ├ >> 6、删除默认的SCOPE_权限前缀 │ ├ >> 7、资源服务器使用固定的公钥,参考文档 security/生成证书和导出公钥.md ├─seata(seata分布式事物的根项目) │ ├─seata-springboot-mybatis [博客](https://blog.csdn.net/fu_huo_1993/article/details/120454011?spm=1001.2014.3001.5501) │ ├ >> 1、seata 整合 springboot │ ├ >> 2、使用seata-spring-boot-starter来整合 │ ├ >> 3、业务库需要有 undo_log 表,业务表需要有单一主键 │ ├ >> 4、AT模式下,数据源需要使用 DatasourceProxy 来代理 │ ├ >> 5、每个服务的事务分组可能不一样,但是需要和配置中心对应上。 │ ├ >> account-server 中的配置分组为:seata.tx-service-group=tx_account_service_group │ ├ >> 配置中心必须存在 service.vgroupMapping.tx_account_service_group=default 配置项,default是集群,是服务端配置文件中指定的 │ ├──────account-server-50001 │ ├ >> 1、数据源使用 druid,使用自动数据源代理 │ ├──────order-service-50002 │ ├ >> 1、数据源使用 Hikari,不使用自定数据源的代理,自己配置配置数据源代理 │ ├ >> 2、使用 RestTemplate 来通讯,编写拦截器确保 xid 正常传递 │ ├ >> 3、在请求结束后,需要确保xid被清除了。 │ ├ >> 4、seata1.4中的bug,业务表中使用datetime类型的数据类型时报错,可以考虑使用timestamp类型 │ ├ >> 5、表中最好不要有自动更新时间戳的地方 │ ├─seata-springcloud-mybatis-plus [博客](https://blog.csdn.net/fu_huo_1993/article/details/120504020) │ ├ >> 1、seata 整合 spring cloud 、mybatis-plus │ ├ >> 2、微服务之间使用feign来调用,不用额外的配置feign传递xid,默认实现实现了 │ ├─seata-multiple-datasource [博客](https://blog.csdn.net/fu_huo_1993/article/details/120523329?spm=1001.2014.3001.5501) │ ├ >> 1、seata 整合 多数据源。 │ ├ >> 2、需要注意一下 事物和数据源切换的 顺序问题。 │ ├─seata-springboot-rollback-tx [博客](https://blog.csdn.net/fu_huo_1993/article/details/120533658?spm=1001.2014.3001.5501) │ ├ >> 1、实现分布式事物 在某些条件下手动回滚事物,比如: feign调用,出现了服务降级 │ ├ >> 2、实现分布式事物的挂起等操作等。比如:下单请求,在失败的时候,需要记录一个日志,此处记录日志的方法就不应该参与分布式事物。 │ ├─seata-springboot-failure-handler [博客](https://blog.csdn.net/fu_huo_1993/article/details/120655233?spm=1001.2014.3001.5501) │ ├ >> 1、分布式事务失败时进行通知 │ ├─seata-springboot-kryo [博客](https://blog.csdn.net/fu_huo_1993/article/details/120706236) │ ├ >> 1、undo_log的序列化方式修改成kryo,默认的jackson方式无法序列化datetime类型 │ ├─seata-srpingcloud-sharding-jdbc-druid-mybatis-plus │ ├ >> ⚠️ 1、seata整合sharding-jdbc 整合失败,后期在完善。 ├─redis(redis相关的操作) │ ├─redis-stream [博客](https://blog.csdn.net/fu_huo_1993/article/details/121276700) │ ├ >> 1、使用 xread 读取流中的消息 │ ├ >> 2、消费组消费 │ ├ >> 3、对象类型传输 │ ├─redis-lua [博客](https://blog.csdn.net/fu_huo_1993/article/details/121001911) │ ├ >> 1、在redis中使用lua脚本 │ ├─redis-pubsub │ ├ >> 1、redis 发布订阅的一个小例子 │ ├─redis-bitmap-sign-in │ ├ >> 1、基于bitmap实现的一个简单的签到功能 ├─mini-project(一些小的测试项目) │ ├─juejin-auto-sign-in │ ├ >> 1、掘金自动签到,抽奖,并发送邮件通知 ~~~ ​ ##### 1、eureka的自我保护,生产环境中不建议关闭,测试环境中可以关闭。 ##### 2、当使用了feign的 RequestInterceptor 向下游服务传递消息头,比如Cookie等时,如果启用了 Hystrix ,如果想在 RequestInterceptor 中使用到 ThreadLocal 中的值,必须要将隔离策略修改成信号量隔离。 ##### 3、spring config client 的和注册中心的配置以及client config的配置必须要写在 bootstrap.yml 配置文件中