SpringCloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于SpringBoot构建
springcloud项目是由多个独立项目集合而成的,每个项目都是独立的,各自进行自己的迭代和版本发布。所以springcloud不方便使用版本号来管理,而是使用版本名。以避免和子项目版本号的冲突。
版本名的来源是伦敦的地铁站名,以字母排序。比如最早的Release版本为Angel,第二个Release版本为Brixton。。。
当一个版本的update积累的比较多或者解决了一个严重bug时,会发布一个ServiceRelease版本,简称SR,后面带的数字就是该大版本下的第一次发布。
F版本是基于springboot的2.0.x构建 ,之前的是基于springboot的1.5.x构建
目前最新版本是H 基于SpringBoot 2.2
常用的组件
| Netflix基础微服务框架 | |
|---|---|
| Eureka | 服务发现 |
| Ribbon | 客户端负载均衡 |
| Feign | 客户端接口调用 |
| Hystrix | 高性能 Java RPC 框架 |
| Zuul | 服务网关 |
| Config | 分布式配置 |
| 阿里巴巴相关开源组件 | |
|---|---|
| Nacos | 服务发现、配置管理和服务管理平台 |
| Sentinel | 流量控制、熔断降级、系统负载保护 |
| RocketMQ | 高性能、高吞吐量的分布式消息队列 |
| Dubbo | 高性能 Java RPC 框架 |
| Seata | 分布式事务 |
其中 Feign 和 Ribbon 是 Spring Cloud 的 Netflix 中提供的两个实现软负载均衡的组件,Ribbon 和 Feign 都是用于调用其他服务的,方式不同。Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建 http 请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。
微服务demo程序设计
学习spring cloud 首先要使不同项目之间相互调用接口,先在一个Maven 父项目中搭建两个子项目 “生产者”和”消费者”
父项目的pom.xml所需的springboot和springcloud依赖如下,都是目前最新版本
spring cloud使用Hoxton.RELEASE版本 alibaba使用2.2.0.RELEASE
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.RELEASE</spring-cloud.version><spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
“生产者”提供一个接口 让”消费者”来进行调用
“生产者”的接口
学习测试用代码非常简单,只返回一个对象
@GetMapping("/user/{id}")
public User getUser(@PathVariable Integer id) {
return new User(id.longValue(), new Date());
}
“消费者”的调用
spring提供了RestTemplate对象用于访问rest接口,在配置类中使用RestTemplateBuilder创建
@Bean
public RestTemplate getRestTemplate(RestTemplateBuilder builder){
return builder.build();
}
在controller层对”生产者”的接口进行调用
@Autowired
private RestTemplate restTemplate;
@GetMapping("/order/{id}")
public User getOrder(@PathVariable Integer id) {
//找提供者
return restTemplate.getForObject("http://localhost:7900/user/" + id, User.class);
}
现在,一个比较Low的服务接口调用就完成了,这样写的程序容错率较高 如果localhost:7900的服务挂掉整个项目就会出错,所以接下来就是spring cloud学习的核心了
