SpringCloud入门概述
- Spring的三大模块:SpringBoot(构建),Spring Cloud(协调),Spring Cloud Data Flow(连接)
SpringCloud是什么
- 分布式系统的简化版(官方介绍)
- SpringCloud基于SpringBoot提供了一整套微服务的解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于Netflix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件
- SpringCloud利用SpringBoot的开发便利性巧妙地简化了分布式系统的基础设施开发,SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线,全局所、决策精选、分布式会话等等,他们都可以用SpringBoot的开发风格做到一键启动和部署。
- ==一句话概括:SpringCloud是分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的几何体,俗称微服务全家桶==
SpringCloud和SpringBoot的关系
SpringBoot:专注于快速方便的开发单个个体微服务(关注微观)
SpringCloud:关注全局的微服务协调治理框架,将SpringBoot开发的一个个单体微服务组合并管理起来(关注宏观)
- ==SpringBoot可以离开SpringCloud独立使用,但是SpringCloud不可以离开SpringBoot,属于依赖关系==
Dubbo是怎么到SpringCloud的?哪些优缺点去技术选型
目前成熟都互联网架构(分布式+服务治理Dubbo)
对比
Dubbo | Spring | |
---|---|---|
服务注册中心 | Zookeeper | Spring Cloud Netfilx Eureka |
服务调用方式 | RPC | REST API |
服务监控 | Dubbo-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 |
最大区别:
- Spring Cloud抛弃了RPC通讯,采用基于HTTP的REST方式。Spring Cloud牺牲了服务调用的性能,但是同时也避免了原生RPC带来的问题。REST比RPC更为灵活,不存在代码级别的强依赖,在强调快速演化的微服务环境下,显然更合适。
- ==一句话:Dubbo像组装机,Spring Cloud像一体机==
- 社区的支持与力度:Dubbo曾经停运了5年,虽然重启了,但是对于技术发展的新需求,还是需要开发者自行去拓展,对于中小型公司,显然显得比较费时费力,也不一定有强大的实力去修改源码
####总结
- 解决的问题域不一样:Dubbo的定位是一款RPC框架,Spring Cloud的目标是微服务架构下的一站式解决方案
SpringCloud的参考资料
构建SpringCloud工程
概述:SpringCloud工程由一个父工程和若干个Module组成
==应该遵循的条件:约定 > 配置 > 编码==
RestTemplate类
介绍
RestTemplate是Spring提供的用于访问Rest服务的客户端模板工具集,提供了多种远程访问Http的方法
意义
在一些不涉及实现方法的模块中(消费者),只需要调用其他服务暴露出的接口即可满足的需求,使用RestTemplate类中的方法可以发出需要的HTTP请求并得到返回结果。(类似Ajax)
RestTemplate用法
RestTemplate restTemplate = new RestTemplate(); //url:请求地址 //requestMap:请求参数 //type.class:HTTP响应转换成的对象类型 restTemplate.getForObject(url,type.class); restTemplate.postForObject(url,requestMap,type.class);
构建父工程
- 创建一个Maven父工程并命名GAV
- 打包方式为==POM==
- 在pom.xml中定义各依赖的版本号(若Module中pom.xml的依赖没有指定版本号,则会根据父工程的版本号加入依赖)
- 加入通用的依赖和插件
构建Module
- 在父工程下新建Maven的Module,打包方式为jar
- 一般来时GAV中 GV随父工程,自己定义A即可
- 在该Module下pom.xml中加入其它需要的依赖
- 正常开发即可
- 完成后先clean一下Maven项目,然后再install提供给其它模块调用
添加其它Module的依赖方法
- 直接引用其GAV即可
<dependencies> <dependency> <groupId>com.lzl</groupId> <artifactId>microservice-api</artifactId> <version>${project.version}</version> </dependency> </dependencies>
配置该module下的yml
- 微服务需要独立的端口
- ==微服务最重要的是取名字!!!!一定要给微服务配置一个名字!这个名字就是这个微服务对外暴露的名字!==
- 配置该模块下的其它相关配置(如本例配置了mybatis)
server: port: 8001 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml type-aliases-package: com.XXX.entity mapper-locations: - classpath:mybatis/mapper/**/*.xml spring: application: name: microservicecloud-dept #为这个服务取名,非常重要!!!!! datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/cloudDB01 username: root password: 123456 dbcp2: min-idle: 5 #最小连接数 initial-size: 5 #初始化连接数 max-total: 10 #最大连接数 max-wait-millis: 200 #等待连接最长的超时时间
编写主启动类
- 记得主启动类放在根包下,com.xxx.xxx
package com.XXX; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Provider8001_APP { public static void main(String[] args) { SpringApplication.run(Provider8001_APP.class,args); } }
SpringCloud添加组件的基本套路
- 新增这个组件的maven坐标GAV
- 在启动类上面标注启动该组件(一般来说是@EnableXXXXX)
- 编写业务逻辑代码