SpringCloud 学习
1.什么是微服务架构
微服务架构是一种架构模式或者架构风格,它提倡将单一应用程序分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调,配合,为用户提供最终价值。
2.什么是SpringCloud
SpringCloud 就是分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的集合体,俗称为服务全家桶
3.SpringCloud 和 SpringBoot 是什么关系
SpringBoot:专注于快速方便的开发单个个体微服务
SpringCloud:是关注全局的微服务协调整理治理框架,它将 SpringBoot 开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,管理配置、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务
SpringBoot 可以离开 SpringCloud 独立使用开发项目,但是 SpringCloud 离不开 SpringBoot,属于依赖关系。
总的来说,SpringBoot 专注于快速、方便的开发单个微服务个体,SpringCloud 关注全局的服务治理框架
4.SpringCloud 和 Dubbo 有什么区别?
在通讯机制方面:
Dubbo 是通过 RPC 远程过程调用
SpringCloud 是通过基于 HTTP 的 RESTful api
在自身技术方面:
Dubbo 就是像组装机,使用的基本都是第三方。选择的自由度很高,但是出问题的可能性也会随之提高。
SpringCloud 就像是买的一体机,一整套都是自己的。在 Spring Source 的整合下,做了大量的稳定性测试,使其拥有更高的稳定性。
具体见表:
Dubbo Spring Cloud 服务注册中心 Zookeeper Spring Cloud Netflix Eureka 服务调用方式 RPC REST API 服务监控 Duboo-monitor Spring Boot Admin 断路器 不完善 Spring Cloud Netflix Hystrix 服务网关 无 Spring Cloud Netflix Zuul 分布式配置 无 Spring Cloud Config 服务跟踪 无 Spring Cloud Sleuth 消息总线 无 Spring Cloud Bus 数据流 无 Spring Cloud Stream 批量任务 无 Spring Cloud Task …… …… ……
开发参考文档地址:
中文版API:https://www.springcloud.cc/spring-cloud-dalston.html
springcloud中国社区:http://springcloud.cn/
springcloud中文网:https://www.springcloud.cc/
至此,理论概念部分完成,接下来就是代码案例的编写了。
5.代码案例
1)Rest微服务案例-父工程构建
首先,在working set 中新建一个maven porject。
Artifact Id:父工程的名字
Packaging:pom
2)pom文件编写
1 |
*框架搭建过程中发生的问题与解决方式
1) 启动报错
java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver
关于这个报错信息我也百度了好久,说什么的都有,基本说的都是依赖版本问题,我也是一顿调整问题,后来将光标移动到了启动类的 @SpringBootApplication 注解上发现 spring-boot-autoconfigure 的版本为 1.5.X。因为我的父级 pom 中定义了 springboot starter 的版本为 2.4.5 所以意识到不对了。后来手动引入 spring-boot-autoconfigure 解决这个问题
1
2
3
4
5<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${springboot.stater.version}</version>
</dependency>
2)扫描不到mapper接口
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
这个报错产生的原因很多,列出我知道的几种
- mybatisPlusConfig 配置文件类上是否加入了 @MapperScan(”mapper路径“) 注解
- yml.xml 配置文件中 的 mapper.xml 文件扫描路径配置是否正确
- mapper.xml 文件存放路径是否正确,spring boot 默认是不会将 java 文件夹下的非java文件打包。所以如果mapper.xml文件应该放在 resource 静态资源路径下,如果放在 java文件夹下,则需要在 pom 中配置 resources 将xml打包
- idea 开发工具项目文件路径问题,idea是会隐藏空文件夹的,例如有的时候我们在resource 下创建了 mybatis.mapper 用来存放 mapper.xml 文件。这个时候的 mybatis.mapper 文件夹在 idea 中你可能认为他是两个文件夹,但是如果你在系统中找到这个文件夹,这个文件夹可能并不是在 mybatis 文件中还有一个 mapper 文件夹,而是有一个叫 mybatis.mapper 的文件夹。这个真的要注意。
*我这里就是犯了最后一个错误,我怎么也没想到 idea 的这个问题,他创建多级空目录会有这个问题,我知道,但是就没有往这边想,为此我付出了 5 个小时的代价。特此记录,引以为戒
3)swagger 3.0版本注意事项
本来小编用的是 swagger2 的版本,结果因为搭建项目框架,有的依赖有问题,切换了 swagger 的版本为:3.0.0.。切换之后服务可以正常启动,但是访问不了 swagger 的页面了。*(访问地址:swagger-ui.html)*
解决:
swagger3.0 需要在 pom 中添加以下依赖:
1
2
3
4
5<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>需要在启动类增加 @EnableOpenApi 注解
访问地址变为:xxx/swagger-ui/index.html
4)Erueka 报错
启动报错:spring cloud erueka com.google.gson.GsonBuilder:
升级 gson 的版本即可
访问eureka 中服务的info–》/actuator/info 404 问题
修改父工程pom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<build>
<finalName>springCloud</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven.resources.version}</version>
<configuration>
<delimiters>
<!--这里使用与匹配yml中的配置,需要注意有的版本这里用的是<delimit>标签-->
<delimiter>$</delimiter>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>修改子工程yml配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25eureka:
# 客户端注册进eureka服务列表内
client:
service-url:
# 对应eureka服务端的defaultZone
defaultZone: http://localhost:7001/eureka
# 实例配置
instance:
# 实例id,eureka 中实例名称,status显示的名称
instance-id: ProViderDept8001
# 配置访问路径可以显示ip地址
prefer-ip-address: true
info:
app.name: springCloud
company.name: www.sy.com
build.artifactId: $project.artifactId$
build.version: $project.version$
#此处配置用于开发eureka 的actuator/info 信息使用
management:
endpoints:
web:
exposure:
# 开放所有
include: "*"