﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-JAVA-文章分类-spring cloud 微服务</title><link>http://www.blogjava.net/zzzlyr/category/55168.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 Jul 2021 15:02:56 GMT</lastBuildDate><pubDate>Mon, 19 Jul 2021 15:02:56 GMT</pubDate><ttl>60</ttl><item><title>大厂链路追踪架构图(鹰眼)</title><link>http://www.blogjava.net/zzzlyr/articles/435886.html</link><dc:creator>为自己代言</dc:creator><author>为自己代言</author><pubDate>Fri, 04 Jun 2021 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/zzzlyr/articles/435886.html</guid><wfw:comment>http://www.blogjava.net/zzzlyr/comments/435886.html</wfw:comment><comments>http://www.blogjava.net/zzzlyr/articles/435886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzzlyr/comments/commentRss/435886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzzlyr/services/trackbacks/435886.html</trackback:ping><description><![CDATA[<h1 id="整体架构" data-spm-anchor-id="a1zco.8292288.0.i5.749e105bdMZpj6" style="box-sizing: border-box; font-size: 1.3em; margin-top: 0px !important; margin-right: 0px; margin-bottom: 0.85em; margin-left: 0px; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-weight: 700; line-height: 1.1; color: #333333; break-after: avoid; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: 0.2px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; border-bottom: 1px solid #e7e9ed; padding-bottom: 10px;">整体架构</h1><div><span style="color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 3; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 3; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">从日志生成到抓取、存储、分析、展现的多个系统间交互过程。</span></div><div><span style="color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 3; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 3; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"><br /></span></div><div><br /><span style="color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 3; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 3; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"><img src="http://git.cn-hangzhou.oss.aliyun-inc.com/uploads/middleware/eagleeye-docs/e6b1f43e23bea8208c64b8fa44e1f795/image.png" alt="image" /><br /></span></div><div><h1 id="eagleeye-的核心" data-spm-anchor-id="a1zco.8292288.0.i7.749e105bdMZpj6" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; font-size: 1.3em; margin: 1.275em 0px 0.85em; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-weight: 700; line-height: 1.1; color: #333333; break-after: avoid; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: 0.2px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; border-bottom: 1px solid #e7e9ed; padding-bottom: 10px;">EagleEye 的核心</h1><div><ul style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.85em; font-size: 14px; padding: 0px 0px 0px 2em; color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li data-spm-anchor-id="a1zco.8292288.0.i8.749e105bdMZpj6" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; font-size: inherit;">TraceId</li></ul></div></div><div><span style="color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 3; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 3; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">在复杂的分布式系统环境下，EagleEye是一个有广泛用途的调用分析和问题排查工具。与一般的调用信息埋点日志相比，EagleEye埋点的一个显著的不同点在于它的每条日志都有与每次请求关联的上下文ID，我们称为TraceId。通过TraceId，后期的日志处理时可以把一次前端请求在不同服务器记录的调用日志关联起来，重新组合成当时这个请求的调用链。因此，EagleEye不仅可以分析到应用之间的直接调用关系，还可以得到他们的间接调用关系、以及上下游的业务处理信息；对于调用链的底层系统，可以追溯到它的最上层请求来源以及中间经过的所有节点；对于调用链的上层入口，可以收集到它的整棵调用树，从而定位下游系统的处理瓶颈，当下游某个应用有异常发生时，能迅速定位到问题发生的位置。</span></div><div><br /><span style="color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 3; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 3; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"></span></div><div><img src="http://git.cn-hangzhou.oss.aliyun-inc.com/uploads/middleware/eagleeye-docs/df5b5886c61c9bc6fd53c054c9233df9/image.png" alt="image" /></div><div></div><div><p data-spm-anchor-id="a1zco.8292288.0.i11.749e105bdMZpj6" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.85em; font-size: 14px; orphans: 3; widows: 3; color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">如上图所示，应用A是接受到来自用户浏览器的Web请求的前端服务器，它是一条调用链的开始端，在TBSession和EagleEyeFilter中都做了EagleEye上下文埋点。请求收到后它会先调用EagleEye StartTrace生成TraceId并放置在当前线程的ThreadLocal，日志埋点请求信息（如URL、SessionId、UserId等）。在请求处理完毕提交相应时，再调用EndTrace清理线程中的EagleEye信息。 在应用A调用应用B、C的HSF服务，或者发送Notify消息时，TraceId被包含在EagleEye上下文中，随网络请求到达应用B、C、D、E之中，并放置在线程ThreadLocal内，因此后续调用到的这些系统都会有EagleEye这次请求的上下文。这些系统再发起网络请求时，也类似的携带了上下文信息的。</p><ul style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.85em; font-size: 14px; padding: 0px 0px 0px 2em; color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; font-size: inherit;">RpcId</li></ul><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.85em; font-size: 14px; orphans: 3; widows: 3; color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">为了区别同一个调用链下多个网络调用的顺序和嵌套层次，EagleEye还需要传输和记录RpcId。 RpcId用0.X1.X2.X3.....Xi来表示，Xi都是非负整数，根节点的RpcId固定从0开始，第一层网络调用的RpcId是0.X1，第二层的则为0.X1.X2，依次类推。*例如，从根节点发出的调用的RpcId是0.1、0.2、0.3，RpcId是0.1的节点发出的RpcId则为0.1.1、0.1.2、0.1.3。如下图所示</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.85em; font-size: 14px; orphans: 3; widows: 3; color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><img src="http://git.cn-hangzhou.oss.aliyun-inc.com/uploads/middleware/eagleeye-docs/fa0814a9353ccd928c00eae5ec9e3c4e/image.png" alt="image" /></p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.85em; font-size: 14px; orphans: 3; widows: 3; color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br /></p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.85em; font-size: 14px; orphans: 3; widows: 3; color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span style="color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 3; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 3; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">通过RpcId，可以准确的还原出调用链上每次调用的层次关系和兄弟调用之间的先后顺序。 例如上图应用 G 的两次调用0.2.1.1和0.1.2.1，可以看出对 DB 的访问0.2.1.1源于 C 到 G 的调用0.2.1，对 Tair 的访问0.1.2.1源于B 到 G 的调用0.1.2。 很多调用场景会比上面说的完全同步的调用更为复杂，比如会遇到异步、单向、广播、并发、批处理等等，这时候需要妥善处理好ThreadLocal上的调用上下文，避免调用上下文混乱和无法正确释放。另外，采用多级序号的RpcId设计方案会比单级序号递增更容易准确还原当时的调用情况。</span></p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.85em; font-size: 14px; orphans: 3; widows: 3; color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><br /></p><br /><span style="color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 3; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 3; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"></span><span style="color: #333333; font-family: 微软雅黑, &quot;Microsoft Yahei&quot;, &quot;Hiragino Sans GB&quot;, tahoma, arial, 宋体; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: 0.2px; orphans: 3; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 3; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"></span></div><img src ="http://www.blogjava.net/zzzlyr/aggbug/435886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzzlyr/" target="_blank">为自己代言</a> 2021-06-04 15:36 <a href="http://www.blogjava.net/zzzlyr/articles/435886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringBoot异步及线程池配置(jdk8新增加线程支持CompletableFuture)</title><link>http://www.blogjava.net/zzzlyr/articles/435305.html</link><dc:creator>为自己代言</dc:creator><author>为自己代言</author><pubDate>Wed, 25 Mar 2020 12:19:00 GMT</pubDate><guid>http://www.blogjava.net/zzzlyr/articles/435305.html</guid><wfw:comment>http://www.blogjava.net/zzzlyr/comments/435305.html</wfw:comment><comments>http://www.blogjava.net/zzzlyr/articles/435305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzzlyr/comments/commentRss/435305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzzlyr/services/trackbacks/435305.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如何在 Spring 使用@Async,@EnableAsync注释进行异步处理:异步处理适用那些与业务逻辑（横切关注点）不直接相关或者不作为其他业务逻辑输入的部分，也可在分布式系统中解耦。*译注：横切关注点（cross-cutting concerns）指一些具有横越多个模块的行为，使用传统的软件开发方法不能够达到有效模块化的一类特殊关注点。*Spring 中，`@Async`注解可以标记异步操...&nbsp;&nbsp;<a href='http://www.blogjava.net/zzzlyr/articles/435305.html'>阅读全文</a><img src ="http://www.blogjava.net/zzzlyr/aggbug/435305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzzlyr/" target="_blank">为自己代言</a> 2020-03-25 20:19 <a href="http://www.blogjava.net/zzzlyr/articles/435305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring boot redis  配置</title><link>http://www.blogjava.net/zzzlyr/articles/432728.html</link><dc:creator>为自己代言</dc:creator><author>为自己代言</author><pubDate>Mon, 07 Aug 2017 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/zzzlyr/articles/432728.html</guid><wfw:comment>http://www.blogjava.net/zzzlyr/comments/432728.html</wfw:comment><comments>http://www.blogjava.net/zzzlyr/articles/432728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzzlyr/comments/commentRss/432728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzzlyr/services/trackbacks/432728.html</trackback:ping><description><![CDATA[1：pom.xml 找自己spring boot 对应的版本<br /><div>&nbsp; &lt;!-- redis 配置--&gt;</div><div>&nbsp;&lt;dependency&gt;</div><div>&nbsp;&lt;groupId&gt;redis.clients&lt;/groupId&gt;</div><div>&nbsp;&lt;artifactId&gt;jedis&lt;/artifactId&gt;</div><div>&nbsp;&lt;version&gt;2.8.1&lt;/version&gt;</div><div>&nbsp;&lt;/dependency&gt;</div><div>&nbsp;&lt;dependency&gt;</div><div>&nbsp;&lt;groupId&gt;org.springframework.data&lt;/groupId&gt;</div><div>&nbsp;&lt;artifactId&gt;spring-data-redis&lt;/artifactId&gt;</div><div>&nbsp;&lt;version&gt;1.7.2.RELEASE&lt;/version&gt;</div><div>&nbsp;&lt;/dependency&gt;</div><div>&lt;!-- end redis 配置--&gt;<br /><br /><div>2： 在spring boot &nbsp; *.properties 配置文件中增加连接配置：</div><div></div><div>&nbsp; &nbsp; &nbsp;spring.redis.hostName=127.0.0.1</div><div>&nbsp; &nbsp; spring.redis.port=6379</div><div>&nbsp; &nbsp; spring.redis.password=</div><div>&nbsp; &nbsp; spring.redis.pool.maxActive=8</div><div>&nbsp; &nbsp; spring.redis.pool.maxWait=-1</div><div>&nbsp; &nbsp; spring.redis.pool.maxIdle=8</div><div>&nbsp; &nbsp; spring.redis.pool.minIdle=0</div><div>&nbsp; &nbsp; spring.redis.timeout=0</div><div>3： spring boot 中增加redis 配置连接<br />&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; background-color: #eeeeee; font-size: 13px;">/**</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008000; ">&nbsp;*&nbsp;Created&nbsp;by&nbsp;Administrator&nbsp;on&nbsp;2017/2/27.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@Configuration<br />@EnableAutoConfiguration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;RedisConfig&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(RedisConfig.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;@ConfigurationProperties(prefix="spring.redis")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JedisPoolConfig&nbsp;getRedisConfig(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JedisPoolConfig&nbsp;config&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JedisPoolConfig();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;config;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; @Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;@ConfigurationProperties(prefix="spring.redis")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;RedisConnectionFactory&nbsp;jedisConnectionFactory(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JedisConnectionFactory(getRedisConfig());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;RedisTemplate&lt;String,&nbsp;Object&gt;&nbsp;redisTemplate(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisTemplate&lt;String,&nbsp;Object&gt;&nbsp;template&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;RedisTemplate&lt;String,&nbsp;Object&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">这个缓存key的序列化方式</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template.setKeySerializer(<span style="color: #0000FF; ">new</span>&nbsp;StringRedisSerializer());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置redis&nbsp;转换&nbsp;value&nbsp;通过jdk序列化方法，GenericJackson2JsonRedisSerializer&nbsp;这个是json形式</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template.setValueSerializer(<span style="color: #0000FF; ">new</span>&nbsp;GenericJackson2JsonRedisSerializer());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template.setConnectionFactory(jedisConnectionFactory());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;template;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;这个是redis&nbsp;多值操作返回模版对象。比如：map,set&nbsp;,list&nbsp;等<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;&nbsp;@Bean</div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ValueOperations&lt;String,&nbsp;Object&gt;&nbsp;valueOperations(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisTemplate&lt;String,&nbsp;Object&gt;&nbsp;redisTemplate&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;RedisTemplate&lt;String,&nbsp;Object&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">这个缓存key的序列化方式</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setKeySerializer(<span style="color: #0000FF; ">new</span>&nbsp;StringRedisSerializer());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">这个缓存value的序列化方式,通过有jdk序列化，这个是json&nbsp;序列化</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setValueSerializer(<span style="color: #0000FF; ">new</span>&nbsp;GenericJackson2JsonRedisSerializer());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setExposeConnection(<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setConnectionFactory(jedisConnectionFactory());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.afterPropertiesSet();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;redisTemplate.opsForValue();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div></div> <div></div><div>4: RedisTemplate 使用<br />&nbsp; &nbsp;@Service<div>public class RedisServiceImpl implements RedisService{</div><div></div><div>&nbsp; &nbsp; @Autowired</div><div>&nbsp; &nbsp; private RedisTemplate redisTemplate;</div><div></div><div>&nbsp; &nbsp; public boolean expire(final String key, long expire,final TimeUnit unit) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return redisTemplate.expire(key, expire, unit);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; @Override</div><div>&nbsp; &nbsp; public void setList(String key, List&lt;String&gt; list, long expire, TimeUnit unit) throws Exception {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.delete(key);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.opsForValue().set(key,list,expire,unit);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; public List&lt;String&gt; getList(String key) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return (List&lt;String&gt;)redisTemplate.opsForValue().get(key);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; public void remove(String key){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.delete(key);</div><div>&nbsp; &nbsp; }</div>&nbsp; &nbsp; @Override<div>&nbsp; &nbsp; public void setKey(String key, String s, long expire, TimeUnit unit) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.opsForValue().set(key,s,expire,unit);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; @Override</div><div>&nbsp; &nbsp; public String getKey(String key) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return (String) redisTemplate.opsForValue().get(key);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; @Override</div><div>&nbsp; &nbsp; public Object getKeyForObject(String key) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return redisTemplate.opsForValue().get(key);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; @Override</div><div>&nbsp; &nbsp; public void setMap(String key, Map&lt;String, Object&gt; map, long expire, TimeUnit unit) throws Exception {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; this.expire(key,expire,unit);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.opsForHash().putAll(key,map);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; @Override</div><div>&nbsp; &nbsp; public void removeKeyForMap(String key, String mapKey) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.opsForHash().delete(key,mapKey);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; @Override</div><div>&nbsp; &nbsp; public void putMapKey(String key, String mapKey, String mapValue) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.opsForHash().put(key,mapKey,mapValue);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; public Set&lt;String&gt; keys(String o ){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return redisTemplate.keys(o);</div><div>&nbsp; &nbsp; }</div>}<br /><br /><div>5：单元测试类<br /><br /><div>RunWith(SpringRunner.class)</div><div>@SpringBootTest(classes = MyApplication.class)// 指定spring-boot的启动类</div><div>//相当于 &nbsp;--spring.profiles.active=dev</div><div>@ActiveProfiles(value = "dev")</div><div>public class RedisCacheTest {</div><div></div><div></div><div>&nbsp; &nbsp; protected final Logger logger = Logger.getLogger(this.getClass());</div><div>&nbsp; &nbsp; @Autowired</div><div>&nbsp; &nbsp; private RedisService redisService;</div><div>&nbsp; &nbsp; @Autowired</div><div>&nbsp; &nbsp; private RedisTemplate redisTemplate;</div><div></div><div>&nbsp; &nbsp; @Test</div><div>&nbsp; &nbsp; public void CacheTest() throws Exception {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisService.setKey("111111","222222",100, TimeUnit.SECONDS);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisService.getKey("111111");</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; @Test</div><div>&nbsp; &nbsp; public void SaveObjectForCacheTest()throws Exception{</div><div>&nbsp; &nbsp; &nbsp; &nbsp; TargetDB targetDB=new TargetDB();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; targetDB.setDbType("111");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; targetDB.setPort("22");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; targetDB.setUserName("zzzlyr");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.opsForValue().set("key111",targetDB);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; TargetDB targetDB12= (TargetDB) redisTemplate.opsForValue().get("key111");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(targetDB12.toString());</div><div>&nbsp; &nbsp; }</div>&nbsp; &nbsp; &nbsp; @Test<div>&nbsp; &nbsp; public void SaveMapForCacheTest()throws Exception {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; TargetDB targetDB = new TargetDB();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; targetDB.setDbType("111");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; targetDB.setPort("22");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; targetDB.setUserName("zzzlyr");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; List&lt;TargetDB&gt; list = new LinkedList&lt;TargetDB&gt;();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; list.add(targetDB);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Map&lt;String, List&lt;TargetDB&gt;&gt; map = new LinkedHashMap&lt;String, List&lt;TargetDB&gt;&gt;();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; map.put("111111111111", list);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //向缓存中放入map</div><div>&nbsp; &nbsp; &nbsp; &nbsp; redisTemplate.opsForHash().putAll("zzzzz", map);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //从缓存中获取map</div><div>&nbsp; &nbsp; &nbsp; &nbsp; Map&lt;String, List&lt;TargetDB&gt;&gt; cacheMap = redisTemplate.opsForHash().entries("zzzzz");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //Map&lt;String,List&lt;String&gt;&gt; cacheMap= (Map&lt;String, List&lt;String&gt;&gt;) redisTemplate.opsForValue().get("platform-app_AppOperation");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(cacheMap.toString());</div><div>&nbsp; &nbsp; }</div><div></div><div>}</div></div></div><img src ="http://www.blogjava.net/zzzlyr/aggbug/432728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzzlyr/" target="_blank">为自己代言</a> 2017-08-07 17:38 <a href="http://www.blogjava.net/zzzlyr/articles/432728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring cloud eureka 使用问题</title><link>http://www.blogjava.net/zzzlyr/articles/432642.html</link><dc:creator>为自己代言</dc:creator><author>为自己代言</author><pubDate>Tue, 04 Jul 2017 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/zzzlyr/articles/432642.html</guid><wfw:comment>http://www.blogjava.net/zzzlyr/comments/432642.html</wfw:comment><comments>http://www.blogjava.net/zzzlyr/articles/432642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzzlyr/comments/commentRss/432642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzzlyr/services/trackbacks/432642.html</trackback:ping><description><![CDATA[
 

1: spring cloud eureka 如果出现某个应用实例 down(1), 说明 spring admin 健康检测没有通过导致 eureka 注册中心不会把这个实例从列表中删除掉。

   这样所有使用这个实例的服务都会现404（前提是在应用中配置过spring admin）；
   
2：spring admin 健康检测会检测*.properties里的所有连能性的配置(mysql,redis,短信服务，邮件服务)，如果这些URL中有一个不通，则会导致eureka中出现，
   这个实例down(1) 并且不会从列表中删除掉。

例：

  应用中不使用reides，但是在pom.xml中引用reides的配置（只限于spring-boot redis配置）

       <!--redis 配置
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		-->  
		
	这样spring admin 健康检测发现*.properties没配置redis,但是spring-boot-starter-data-redis 有默认配置(是localhost),
	会导致检测不通过，eureka 显示状态为 down(1).
	
处理这样问题可以使用：http://eureakIP:port/health	 如果没有问题会返回：{"description":"Spring Cloud Eureka Discovery Client","status":"UP"}

 如果有问题会返回那个实例的检测什么配置项没有通过，只要修改后重启应用实例，这样eureka应用会显示UP(1);  <img src ="http://www.blogjava.net/zzzlyr/aggbug/432642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzzlyr/" target="_blank">为自己代言</a> 2017-07-04 18:30 <a href="http://www.blogjava.net/zzzlyr/articles/432642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring boot 注解@Transactional事务类内调用不生效问题及解决办法</title><link>http://www.blogjava.net/zzzlyr/articles/432618.html</link><dc:creator>为自己代言</dc:creator><author>为自己代言</author><pubDate>Tue, 20 Jun 2017 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/zzzlyr/articles/432618.html</guid><wfw:comment>http://www.blogjava.net/zzzlyr/comments/432618.html</wfw:comment><comments>http://www.blogjava.net/zzzlyr/articles/432618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzzlyr/comments/commentRss/432618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzzlyr/services/trackbacks/432618.html</trackback:ping><description><![CDATA[<pre style="background-color: #ffffff; font-family: Menlo; font-size: 11.3pt;">1: Java注解@Transactional事务类内调用不生效问题及解决办法<br />在 Spring 的 AOP 代理下，只有目标方法由外部调用，目标方法才由 Spring 生成的代理对象来管理，这会造成自调用问题。<br />若同一类中的其他没有@Transactional 注解的方法内部调用有@Transactional 注解的方法，有@Transactional 注解的方法的事务被忽略，不会发生回滚<br /><br />2:场景问题：<br /><br />比如：一个class A类 中有三个方法 a(),b(),c(),d()<br />@Transactional<br />a();<br />@Transactional<br />b();<br /><br />@Transactional<br />c(){<br /> this.a();<br /> this.b();<br />}<br /><br />如果同一个类中：<br />@Transactional<br />d(){<br /> this.c();<br />}<br /><br />这样d() @Transactional 会失效，如果出现异常，事物不会回滚，原因是 @Transactional 使用了spring proxy 代理对象 会被AOP拦截，<br />this.c(),这样调用是本地对象调用，细心同学发现只有 最外层使用代理对象就可以使 @Transactional生效。<br /><br />解决方法：<br />1：最简单的一种在自己实现类中注入自己 例：<br />@Autowired<br />private Class  class;<br /><br />这样就可以走spring IOC 容器，出来就是proxy 对象;<br /><br />2:第二咱方式是通过AopContext.currentProxy()方式<br /><br />  增加maven依赖：<br />    &lt;dependency&gt;<br />      &lt;groupId&gt;org.aspectj&lt;/groupId&gt;<br />      &lt;artifactId&gt;aspectjweaver&lt;/artifactId&gt;<br />      &lt;version&gt;1.9.5&lt;/version&gt;<br />    &lt;/dependency&gt; 如果存在忽略这个<br /><br /> 如果是springboot工程在main 方法上增加 @EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = true)<br /> 例：<br /> @SpringBootApplication<br /> @EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = true)<br /> public class CommonComponentStartApplication {<br />   public static void main(String[] args) {<br />      SpringApplication.run(CommonComponentStartApplication.class, args);<br />   }<br /> }<br /><br /> 然后就可以在上面的例子中d()中这样使用：<br /> @Transactional<br /> d(){<br />  Class class= ((Class)AopContext.currentProxy());<br />  class.c();<br /> }<br /><br />3:第三种 是通过 applicationcontext  获取 bean<br /><br />总之这几种方法都是为了得到spring proxy对象,看个人喜好选择。</pre><img src ="http://www.blogjava.net/zzzlyr/aggbug/432618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzzlyr/" target="_blank">为自己代言</a> 2017-06-20 17:03 <a href="http://www.blogjava.net/zzzlyr/articles/432618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>