学习初衷
因为加了不少优秀的知识星球, 结交了更多的小伙伴, 加了更多的群, 每每在自我介绍的时候, 都说自己是 Android & Java 攻城狮.
然鹅, 有的小伙伴就来问了, 你是搞 Java 的, 那对 Spring 很熟悉咯? 哦, 大佬, Spring Cloud 搞的怎么样了呢? 我是微服务的开发, 期待和你一起交流...... 这样来交流的朋友, 我觉得自己很惭愧.
其实我是个中间件开发. 我目前的技术栈是基于 Netty,webSocket 在开发一款聊天服务器, 所以这些我并不会啊. 可是, 也确实一直在圈内听到微服务这个字眼, 知道很多公司已经在使用微服务用的很熟悉了, 我要是再跟不上, 那就真的得跪了. 所以, 给自己定了一个小目标, 必须开启微服务之旅, 哪怕只是练手.
微服务, 我来啦
小编参考的书籍是 [猿天地] 的号主, 尹吉欢撰写的《Spring Cloud 微服务》. 这里还得感谢 [明哥的江湖] 号主明哥的赠书, 也算是给我节省了买书的饭钱.
初次接触 Spring Cloud, 一看到各种版本, 刚开始有点懵逼. 给大家看下最新的 Spring Cloud 的版本是什么样子的.
这些版本名称的命名方式采用了伦敦地铁站的名称, 同时根据字母表的顺序来对应版本时间顺序. 比如最早的 Release 版本: Angel, 第二个 Release 版本: Brixton, 然后是 Camden,Dalston,Edgware,Finchley,Gerrnwich, 现在最新的快照版本是 Hoxton 了.
SNAPSHOT: 快照版本, 随时可能修改
SR:Service Release,SR1 表示第一个正式版本, 一般同时标注 GA:(GenerallyAvailable), 表示稳定版本.
所以小编在这里选择了最新的 Greenwich SR1 版本. 相对应的, Spring Boot 在官网里, 也会有介绍. Greenwich 对应的就是 2.1.x, 因为小编是初学, 所以也用了最新的版本, 2.1.5 Release. 版本选择很重要, 版本选择很重要, 版本选择很重要, 重要的事情说三遍, 版本选择如何, 决定你之后编程的路好不好走.
微服务踩坑之旅
因为选择了最新的版本, 很多资料也就不怎么存在了, 好在 Spring Cloud 2.x 版本通过搜索还是能找到一部分资料的, 而且多亏有尹大的在线帮助, 在学习的过程中也是避开了一部分困难.
这部分我叫他踩坑之旅, 就是因为在实践过程中, 遇到了不少问题, 都是一步一步调试过来的, 确实很艰辛. 想必也是大家比较想看的部分, 马上呈上来.
导入 Spring Boot 2.1.5 版本就开始报错了
在 pom.xml 文件的第一个行, 总是报 "Maven Configuration Problem,Unknwon", 很无语有木有, 你报错就报错呗, 还给我来了一个 unkown, 让我无从下手.
这次的答案, 是在 Stack Overflow 上找到了答案, 说明如下
照着这个步骤, 我所在的环境是解决了, 如果你有类似的报错, 以及还没有完美解决, 可以互相交流交流.
导入的 dependency 遇到 missing
这里有一类问题, 小编刚开始入门, 学习的是注册, 那就得用到 eureka 组件. 书中用的版本是 Dalston 版本, Sping boot 用了 1.5.x 的, 所以导入的依赖就是
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-eureka</artifactId>
- </dependency>
但是, 这个在升级的版本里就报错了, 硬是没找到依赖. 后面还有好几个需要用到 spring-cloud-starter-xxx 的地方, 都会报相同的错误. 比如
<artifactId>spring-cloud-starter-hystrix</artifactId>
也是如此. 遇到此类情况, 我们需要更换下地址, 得把 netflix 这个重要的加上, 加这个的原因, 不仅仅是为了升级, 我想也是 Netflix 公司为了更好的宣传自家的产品吧. 解决方案就是
- <artifactId>
- spring-cloud-starter-netflix-eureka-server
- </artifactId>
- <artifactId>
- spring-cloud-starter-netflix-hystrix
- </artifactId>
基于第二条, 也有例外的情形
原本以为这个套路很深, 都加 netflix 就搞定了, 但是遇到 feign 组件的是, 这个不奏效了, 摊手.
<artifactId>spring-cloud-starter-feign</artifactId>
加了 netflix 也不奏效, 好吧, 继续努力寻找答案去呗. 因为这里找的资料比较多了, 来源有点不清晰, 最后的结果就是将这个依赖改成如下即可
<artifactId>spring-cloud-starter-openfeign</artifactId>
eureka 开启验证, 登录的用户名和密码始终错误
eureka 开启验证之后, 需要在配置文件里把用户名和密码配置上去, 否则就会有默认的用户名 "user", 以及在控制台自动生成一串密码供我们登录.
小编刚开始的配置, 还是按照书上写的
用户名
security.user.name=xxx
密码
security.user.password=xxx
结果启动的时候, 看到控制台上还是生成了一串密码, 并且输入了自己在配置文件中的用户名和密码, 都是进不了注册后台的. 这个时候, 就彻底懵逼了, 代码也看不到错误, 配置文件错误的话, 也看不到啥信息, 如何是好.
最后, 小编在 CSDN 上找到一篇名为《security.basic.enabled 配置过时或不可用》的文章里, 看到了, 2.x 版本的属性配置, 是需要加前缀 spring 的, 也就是如下:
- spring.security.user.name=xxx
- spring.security.user.password=xxx
eureka 开启关闭认证方式
继续上一个问题的补充, 在开启验证的时候, 老版本是需要在配置文件里将 eureka 开关打开, 也就是用
security.basic.enabled=true
只不过当小编把值改成 false 的时候, 还是出现需要用户名和密码登录的验证框. 在没看上一篇的解决方案之前, 也确实有点不知所措, 后来看了 CSDN 的那篇解决方案下面就有了答案.
结合其他地方的资料, 总结起来就是: 旧版本的 Spring Security 的依赖是可以在配置文件内容直接通 security.basic.enabled 参数进行开启 basic 认证, 不过目前版本已经被废除, 既然这种方式不可行, 那我们就使用另外一种方式进行配置, 通过继承 WebSecurityConfigurerAdapter 安全配置类来完成开启认证权限
- @EnableWebSecurity
- static class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- http.csrf().disable().authorizeRequests()
- .anyRequest()
- .authenticated()
- .and()
- .httpBasic();
- }
- }
代码在编译阶段报错
这里小编遇到了两次, 解决方式都是同样的. 第一个是遇到 Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Lists.
在这里, 网上有朋友就说了, 如果在查阅完代码, 发现没有问题的时候, 那么有一种可能是你的此依赖包并没有下载完整. 记住这个重点哦, 小编就是因为第一次遇到的时候没在意, 第二次还碰到了.
- public Object errorApiHandler(HttpServletRequest request,boolean includeStackTrace) {
- RequestAttributes requestAttributes = new ServletRequestAttributes(request);
- Map<String, Object> attr = this.errorAttributes.getErrorAttributes((WebRequest)requestAttributes,includeStackTrace);
- ......
- }
- public Object errorApiHandler(HttpServletRequest request,boolean includeStackTrace) {
- WebRequest webRequest=new ServletWebRequest(request);
- Map<String, Object> attr = this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace);
- ......
- }
来源: https://www.cnblogs.com/dimple91/p/10942559.html