Spring Cloud微服务初探

学习初衷

由于加了很多优秀的知识星球,结交了更多的小伙伴,加了更多的群,往往在自我介绍的时候,都说本身是Android & Java攻城狮。java

然鹅,有的小伙伴就来问了,你是搞Java的,那对Spring很熟悉咯?哦,大佬,Spring Cloud搞的怎么样了呢?我是微服务的开发,期待和你一块儿交流......这样来交流的朋友,我以为本身很惭愧。web

其实我是个中间件开发。我目前的技术栈是基于Netty、WebSocket在开发一款聊天服务器,因此这些我并不会啊。但是,也确实一直在圈内听到微服务这个字眼,知道不少公司已经在使用微服务用的很熟悉了,我要是再跟不上,那就真的得跪了。因此,给本身定了一个小目标,必须开启微服务之旅,哪怕只是练手。spring

微服务,我来啦

小编参考的书籍是【猿天地】的号主,尹吉欢撰写的《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版本选择很重要,版本选择很重要,版本选择很重要,重要的事情说三遍,版本选择如何,决定你以后编程的路好很差走。maven

微服务踩坑之旅

由于选择了最新的版本,不少资料也就不怎么存在了,好在Spring Cloud 2.x版本经过搜索仍是能找到一部分资料的,并且多亏有尹大的在线帮助,在学习的过程当中也是避开了一部分困难。ide

这部分我叫他踩坑之旅,就是由于在实践过程当中,遇到了很多问题,都是一步一步调试过来的,确实很艰辛。想必也是你们比较想看的部分,立刻呈上来。微服务

  1. 导入Spring Boot 2.1.5 版本就开始报错了

在pom.xml文件的第一个行,老是报“Maven Configuration Problem,Unknwon”,很无语有木有,你报错就报错呗,还给我来了一个unkown,让我无从下手。

此次的答案,是在Stackoverflow上找到了答案,说明以下

照着这个步骤,我所在的环境是解决了,若是你有相似的报错,以及尚未完美解决,能够互相交流交流。

  1. 导入的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>
  1. 基于第二条,也有例外的情形

本来觉得这个套路很深,都加netflix就搞定了,可是遇到feign组件的是,这个不奏效了,摊手。

<artifactId>spring-cloud-starter-feign</artifactId>

加了netflix也不奏效,好吧,继续努力寻找答案去呗。由于这里找的资料比较多了,来源有点不清晰,最后的结果就是将这个依赖改为以下便可

<artifactId>spring-cloud-starter-openfeign</artifactId>
  1. 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
  1. 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();
        }
    }
  1. 代码在编译阶段报错

这里小编遇到了两次,解决方式都是一样的。第一个是遇到Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Lists
在这里,网上有朋友就说了,若是在查阅完代码,发现没有问题的时候,那么有一种多是你的此依赖包并无下载完整。记住这个重点哦,小编就是由于第一次遇到的时候没在乎,第二次还碰到了。

第一次出现的时候,小编直接看到就去删了maven的依赖,在这个错误下删除的路径是“/repository/com/google/guava/guava” ,而后就能够编译成功,并执行完成了。到第二次,我居然又踩坑。

第二次的错误是一堆堆栈报错

看到小编划的红线了没,其实这个时候,已经很明确告诉咱们是没找到包下的类,可是小编一开始并无仔细看这个错,而是去搜索引擎上查找答案。此次遇到麻烦了,全网就一篇相似的文章,还各类中文简体、繁体、英文大肆的写,可能对当时的场景有用,对咱们这个场景没啥帮助。

此次,由于没有仔细吸收上次的教训,小编花了3小时来排查问题,等到夜深人静的时候,小编又在报错看了又看,看了又看,把眼泪都看出来了。好的,最终决定去删除一下依赖包。

就在小编没报任何但愿的时候,代码居然过了,跑的不亦乐乎。写程序的你,能感觉到那份兴奋吧。噢,若是你是大拿,那可能不会这么强烈,不过我是达到高潮了,这个必须高潮。在此以前,小编在知识星球上求助了,贴子刚发完,没想到啊没想到,看来有时候不逼本身一把,还真不知道本身潜力有多少。

  1. Feign整合Hystrix又有错

错误真的是一环扣一环,每次学习完这个组件,立刻进入下一个组件,开始功能整合的时候,Bug老是不停地向你招手,招手,要是小姐姐也就算了,惋惜她不是呀。

在微服务架构中,Hystrix除了实现容错外,还提供了实时监控功能。在服务调用时,Hystrix会实时累积关于HystrixCommand的执行信息,好比每秒的请求数、成功数等。

当你启动了Hystrix,而且输入http://localhost:8082/hystrix.stream这个地址的时候,本来咱们指望看到的结果是能在页面中看到"ping"请求,以及请求的""data"数据,可是此次小编并无看到。

看过前面遇到的这么多错,想必你也知道,这是由于新版本引发了的吧。这个还好说,把地址改为http://localhost:8082/actuator/hystrix.stream,
Actuator 2.x 之后endpoints所有在/actuator下,能够经过management.endpoints.web.base-path修改)

management.endpoints.web.exposure.include=*
  1. 拦路虎再次出现,此次是Zuul

这本书的第一阶段就快学完了,小编甚是兴奋。本觉得到最后了,该解决的问题基本都差很少了,该遇到的问题基本上也都遇到过了,呵呵,太年轻。

Zuul在自定义异常上换包名了。其中其中的ErrorAttributes,ErrorController,DefaultErrorAttributes在SpringBoot 2.x的时候都转到org.springframework.boot.web.servlet.error包中,本来是在org.springframework.boot.autoconfigure.web上的。

因此,原先使用的

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);
    ......
}

小结

至此,在学完《Spring Cloud微服务》的准备篇和基础篇以后,小编算是见识到了微服务的厉害。

也由于小编选择了新版本,有部分问题出现的时候并不能第一时间在网上找到解决方案,这就让本身对微服务的研究更加深刻。其实一开始,小编连版本都不知道怎么选,都不知道刚开始接触的时候,是哪来的自信。

微服务社区如今已经很强大了,小编在找资料的过程当中,不少疑问都是经过Netflix在GitHub上的issue找到的答案,还有尹大的GitHub上也给了我很大的帮助。这些都是宝贵的经验所在。以及尹大的【猿天地】知识星球,在那里提出问题,尹大说了,我就是在最专业的星球里,让我不能畏首畏尾,尽管放马过去。

除了须要好好使用搜索引擎以外,小编最大的感触就是要看官方文档,看官方文档,看官方文档,不少文章确定也是根据官方文档得出的答案,在使用过程当中,小编有部分问题也是在那里解决的。此次学习,单独整理了一个微服务的书签,天天看着里面的数量在增长,问题在减小,帮我一步步完成了小白到入门的进化,非常欣慰。

学习是艰辛的,尤为是遇到困扰了3小时的问题,还束手无策的时候,都想过放弃。可是,放弃了,我就不能在其余地方更好地给本身贴上Java开发的标签了,也不能更好地和朋友们作技术交流。想到这里,我就会去泡杯咖啡,洗把脸,继续回来努力着,坚持着,奋斗着,或许这就是技术的魅力所在吧。

爱生活,爱学习,爱感悟,爱挨踢

相关文章
相关标签/搜索