博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了
阅读量:2401 次
发布时间:2019-05-10

本文共 5837 字,大约阅读时间需要 19 分钟。

阿里妹导读:一年多前,Java 界最近发生了一件大事,阿里开源 Spring Cloud Alibaba,并推出首个预览版。Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架,而 Spring Cloud Alibaba 的开源为开发者们提供了这套规范的实现方式。同时,Spring Cloud Alibaba 提供的完整的微服务组件、中文文档和本地化的开源服务提高了开发者们接入微服务的速率,并降低了后续的运维难度。

经过一年多的孵化,Spring Cloud Alibaba 作为 Spring 社区的唯一一个国产开源项目,正式从 Spring Cloud Incubator 孵化器毕业,并发布了适配 Spring Cloud Edgware、Finchley、Greenwich 三个版本的新版本。

Spring Cloud Alibaba 是 Spring 社区第一个也是唯一一个国产开源项目。

330ab93336afaf042d749fc29ade912948d.jpg

Spring Cloud Alibaba 毕业后从孵化器仓库迁移到了 Github Alibaba 仓库下,新的仓库地址点击。 新的 maven 坐标如下:

com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import

Spring Cloud Alibaba 各版本兼容表:

76986a3604fdcb797dc6d4de82d7bd59c1a.jpg

Spring Cloud Alibaba 介绍

Spring Cloud 是 Spring 社区打造出的一款基于 Spring Boot 用于快速构建分布式系统的框架,主要包括以下特性:

29864a9e5d8687c37294904ff686d5dd877.jpg

Spring Cloud Alibaba 是阿里巴巴开源中间件跟 Spring Cloud 体系的融合:

5bc4727b599a26a910e487727d7ec09f3a9.jpg

作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能:

a2ac121da5ac739cde5b30ed7289bd9e4dc.jpg

Spring Cloud Alibaba 功能

总体架构

依托 Spring Cloud Alibaba,只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

72dc71bca8f34f7267ceab67ab01bfa5f77.jpg

服务注册 & 配置管理

服务注册 & 配置管理是微服务应用中必不可少的两大基础功能。

Spring Cloud Alibaba 基于 Nacos 提供 spring-cloud-alibaba-starter-nacos-discovery & spring-cloud-alibaba-starter-nacos-config 实现了服务注册 & 配置管理功能。

依靠 @EnableDiscoveryClient 进行服务的注册,兼容 RestTemplate & OpenFeign 的客户端进行服务调用。

OpenFeign 客户端:

@FeignClient(name = "echo-service")public interface EchoService {  @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)  String echo(@PathVariable("str") String str);}

RestTemplate 客户端:

@LoadBalanced@Beanpublic RestTemplate restTemplate1() {  return new RestTemplate();}....restTemplate.getForObject("http://echo-service/echo/hello-spring-cloud-alibaba",        String.class);

配置管理直接以约定俗成的方式构造 dataId & Group 从 Nacos 读取配置设置到 Spring Environment 中即可。

流控降级

流控降级是微服务稳定性的法宝,用于解决各种不稳定的场景可能会导致的严重后果。

在限流层面:我们根据系统的处理能力对流量进行控制,在保证系统吞吐量比较高的同时又不会把系统打垮。

在降级层面:在服务出现不稳定因素的时候暂时切断服务的调用,等待一段时间再进行尝试。一方面防止给不稳定服务“雪上加霜”,另一方面保护服务的调用方不被拖垮。

Spring Cloud Alibaba 基于 Sentinel 提供 spring-cloud-alibaba-starter-sentinel 对 Spring 体系内基本所有的客户端,网关进行了适配,包括了 WebServlet, WebFlux, RestTemplate, OpenFeign, Netflix Zuul, Spring Cloud Gateway。

只需引入 starter,即可对这些组件生效。只需定义规则进行流控降级:

限流规则:

ae3d3b6addbbdb4c6308c79819176339ece.jpg

降级规则:

2771ee7486cc42ebbb01d4431e0314ad6b5.jpg

服务调用

Spring Cloud 默认的服务调用依赖 OpenFeign 或 RestTemplate 使用 REST 进行调用。

Spring Cloud Alibaba Dubbo 只需使用 @DubboTransported 注解即可将底层的 Rest 协议无缝切换成 Dubbo RPC 协议,进行 RPC 调用。这一举措让 Spring Cloud 的客户端调用多了一个新的 RPC 选择:

@Bean@LoadBalanced@DubboTransportedpublic RestTemplate restTemplate() {  return new RestTemplate();}@FeignClient("dubbo-provider")@DubboTransported(protocol = "dubbo")public interface DubboFeignRestService {  @GetMapping(value = "/param")  String param(@RequestParam("param") String param);  @PostMapping("/saveB")  String saveB(@RequestParam("a") int a, @RequestParam("b") String b);}

分布式消息 & 消息总线

基于 Spring Cloud Stream 提供 Binder 的新实现: Spring Cloud Stream RocketMQ Binder,也新增了 Spring Cloud Bus 消息总线的新实现 Spring Cloud Bus RocketMQ。

Spring Cloud Stream 对消息的编程模型进行了统一封装,用同一套代码进行消息的发送/接收,屏蔽底层消息中间件的实现细节,让我们在关注点放到业务逻辑上。如果想要更换底层消息中间件,直接引入 Binder 的新实现即可,代码层面几乎无需修改。这是一段使用 Spring Cloud Stream RocketMQ & Spring Cloud Function 完成消息的接收,并转换成大写 & 添加 alibaba- 前缀的新消息,再发送给新的 topic 的过程:

spring.cloud.stream.bindings.input.destination=test-topicspring.cloud.stream.bindings.input.group=test-group1spring.cloud.stream.bindings.output.destination=test-topic-uppercasespring.cloud.stream.function.definition=uppercase|addprefix
@SpringBootApplication@EnableBinding(Processor.class)public class FunctionApplication {  public static void main(String[] args) {    new SpringApplicationBuilder(FunctionApplication.class)        .web(WebApplicationType.NONE).run(args);  }    @Bean    public Function
uppercase() { return x -> x.toUpperCase(); } @Bean public Function
addprefix() { return x -> "alibaba-" + x; }}

分布式事务

Seata 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题。

在 Spring Cloud 这一层面,我们通过在微服务中传递事务上下文的方式完成了 Seata 在 Spring Cloud 层面的接入:

  • Spring MVC 环境下支持自动还原 Seata 事务上下文
  • 支持服务调用者通过 RestTemplate 或 FeignClient 调用时,自动传递 Seata 事务上下文
  • 支持 FeignClient 和 Hystrix、Sentinel 同时使用的场景
    这是一段使用 Spring Cloud Alibaba Seata 完成 storage 和 order 服务进行数据存储的分布式事务代码:
@GlobalTransactional(timeoutMills = 300000, name = "spring-cloud-demo-tx")@RequestMapping(value = "/seata/rest", method = RequestMethod.GET, produces = "application/json")public String rest() {  // 调用 storage 服务。涉及数据库操作  String result = restTemplate.getForObject(      "http://127.0.0.1:18082/storage/" + COMMODITY_CODE + "/" + ORDER_COUNT,      String.class);  if (!SUCCESS.equals(result)) {    throw new RuntimeException();  }  String url = "http://127.0.0.1:18083/order";  HttpHeaders headers = new HttpHeaders();  headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);  MultiValueMap
map = new LinkedMultiValueMap
(); map.add("userId", USER_ID); map.add("commodityCode", COMMODITY_CODE); map.add("orderCount", ORDER_COUNT + ""); HttpEntity
> request = new HttpEntity
>( map, headers); // 调用 order 服务。涉及数据库操作 ResponseEntity
response = restTemplate.postForEntity(url, request, String.class); result = response.getBody(); if (!SUCCESS.equals(result)) { throw new RuntimeException(); } return SUCCESS;}

Roadmap

Spring Boot Admin 是一个开源社区项目,用于管理和监控 SpringBoot 应用程序。但是它没有跟 Spring Cloud 做深度的整合。我们希望做一个 Spring Cloud Admin,它能提供如下功能:

  • 增加服务治理控制台,整合微服务控制能力
  • 服务查询、管理
  • 配置管理
  • 限流降级等
  • 项目管理/监控
  • 参考 Spring Cloud Azure Playground  ,创造 Spring Cloud Alibaba Playground,把一些最佳实践,视频教程,自动生成项目等功能放上去
  • 增加 Spring Cloud Alibaba 最佳实践项目
  • 针对 Spring Cloud Alibaba 各种特性,开发对应的实战 Demo
  • 替换 Spring Cloud 服务调用客户端 OpenFeign & Ribbon。开发更通用的服务调用客户端,替换 Spring Cloud 服务- - 调- 用客户端 OpenFeign & Ribbon

本文为云栖社区原创内容,未经允许不得转载。

转载于:https://my.oschina.net/u/1464083/blog/3099665

你可能感兴趣的文章
Greenplum集群部署小记
查看>>
通过java画文本格式的统计图
查看>>
MySQL存储过程的权限问题
查看>>
大分区表的手工并行优化
查看>>
运维工作中几点深刻的经验和教训
查看>>
本周搞几件事情,说说你的计划吧
查看>>
在oracle实践学习位运算 第一篇
查看>>
通过sql语句分析足彩
查看>>
生产环境sql语句调优实战第七篇
查看>>
一个oracle查询引起的bug
查看>>
通过shell来比较oracle和java中的字符串使用
查看>>
关于纠结的recycle pool的设置
查看>>
清华梦的粉碎读后感--论理想主义者王垠
查看>>
生活中的优化和向往(r11笔记第72天)
查看>>
最近的几个技术问题总结和答疑(七)
查看>>
容灾切换中的数据库宕机问题简单分析(一)
查看>>
几年前的一次答疑解惑
查看>>
MySQL RR隔离级别的更新冲突策略
查看>>
MySQL索引条件下推的简单测试
查看>>
通过SQL解读财富的分配(二)
查看>>