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 分布式事务

其中 FeignRibbonSpring CloudNetflix 中提供的两个实现软负载均衡的组件,Ribbon 和 Feign 都是用于调用其他服务的,方式不同。Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建 http 请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。

微服务demo程序设计

学习spring cloud 首先要使不同项目之间相互调用接口,先在一个Maven 父项目中搭建两个子项目 “生产者”和”消费者”

父项目的pom.xml所需的springboot和springcloud依赖如下,都是目前最新版本

spring cloud使用Hoxton.RELEASE版本 alibaba使用2.2.0.RELEASE

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.2.2.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <properties>
  8. <java.version>1.8</java.version>
  9. <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
  10. <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
  11. </properties>
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-dependencies</artifactId>
  17. <version>${spring-cloud.version}</version>
  18. <type>pom</type>
  19. <scope>import</scope>
  20. </dependency>
  21. <dependency>
  22. <groupId>com.alibaba.cloud</groupId>
  23. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  24. <version>${spring-cloud-alibaba.version}</version>
  25. <type>pom</type>
  26. <scope>import</scope>
  27. </dependency>
  28. </dependencies>
  29. </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学习的核心了